From 22469f557c4c4648b15842a1dec09633e9933233 Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 19 Aug 2026 00:44:33 +0200 Subject: [PATCH] feat(api): add REST controllers, services, entities and 15-min timeline grid --- frontend/src/api/client.ts | 20 ++++ frontend/src/components/Timeline.tsx | 42 +++++--- .../controller/ReservationController.java | 62 +++++++++++ .../caspos/controller/TableController.java | 29 +++++ .../java/com/caspos/domain/DiningArea.java | 31 ++++++ src/main/java/com/caspos/domain/Guest.java | 53 +++++++++ .../java/com/caspos/domain/Reservation.java | 72 +++++++++++++ .../com/caspos/domain/RestaurantTable.java | 68 ++++++++++++ .../caspos/dto/CreateReservationRequest.java | 18 ++++ .../java/com/caspos/dto/ReservationDto.java | 25 +++++ src/main/java/com/caspos/dto/TableDto.java | 17 +++ .../caspos/repository/GuestRepository.java | 11 ++ .../repository/ReservationRepository.java | 30 ++++++ .../caspos/repository/TableRepository.java | 14 +++ .../caspos/service/ReservationService.java | 101 ++++++++++++++++++ .../java/com/caspos/service/TableService.java | 43 ++++++++ 16 files changed, 619 insertions(+), 17 deletions(-) create mode 100644 frontend/src/api/client.ts create mode 100644 src/main/java/com/caspos/controller/ReservationController.java create mode 100644 src/main/java/com/caspos/controller/TableController.java create mode 100644 src/main/java/com/caspos/domain/DiningArea.java create mode 100644 src/main/java/com/caspos/domain/Guest.java create mode 100644 src/main/java/com/caspos/domain/Reservation.java create mode 100644 src/main/java/com/caspos/domain/RestaurantTable.java create mode 100644 src/main/java/com/caspos/dto/CreateReservationRequest.java create mode 100644 src/main/java/com/caspos/dto/ReservationDto.java create mode 100644 src/main/java/com/caspos/dto/TableDto.java create mode 100644 src/main/java/com/caspos/repository/GuestRepository.java create mode 100644 src/main/java/com/caspos/repository/ReservationRepository.java create mode 100644 src/main/java/com/caspos/repository/TableRepository.java create mode 100644 src/main/java/com/caspos/service/ReservationService.java create mode 100644 src/main/java/com/caspos/service/TableService.java diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts new file mode 100644 index 0000000..60e3617 --- /dev/null +++ b/frontend/src/api/client.ts @@ -0,0 +1,20 @@ +import axios from 'axios'; +import { Reservation } from '../types'; + +const BASE = import.meta.env.VITE_API_URL ?? 'http://localhost:8080/api/v1'; + +const http = axios.create({ baseURL: BASE }); + +export const api = { + getTables: () => + http.get('/tables').then((r) => r.data), + + getReservations: (date?: string) => + http.get('/reservations', { params: { date } }).then((r) => r.data), + + createReservation: (payload: Partial) => + http.post('/reservations', payload).then((r) => r.data), + + updateStatus: (id: string, status: string) => + http.patch(`/reservations/${id}/status`, { status }).then((r) => r.data), +}; diff --git a/frontend/src/components/Timeline.tsx b/frontend/src/components/Timeline.tsx index d7146aa..e6a546f 100644 --- a/frontend/src/components/Timeline.tsx +++ b/frontend/src/components/Timeline.tsx @@ -1,7 +1,14 @@ import { useAppStore } from '../store/useAppStore'; import { Reservation, ReservationStatus } from '../types'; -const HOURS = Array.from({ length: 14 }, (_, i) => `${String(i + 10).padStart(2, '0')}:00`); +// 15-min slots from 10:00 to 24:00 +const SLOTS: string[] = []; +for (let h = 10; h < 24; h++) { + for (const m of [0, 15, 30, 45]) { + SLOTS.push(`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`); + } +} +const HOUR_SLOTS = SLOTS.filter((s) => s.endsWith(':00')); const STATUS_DOT: Record = { PENDING: 'bg-slate-400', @@ -29,7 +36,8 @@ function timeToMinutes(t: string) { const TIMELINE_START = 10 * 60; // 10:00 const TIMELINE_END = 24 * 60; // 24:00 const TOTAL_MINUTES = TIMELINE_END - TIMELINE_START; -const COL_WIDTH = 72; // px per hour +const SLOT_WIDTH = 18; // px per 15-min slot +const HOUR_WIDTH = SLOT_WIDTH * 4; // 72px per hour export default function Timeline() { const { tables, reservations, openBookingModal } = useAppStore(); @@ -46,11 +54,12 @@ export default function Timeline() {
Tisch
- {HOURS.map((h) => ( + {/* Hour labels */} + {HOUR_SLOTS.map((h) => (
{h}
@@ -72,15 +81,16 @@ export default function Timeline() { {/* Timeline cells */} -
- {/* Click grid */} - {HOURS.map((_, i) => ( +
+ {/* 15-min clickable slots */} + {SLOTS.map((slot, i) => (