114 lines
2.8 KiB
TypeScript
114 lines
2.8 KiB
TypeScript
import { Router } from 'express';
|
|
import { LoyaltyController } from '../controllers/loyalty.controller';
|
|
import { requireAuth, requireRoles, requirePermissions } from '../../../shared/middleware/auth.middleware';
|
|
import { validateBody, validateQuery } from '../../../shared/validation/validation.middleware';
|
|
import {
|
|
enrollCustomerSchema,
|
|
listMembershipsQuerySchema,
|
|
earnPointsSchema,
|
|
redeemPointsSchema,
|
|
adjustPointsSchema,
|
|
calculatePointsSchema,
|
|
lookupByCardSchema,
|
|
listTransactionsQuerySchema,
|
|
} from '../validation/customers.schema';
|
|
|
|
export function createLoyaltyRoutes(controller: LoyaltyController): Router {
|
|
const router = Router();
|
|
|
|
// Apply auth middleware to all routes
|
|
router.use(requireAuth);
|
|
|
|
// ==================== PROGRAM ROUTES ====================
|
|
|
|
// Get active program
|
|
router.get(
|
|
'/program',
|
|
requirePermissions(['loyalty.view']),
|
|
controller.getActiveProgram
|
|
);
|
|
|
|
// ==================== MEMBERSHIP ROUTES ====================
|
|
|
|
// Enroll customer
|
|
router.post(
|
|
'/enroll',
|
|
requirePermissions(['loyalty.enroll']),
|
|
validateBody(enrollCustomerSchema),
|
|
controller.enrollCustomer
|
|
);
|
|
|
|
// List memberships
|
|
router.get(
|
|
'/memberships',
|
|
requirePermissions(['loyalty.view']),
|
|
validateQuery(listMembershipsQuerySchema),
|
|
controller.listMemberships
|
|
);
|
|
|
|
// Get membership by customer
|
|
router.get(
|
|
'/memberships/customer/:customerId',
|
|
requirePermissions(['loyalty.view']),
|
|
controller.getMembershipByCustomer
|
|
);
|
|
|
|
// Get membership by card
|
|
router.get(
|
|
'/memberships/card/:cardNumber',
|
|
requirePermissions(['loyalty.view']),
|
|
controller.getMembershipByCard
|
|
);
|
|
|
|
// Get expiring points
|
|
router.get(
|
|
'/memberships/:membershipId/expiring',
|
|
requirePermissions(['loyalty.view']),
|
|
controller.getExpiringPoints
|
|
);
|
|
|
|
// Get transaction history
|
|
router.get(
|
|
'/memberships/:membershipId/transactions',
|
|
requirePermissions(['loyalty.view']),
|
|
validateQuery(listTransactionsQuerySchema),
|
|
controller.getTransactionHistory
|
|
);
|
|
|
|
// ==================== POINTS ROUTES ====================
|
|
|
|
// Calculate points preview
|
|
router.post(
|
|
'/points/calculate',
|
|
requirePermissions(['loyalty.view']),
|
|
validateBody(calculatePointsSchema),
|
|
controller.calculatePoints
|
|
);
|
|
|
|
// Earn points
|
|
router.post(
|
|
'/points/earn',
|
|
requirePermissions(['loyalty.earn']),
|
|
validateBody(earnPointsSchema),
|
|
controller.earnPoints
|
|
);
|
|
|
|
// Redeem points
|
|
router.post(
|
|
'/points/redeem',
|
|
requirePermissions(['loyalty.redeem']),
|
|
validateBody(redeemPointsSchema),
|
|
controller.redeemPoints
|
|
);
|
|
|
|
// Adjust points
|
|
router.post(
|
|
'/points/adjust',
|
|
requireRoles(['admin', 'manager']),
|
|
validateBody(adjustPointsSchema),
|
|
controller.adjustPoints
|
|
);
|
|
|
|
return router;
|
|
}
|