import { Router } from 'express'; import { AppError } from '../lib/errors.js'; import { requireAuth, requirePolicy } from '../middleware/auth.js'; import { getAssignmentAttendance, getOrderDetail, getStaffReviewSummary, listFavoriteStaff, listOrders, } from '../services/query-service.js'; const defaultQueryService = { getAssignmentAttendance, getOrderDetail, getStaffReviewSummary, listFavoriteStaff, listOrders, }; function requireUuid(value, field) { if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) { throw new AppError('VALIDATION_ERROR', `${field} must be a UUID`, 400, { field }); } return value; } export function createQueryRouter(queryService = defaultQueryService) { const router = Router(); router.get( '/tenants/:tenantId/orders', requireAuth, requirePolicy('orders.read', 'order'), async (req, res, next) => { try { const tenantId = requireUuid(req.params.tenantId, 'tenantId'); const orders = await queryService.listOrders({ tenantId, businessId: req.query.businessId, status: req.query.status, limit: req.query.limit, offset: req.query.offset, }); return res.status(200).json({ items: orders, requestId: req.requestId, }); } catch (error) { return next(error); } } ); router.get( '/tenants/:tenantId/orders/:orderId', requireAuth, requirePolicy('orders.read', 'order'), async (req, res, next) => { try { const order = await queryService.getOrderDetail({ tenantId: requireUuid(req.params.tenantId, 'tenantId'), orderId: requireUuid(req.params.orderId, 'orderId'), }); return res.status(200).json({ ...order, requestId: req.requestId, }); } catch (error) { return next(error); } } ); router.get( '/tenants/:tenantId/businesses/:businessId/favorite-staff', requireAuth, requirePolicy('business.favorite-staff.read', 'staff'), async (req, res, next) => { try { const items = await queryService.listFavoriteStaff({ tenantId: requireUuid(req.params.tenantId, 'tenantId'), businessId: requireUuid(req.params.businessId, 'businessId'), limit: req.query.limit, offset: req.query.offset, }); return res.status(200).json({ items, requestId: req.requestId, }); } catch (error) { return next(error); } } ); router.get( '/tenants/:tenantId/staff/:staffId/review-summary', requireAuth, requirePolicy('staff.reviews.read', 'staff'), async (req, res, next) => { try { const summary = await queryService.getStaffReviewSummary({ tenantId: requireUuid(req.params.tenantId, 'tenantId'), staffId: requireUuid(req.params.staffId, 'staffId'), limit: req.query.limit, }); return res.status(200).json({ ...summary, requestId: req.requestId, }); } catch (error) { return next(error); } } ); router.get( '/tenants/:tenantId/assignments/:assignmentId/attendance', requireAuth, requirePolicy('attendance.read', 'attendance'), async (req, res, next) => { try { const attendance = await queryService.getAssignmentAttendance({ tenantId: requireUuid(req.params.tenantId, 'tenantId'), assignmentId: requireUuid(req.params.assignmentId, 'assignmentId'), }); return res.status(200).json({ ...attendance, requestId: req.requestId, }); } catch (error) { return next(error); } } ); return router; }