--- a/src/http/handlers.ts +++ b/src/http/handlers.ts @@ -59,10 +59,7 @@ export function courtAvailability(deps: AppDependencies): Handler { return ({ res, url, params }) => { const courtId = Number(params.id); - const date = url.searchParams.get('date'); - if (!isValidDate(date)) { - throw new HttpError(400, 'INVALID_DATE', 'Indiquen la fecha con el formato AAAA-MM-DD (?date=2026-03-14).'); - } + const date = requireDate(url); const taken = deps.service.bookingsForCourt(courtId, date).filter((b) => b.status === 'confirmed'); const slots = []; for (let hour = OPENING_HOUR; hour < CLOSING_HOUR; hour++) { @@ -155,15 +152,22 @@ // 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 }) => { - const date = url.searchParams.get('date'); - if (!isValidDate(date)) { - throw new HttpError(400, 'INVALID_DATE', 'Indiquen la fecha con el formato AAAA-MM-DD (?date=2026-03-14).'); - } + const date = requireDate(url); const bookings = deps.service.bookingsOn(date).map(toBookingJson); sendJson(res, 200, dailySummary(date, deps.service.listCourts(), bookings)); }; } +// La fecha de la consulta (?date=AAAA-MM-DD): la piden la disponibilidad y la +// caja del día. +function requireDate(url: URL): string { + const date = url.searchParams.get('date'); + if (!isValidDate(date)) { + throw new HttpError(400, 'INVALID_DATE', 'Indiquen la fecha con el formato AAAA-MM-DD (?date=2026-03-14).'); + } + return date; +} + // Revisa la forma del cuerpo; las reglas del negocio se revisan después. function parseBookingRequest(body: unknown): BookingRequest { if (typeof body !== 'object' || body === null || Array.isArray(body)) {