import { type StartParams, forbidQueryFieldGuard, validateRequest } from "@erp/core/api"; import { requireIdentityTenant } from "@erp/identity/api"; import { type NextFunction, type Request, type Response, Router } from "express"; import { ChangeSupplierStatusParamsRequestSchema, CreateSupplierRequestSchema, GetSupplierByIdRequestSchema, SupplierListRequestSchema, UpdateSupplierByIdParamsRequestSchema, UpdateSupplierByIdRequestSchema, } from "../../../common"; import type { SuppliersInternalDeps } from "../di"; import { ChangeSupplierStatusController, CreateSupplierController, GetSupplierController, ListSuppliersController, UpdateSupplierController, } from "./controllers"; import { CreateSupplierRequestMapper } from "./mappers/create-supplier-request.mapper"; import { UpdateSupplierByIdRequestMapper } from "./mappers/update-supplier-by-id-request.mapper"; export const suppliersRouter = (params: StartParams) => { const { app, config, getInternal } = params; // Recuperamos el dominio interno del módulo const deps = getInternal("suppliers"); const router: Router = Router({ mergeParams: true }); // ---------------------------------------------- // Mantiene el mismo pipeline de identidad y tenant que los módulos HTTP actuales. router.use(...requireIdentityTenant(params)); router.use(forbidQueryFieldGuard("companyId")); // ---------------------------------------------- router.get( "/", //checkTabContext, validateRequest(SupplierListRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.listSuppliers(); const controller = new ListSuppliersController(useCase /*, deps.presenters.list */); return controller.execute(req, res, next); } ); router.get( "/:supplier_id", //checkTabContext, validateRequest(GetSupplierByIdRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.getSupplierById(); const controller = new GetSupplierController(useCase); return controller.execute(req, res, next); } ); router.post( "/", //checkTabContext, validateRequest(CreateSupplierRequestSchema, "body"), (req: Request, res: Response, next: NextFunction) => { const useCase = deps.useCases.createSupplier(); const controller = new CreateSupplierController(useCase, new CreateSupplierRequestMapper()); return controller.execute(req, res, next); } ); router.patch( "/:supplier_id", validateRequest(UpdateSupplierByIdParamsRequestSchema, "params"), validateRequest(UpdateSupplierByIdRequestSchema, "body"), (req: Request, res: Response, next: NextFunction) => { const controller = new UpdateSupplierController( deps.useCases.updateSupplier(), new UpdateSupplierByIdRequestMapper() ); return controller.execute(req, res, next); } ); router.post( "/:supplier_id/activate", validateRequest(ChangeSupplierStatusParamsRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { const controller = new ChangeSupplierStatusController(deps.useCases.activateSupplier()); return controller.execute(req, res, next); } ); router.post( "/:supplier_id/deactivate", validateRequest(ChangeSupplierStatusParamsRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { const controller = new ChangeSupplierStatusController(deps.useCases.deactivateSupplier()); return controller.execute(req, res, next); } ); app.use(`${config.server.apiBasePath}/suppliers`, router); };