import { type RequestWithAuth, enforceTenant, enforceUser, mockUser } from "@erp/auth/api"; import { type ModuleParams, validateRequest } from "@erp/core/api"; import type { ILogger } from "@repo/rdx-logger"; import { type Application, type NextFunction, type Request, type Response, Router } from "express"; import type { Sequelize } from "sequelize"; import { GetIssueInvoiceByIdRequestSchema, ListIssuedInvoicesRequestSchema, ReportIssueInvoiceByIdParamsRequestSchema, ReportIssueInvoiceByIdQueryRequestSchema, } from "../../../common/dto"; import { buildIssuedInvoicesDependencies } from "../issued-invoices-dependencies"; import { GetIssueInvoiceController, ListIssuedInvoicesController, ReportIssuedInvoiceController, } from "./controllers"; export const issuedInvoicesRouter = (params: ModuleParams) => { const { app, baseRoutePath, logger } = params as { app: Application; database: Sequelize; baseRoutePath: string; logger: ILogger; }; const deps = buildIssuedInvoicesDependencies(params); const router: Router = Router({ mergeParams: true }); if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "production") { // 🔐 Autenticación + Tenancy para TODO el router router.use( (req: Request, res: Response, next: NextFunction) => mockUser(req as RequestWithAuth, res, next) // Debe ir antes de las rutas protegidas ); } router.use([ (req: Request, res: Response, next: NextFunction) => enforceUser()(req as RequestWithAuth, res, next), // Debe ir antes de las rutas protegidas (req: Request, res: Response, next: NextFunction) => enforceTenant()(req as RequestWithAuth, res, next), // Debe ir antes de las rutas protegidas ]); // ---------------------------------------------- router.get( "/", //checkTabContext, validateRequest(ListIssuedInvoicesRequestSchema, "params"), async (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.list_issued_invoices(); const controller = new ListIssuedInvoicesController(useCase /*, deps.presenters.list */); return controller.execute(req, res, next); } ); router.get( "/:invoice_id", //checkTabContext, validateRequest(GetIssueInvoiceByIdRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.get_issued_invoice(); const controller = new GetIssueInvoiceController(useCase); return controller.execute(req, res, next); } ); router.get( "/:invoice_id/report", //checkTabContext, validateRequest(ReportIssueInvoiceByIdParamsRequestSchema, "params"), validateRequest(ReportIssueInvoiceByIdQueryRequestSchema, "query"), (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.report_issued_invoice(); const controller = new ReportIssuedInvoiceController(useCase); return controller.execute(req, res, next); } ); app.use(`${baseRoutePath}/issued-invoices`, router); };