139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
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;
|
|
}
|