Ilustración escrita para la clase de la semana 7: un cambio como los que suele proponer un agente. No es la salida de ninguna herramienta. Para listar las reservas de una cancha, el handler recibe la conexión y arma su propio repositorio. diff --git a/src/http/handlers.ts b/src/http/handlers.ts index 4f1354a..0724cf3 100644 --- a/src/http/handlers.ts +++ b/src/http/handlers.ts @@ -1,3 +1,4 @@ +import type { DatabaseSync } from 'node:sqlite'; import { CLOSING_HOUR, OPENING_HOUR, @@ -15,7 +16,7 @@ import { quotePriceCents } from '../domain/pricing.ts'; import { dailySummary } from '../domain/report.ts'; import type { Notifier } from '../notifications/notifier.ts'; import type { BookingService } from '../services/booking-service.ts'; -import type { BookingRow } from '../store/booking-repository.ts'; +import { BookingRepository, type BookingRow } from '../store/booking-repository.ts'; import { HttpError, readJson, sendJson } from './json.ts'; import type { Handler } from './router.ts'; @@ -23,6 +24,7 @@ export type AppDependencies = { service: BookingService; clock: Clock; notifier: Notifier; + db: DatabaseSync; }; export function toBookingJson(row: BookingRow): Booking { @@ -152,6 +154,15 @@ export function memberBookings(deps: AppDependencies): Handler { }; } +// GET /api/courts/:id/bookings?date=YYYY-MM-DD: las reservas de una cancha. +export function courtBookings(deps: AppDependencies): Handler { + return ({ res, url, params }) => { + const date = url.searchParams.get('date') ?? ''; + const rows = new BookingRepository(deps.db).listByCourtAndDate(Number(params.id), date); + sendJson(res, 200, rows.map(toBookingJson)); + }; +} + // GET /api/reports/daily?date=YYYY-MM-DD: la caja del día, para la administración. export function dailyReport(deps: AppDependencies): Handler { return ({ res, url }) => { diff --git a/src/http/server.ts b/src/http/server.ts index 251064b..9626688 100644 --- a/src/http/server.ts +++ b/src/http/server.ts @@ -6,6 +6,7 @@ import { BookingService } from '../services/booking-service.ts'; import { cancelBooking, courtAvailability, + courtBookings, createBooking, dailyReport, listCourts, @@ -28,6 +29,7 @@ export function buildRouter(deps: AppDependencies): Router { const router = new Router(); router.get('/api/courts', listCourts(deps)); router.get('/api/courts/:id/availability', courtAvailability(deps)); + router.get('/api/courts/:id/bookings', courtBookings(deps)); router.get('/api/members', listMembers(deps)); router.get('/api/members/:id/bookings', memberBookings(deps)); router.post('/api/bookings', createBooking(deps)); @@ -41,6 +43,7 @@ export function createServer(options: ServerOptions): http.Server { service: new BookingService(options.db), clock: options.clock ?? systemClock, notifier: options.notifier ?? consoleNotifier, + db: options.db, }; const log = options.log ?? console.log; const router = buildRouter(deps);