import { initContract } from '@ts-rest/core'; import { z } from 'zod'; import { errorResponseSchema, paginationQuerySchema, paginationResponseSchema } from '../schemas/common.schemas'; const c = initContract(); export const reservationSchema = z.object({ id: z.string().uuid(), quantity: z.number(), status: z.enum(['pending', 'fulfilled', 'cancelled', 'expired']), expiresAt: z.coerce.date(), productId: z.string().uuid(), customerId: z.string().uuid().nullable(), createdAt: z.coerce.date(), updatedAt: z.coerce.date(), }); export type ShopReservationDto = z.infer; export const shopkeeperReservationsContract = c.router({ listReservations: { method: 'GET', path: '/shopkeeper/reservations', query: z .object({ status: z.enum(['pending', 'fulfilled', 'cancelled', 'expired']).optional(), }) .merge(paginationQuerySchema), responses: { 200: z.object({ reservations: z.array(reservationSchema), pagination: paginationResponseSchema, }), 401: errorResponseSchema, }, summary: 'List reservations for the shop', }, createReservation: { method: 'POST', path: '/shopkeeper/reservations', body: z.object({ productId: z.string().uuid(), quantity: z.number().positive(), customerId: z.string().uuid().optional(), expiresAt: z.coerce.date(), }), responses: { 201: reservationSchema, 400: errorResponseSchema, 401: errorResponseSchema, }, summary: 'Create a product reservation', }, updateReservationStatus: { method: 'PATCH', path: '/shopkeeper/reservations/:id', pathParams: z.object({ id: z.string().uuid() }), body: z.object({ status: z.enum(['pending', 'fulfilled', 'cancelled', 'expired']), }), responses: { 200: reservationSchema, 404: errorResponseSchema, 401: errorResponseSchema, }, summary: 'Update reservation status (e.g. fulfil or cancel)', }, });