erp-retail-backend-v2/src/modules/customers/routes/loyalty.routes.ts
rckrdmrd a6186c4022 Migración desde erp-retail/backend - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:11:34 -06:00

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;
}