From 71913c7c732ee2750869c57e9c921aa8e4770594 Mon Sep 17 00:00:00 2001 From: David Arranz Date: Thu, 23 May 2024 17:38:41 +0200 Subject: [PATCH] . --- .../express/passport/authMiddleware.ts | 40 +++----- .../express/passport/emailStrategy.ts | 10 +- .../auth/infrastructure/express/routes.ts | 58 ++--------- .../catalog/infrastructure/express/routes.ts | 5 +- .../infrastructure/express/middlewares.ts | 35 ++++--- .../sales/application/CreateDealer.useCase.ts | 15 +-- .../application/GetDealerByUser.useCase.ts | 74 ++++++++++++++ .../src/contexts/sales/application/index.ts | 1 + .../repository/DealerRepository.interface.ts | 2 + .../sales/infrastructure/Dealer.repository.ts | 23 +++++ .../createDealer/CreateDealer.controller.ts | 2 +- .../{ => dealers}/createDealer/index.ts | 4 +- .../presenter/CreateDealer.presenter.ts | 0 .../createDealer/presenter/index.ts | 0 .../deleteDealer/DeleteDealer.controller.ts | 2 +- .../{ => dealers}/deleteDealer/index.ts | 4 +- .../getDealer/GetDealer.controller.ts | 2 +- .../{ => dealers}/getDealer/index.ts | 4 +- .../presenter/GetDealer.presenter.ts | 6 +- .../getDealer/presenter/index.ts | 0 .../GetDealerByUser.controller.ts | 97 +++++++++++++++++++ .../dealers/getDealerByUser/index.ts | 24 +++++ .../presenter/GetDealerByUser.presenter.ts | 17 ++++ .../getDealerByUser/presenter/index.ts | 1 + .../express/controllers/dealers/index.ts | 5 + .../listDealers/ListDealers.controller.ts | 2 +- .../{ => dealers}/listDealers/index.ts | 4 +- .../presenter/ListDealers.presenter.ts | 0 .../listDealers/presenter/index.ts | 0 .../updateDealer/UpdateDealer.controller.ts | 2 +- .../{ => dealers}/updateDealer/index.ts | 4 +- .../presenter/UpdateDealer.presenter.ts | 1 + .../updateDealer/presenter/index.ts | 0 .../express/controllers/index.ts | 6 +- .../infrastructure/express/dealers.routes.ts | 26 +++++ .../express/middlewares/dealerMiddleware.ts | 3 + .../infrastructure/express/quote.routes.ts | 21 ++++ .../sales/infrastructure/express/routes.ts | 23 +---- .../infrastructure/sequelize/dealer.model.ts | 11 ++- .../users/infrastructure/express/routes.ts | 22 ++--- .../infrastructure/sequelize/user.model.ts | 13 ++- server/src/infrastructure/express/api/v1.ts | 7 +- server/src/infrastructure/express/app.ts | 6 +- shared/lib/contexts/sales/renamer.sh | 9 ++ 44 files changed, 418 insertions(+), 173 deletions(-) create mode 100644 server/src/contexts/sales/application/GetDealerByUser.useCase.ts rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/createDealer/CreateDealer.controller.ts (98%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/createDealer/index.ts (82%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/createDealer/presenter/CreateDealer.presenter.ts (100%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/createDealer/presenter/index.ts (100%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/deleteDealer/DeleteDealer.controller.ts (97%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/deleteDealer/index.ts (79%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/getDealer/GetDealer.controller.ts (97%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/getDealer/index.ts (81%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/getDealer/presenter/GetDealer.presenter.ts (59%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/getDealer/presenter/index.ts (100%) create mode 100644 server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/GetDealerByUser.controller.ts create mode 100644 server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/index.ts create mode 100644 server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/GetDealerByUser.presenter.ts create mode 100644 server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/index.ts create mode 100644 server/src/contexts/sales/infrastructure/express/controllers/dealers/index.ts rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/listDealers/ListDealers.controller.ts (97%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/listDealers/index.ts (82%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/listDealers/presenter/ListDealers.presenter.ts (100%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/listDealers/presenter/index.ts (100%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/updateDealer/UpdateDealer.controller.ts (98%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/updateDealer/index.ts (82%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/updateDealer/presenter/UpdateDealer.presenter.ts (89%) rename server/src/contexts/sales/infrastructure/express/controllers/{ => dealers}/updateDealer/presenter/index.ts (100%) create mode 100644 server/src/contexts/sales/infrastructure/express/dealers.routes.ts create mode 100644 server/src/contexts/sales/infrastructure/express/middlewares/dealerMiddleware.ts create mode 100644 server/src/contexts/sales/infrastructure/express/quote.routes.ts create mode 100755 shared/lib/contexts/sales/renamer.sh diff --git a/server/src/contexts/auth/infrastructure/express/passport/authMiddleware.ts b/server/src/contexts/auth/infrastructure/express/passport/authMiddleware.ts index 977a5d8..666da3e 100644 --- a/server/src/contexts/auth/infrastructure/express/passport/authMiddleware.ts +++ b/server/src/contexts/auth/infrastructure/express/passport/authMiddleware.ts @@ -1,46 +1,36 @@ import { AuthUser } from "@/contexts/auth/domain"; +import { composeMiddleware } from "@/contexts/common/infrastructure/express"; import { generateExpressError } from "@/contexts/common/infrastructure/express/ExpressErrorResponse"; import Express from "express"; import httpStatus from "http-status"; import passport from "passport"; -function compose(middlewareArray: any[]) { - if (!middlewareArray.length) { - return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) { - next(); - }; - } - - const head = middlewareArray[0]; - const tail = middlewareArray.slice(1); - - return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) { - head(req, res, function (err: unknown) { - if (err) return next(err); - compose(tail)(req, res, next); - }); - }; -} - -export const isLoggedUser = compose([ +export const isUser = composeMiddleware([ passport.authenticate("local-jwt", { session: false, }), (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { - const user = req.user; + if (req.isAuthenticated()) { + req.authInfo = req.user; + return next(); + } + + return generateExpressError(req, res, httpStatus.UNAUTHORIZED); + + /*const user = req.user; if (!user.isUser) { return generateExpressError(req, res, httpStatus.UNAUTHORIZED); } - next(); + next();*/ }, ]); -export const isAdminUser = compose([ - isLoggedUser, +export const isAdmin = composeMiddleware([ + isUser, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { - const user = req.user; + const user = req.authInfo; if (!user.isAdmin) { - return generateExpressError(req, res, httpStatus.UNAUTHORIZED); + generateExpressError(req, res, httpStatus.UNAUTHORIZED); } next(); }, diff --git a/server/src/contexts/auth/infrastructure/express/passport/emailStrategy.ts b/server/src/contexts/auth/infrastructure/express/passport/emailStrategy.ts index 3bc2362..54f1d9d 100644 --- a/server/src/contexts/auth/infrastructure/express/passport/emailStrategy.ts +++ b/server/src/contexts/auth/infrastructure/express/passport/emailStrategy.ts @@ -21,7 +21,7 @@ class EmailStrategyController extends PassportStrategyController { props: { useCase: LoginUseCase; }, - context: any, + context: any ) { super(); @@ -33,11 +33,7 @@ class EmailStrategyController extends PassportStrategyController { public async verifyStrategy( email: string, password: string, - done: ( - error: any, - user?: AuthUser | false, - options?: IVerifyOptions, - ) => void, + done: (error: any, user?: AuthUser | false, options?: IVerifyOptions) => void ) { const loginDTOOrError = ensureLogin_DTOIsValid({ email, password }); @@ -65,6 +61,6 @@ export const initEmailStrategy = (context: IAuthContext) => { useCase: new LoginUseCase(context), }, - context, + context ).verifyStrategy(...params); }); diff --git a/server/src/contexts/auth/infrastructure/express/routes.ts b/server/src/contexts/auth/infrastructure/express/routes.ts index 93279d2..df1e3fb 100644 --- a/server/src/contexts/auth/infrastructure/express/routes.ts +++ b/server/src/contexts/auth/infrastructure/express/routes.ts @@ -1,67 +1,25 @@ -import { registerMiddleware } from "@/contexts/common/infrastructure/express"; import Express from "express"; import passport from "passport"; import { createLoginController } from "./controllers"; -import { isAdminUser, isLoggedUser } from "./passport"; - -/*authRoutes.post( - "/login", - passport.authenticate("local-email"), - - (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { - console.log("login OK => generate token JWT"); - - // Generar token JWT - const token = JWT.sign({ userId: req.user?.id }, "clave_secreta", { - expiresIn: "1h", - }); // Clave secreta y expiración de 1 hora - - // Enviar token como respuesta - res.json({ token }); - }, -); - -authRoutes.post("/logout", passport.authenticate("local-jwt")); - -authRoutes.get( - "/profile", - passport.authenticate("local-jwt", { session: false }), - (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { - res.json({ - message: "You made it to the secure route", - user: req.user, - token: req.query.secret_token, - }); - }, -);*/ - -//export { authRouter }; +import { isUser } from "./passport"; export const AuthRouter = (appRouter: Express.Router) => { const authRoutes: Express.Router = Express.Router({ mergeParams: true }); - appRouter.use(registerMiddleware("isLoggedUser", isLoggedUser)); - appRouter.use(registerMiddleware("isAdminUser", isAdminUser)); + //appRouter.use(registerMiddleware("isUser", isUser)); + //appRouter.use(registerMiddleware("isAdmin", isAdmin)); authRoutes.post( "/login", passport.authenticate("local-email", { session: false }), (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createLoginController(res.locals["context"]).execute(req, res, next), + createLoginController(res.locals["context"]).execute(req, res, next) ); - authRoutes.post( - "/logout", - isLoggedUser, - ( - req: Express.Request, - res: Express.Response, - next: Express.NextFunction, - ) => { - //req.logout(); <-- ?? - return res.status(200).json(); - }, - ); + authRoutes.post("/logout", isUser, (req: Express.Request, res: Express.Response) => { + //req.logout(); <-- ?? + return res.status(200).json(); + }); authRoutes.post("/register"); diff --git a/server/src/contexts/catalog/infrastructure/express/routes.ts b/server/src/contexts/catalog/infrastructure/express/routes.ts index c79255d..c0f539e 100644 --- a/server/src/contexts/catalog/infrastructure/express/routes.ts +++ b/server/src/contexts/catalog/infrastructure/express/routes.ts @@ -1,4 +1,4 @@ -import { applyMiddleware } from "@/contexts/common/infrastructure/express"; +import { isUser } from "@/contexts/auth"; import Express from "express"; import { listArticlesController } from "./controllers"; @@ -13,10 +13,11 @@ export const CatalogRouter = (appRouter: Express.Router) => { catalogRoutes.get( "/", - applyMiddleware("isLoggedUser"), (req: Express.Request, res: Express.Response, next: Express.NextFunction) => listArticlesController(res.locals["context"]).execute(req, res, next) ); + catalogRoutes.use(isUser); + appRouter.use("/catalog", catalogRoutes); }; diff --git a/server/src/contexts/common/infrastructure/express/middlewares.ts b/server/src/contexts/common/infrastructure/express/middlewares.ts index 0ae9cd2..90d1518 100644 --- a/server/src/contexts/common/infrastructure/express/middlewares.ts +++ b/server/src/contexts/common/infrastructure/express/middlewares.ts @@ -3,25 +3,16 @@ import Express from "express"; const registeredMiddlewares: Record = {}; function registerMiddleware(name: string, middleware: Express.RequestHandler) { - return ( - req: Express.Request, - res: Express.Response, - next: Express.NextFunction, - ) => { + return (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { registeredMiddlewares[name] = middleware; next(); }; } function applyMiddleware(middlewares: string | Array) { - const middlewareNames = - typeof middlewares === "string" ? [middlewares] : middlewares; + const middlewareNames = typeof middlewares === "string" ? [middlewares] : middlewares; - return ( - req: Express.Request, - res: Express.Response, - next: Express.NextFunction, - ) => { + return (req: Express.Request, res: Express.Response, next: Express.NextFunction) => { middlewareNames.forEach((name) => { const middleware = registeredMiddlewares[name]; if (middleware) { @@ -37,4 +28,22 @@ function createMiddlewareMap() { return new Map(); } -export { applyMiddleware, createMiddlewareMap, registerMiddleware }; +function composeMiddleware(middlewareArray: any[]) { + if (!middlewareArray.length) { + return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) { + next(); + }; + } + + const head = middlewareArray[0]; + const tail = middlewareArray.slice(1); + + return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) { + head(req, res, function (err: unknown) { + if (err) return next(err); + composeMiddleware(tail)(req, res, next); + }); + }; +} + +export { applyMiddleware, composeMiddleware, createMiddlewareMap, registerMiddleware }; diff --git a/server/src/contexts/sales/application/CreateDealer.useCase.ts b/server/src/contexts/sales/application/CreateDealer.useCase.ts index 5b2eab5..4815111 100644 --- a/server/src/contexts/sales/application/CreateDealer.useCase.ts +++ b/server/src/contexts/sales/application/CreateDealer.useCase.ts @@ -1,10 +1,9 @@ import { IUseCase, IUseCaseError, UseCaseError } from "@/contexts/common/application"; -import { IRepositoryManager, Password } from "@/contexts/common/domain"; +import { IRepositoryManager } from "@/contexts/common/domain"; import { IInfrastructureError } from "@/contexts/common/infrastructure"; import { ISequelizeAdapter } from "@/contexts/common/infrastructure/sequelize"; import { DomainError, - Email, ICreateDealer_Request_DTO, IDomainError, Name, @@ -117,21 +116,9 @@ export class CreateDealerUseCase return Result.fail(nameOrError.error); } - const emailOrError = Email.create(dealerDTO.email); - if (emailOrError.isFailure) { - return Result.fail(emailOrError.error); - } - - const passwordOrError = Password.createFromPlainTextPassword(dealerDTO.password); - if (passwordOrError.isFailure) { - return Result.fail(passwordOrError.error); - } - return Dealer.create( { name: nameOrError.object, - email: emailOrError.object, - password: passwordOrError.object, }, dealerId ); diff --git a/server/src/contexts/sales/application/GetDealerByUser.useCase.ts b/server/src/contexts/sales/application/GetDealerByUser.useCase.ts new file mode 100644 index 0000000..4ffdc02 --- /dev/null +++ b/server/src/contexts/sales/application/GetDealerByUser.useCase.ts @@ -0,0 +1,74 @@ +import { + IUseCase, + IUseCaseError, + IUseCaseRequest, + UseCaseError, +} from "@/contexts/common/application/useCases"; +import { IRepositoryManager } from "@/contexts/common/domain"; +import { ISequelizeAdapter } from "@/contexts/common/infrastructure/sequelize"; +import { Result, UniqueID } from "@shared/contexts"; +import { IDealerRepository } from "../domain"; + +import { IInfrastructureError } from "@/contexts/common/infrastructure"; +import { Dealer } from "../domain/entities/Dealer"; + +export interface IGetDealerByUserByUserUseCaseRequest extends IUseCaseRequest { + userId: UniqueID; +} + +export type GetDealerByUserResponseOrError = + | Result // Misc errors (value objects) + | Result; // Success! + +export class GetDealerByUserUseCase + implements + IUseCase> +{ + private _adapter: ISequelizeAdapter; + private _repositoryManager: IRepositoryManager; + + constructor(props: { adapter: ISequelizeAdapter; repositoryManager: IRepositoryManager }) { + this._adapter = props.adapter; + this._repositoryManager = props.repositoryManager; + } + + private getRepositoryByName(name: string) { + return this._repositoryManager.getRepository(name); + } + + async execute( + request: IGetDealerByUserByUserUseCaseRequest + ): Promise { + const { userId } = request; + + // Validación de datos + // No hay en este caso + + return await this.getUserDealer(userId); + } + + private async getUserDealer(userId: UniqueID) { + const transaction = this._adapter.startTransaction(); + const dealerRepoBuilder = this.getRepositoryByName("Dealer"); + + let dealer: Dealer | null = null; + + try { + await transaction.complete(async (t) => { + const dealerRepo = dealerRepoBuilder({ transaction: t }); + dealer = await dealerRepo.getByUserId(userId); + }); + + if (!dealer) { + return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Dealer not found")); + } + + return Result.ok(dealer!); + } catch (error: unknown) { + const _error = error as IInfrastructureError; + return Result.fail( + UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Error al consultar el usuario", _error) + ); + } + } +} diff --git a/server/src/contexts/sales/application/index.ts b/server/src/contexts/sales/application/index.ts index 76b60f6..64b29ca 100644 --- a/server/src/contexts/sales/application/index.ts +++ b/server/src/contexts/sales/application/index.ts @@ -1,5 +1,6 @@ export * from "./CreateDealer.useCase"; export * from "./DeleteDealer.useCase"; export * from "./GetDealer.useCase"; +export * from "./GetDealerByUser.useCase"; export * from "./ListDealers.useCase"; export * from "./UpdateDealer.useCase"; diff --git a/server/src/contexts/sales/domain/repository/DealerRepository.interface.ts b/server/src/contexts/sales/domain/repository/DealerRepository.interface.ts index f0e9d8a..dcd63bc 100644 --- a/server/src/contexts/sales/domain/repository/DealerRepository.interface.ts +++ b/server/src/contexts/sales/domain/repository/DealerRepository.interface.ts @@ -11,4 +11,6 @@ export interface IDealerRepository extends IRepository { findAll(queryCriteria?: IQueryCriteria): Promise>; removeById(id: UniqueID): Promise; + + getByUserId(userId: UniqueID): Promise; } diff --git a/server/src/contexts/sales/infrastructure/Dealer.repository.ts b/server/src/contexts/sales/infrastructure/Dealer.repository.ts index d0d3fe1..18db024 100644 --- a/server/src/contexts/sales/infrastructure/Dealer.repository.ts +++ b/server/src/contexts/sales/infrastructure/Dealer.repository.ts @@ -52,6 +52,29 @@ export class DealerRepository extends SequelizeRepository implements IDe return this.mapper.mapToDomain(rawDealer); } + public async getByUserId(userId: UniqueID): Promise { + const _dealer_model = this._adapter.getModel("Dealer_Model"); + const _user_model = this._adapter.getModel("User_Model"); + + const rawDealer: any = await _dealer_model.findOne({ + include: [ + { + attributes: [], + model: _user_model, + as: "users", + required: true, + where: { id: userId.toPrimitive() }, + }, + ], + }); + + if (!rawDealer === true) { + return null; + } + + return this.mapper.mapToDomain(rawDealer); + } + public async findAll(queryCriteria?: IQueryCriteria): Promise> { const { rows, count } = await this._findAll( "Dealer_Model", diff --git a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/CreateDealer.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/CreateDealer.controller.ts similarity index 98% rename from server/src/contexts/sales/infrastructure/express/controllers/createDealer/CreateDealer.controller.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/CreateDealer.controller.ts index 4f033ae..17e4bc7 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/CreateDealer.controller.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/CreateDealer.controller.ts @@ -9,7 +9,7 @@ import { ICreateDealer_Response_DTO, ensureCreateDealer_Request_DTOIsValid, } from "@shared/contexts"; -import { ISalesContext } from "../../../Sales.context"; +import { ISalesContext } from "../../../../Sales.context"; import { ICreateDealerPresenter } from "./presenter"; export class CreateDealerController extends ExpressController { diff --git a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/index.ts similarity index 82% rename from server/src/contexts/sales/infrastructure/express/controllers/createDealer/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/index.ts index b65684d..b9866e2 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/index.ts @@ -1,7 +1,7 @@ import { CreateDealerUseCase } from "@/contexts/sales/application"; import Express from "express"; -import { registerDealerRepository } from "../../../Dealer.repository"; -import { ISalesContext } from "../../../Sales.context"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; import { CreateDealerController } from "./CreateDealer.controller"; import { CreateDealerPresenter } from "./presenter"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/presenter/CreateDealer.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/presenter/CreateDealer.presenter.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/createDealer/presenter/CreateDealer.presenter.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/presenter/CreateDealer.presenter.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/createDealer/presenter/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/presenter/index.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/createDealer/presenter/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/createDealer/presenter/index.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/DeleteDealer.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/DeleteDealer.controller.ts similarity index 97% rename from server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/DeleteDealer.controller.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/DeleteDealer.controller.ts index 262ada3..727bb99 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/DeleteDealer.controller.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/DeleteDealer.controller.ts @@ -4,7 +4,7 @@ import { IInfrastructureError, InfrastructureError } from "@/contexts/common/inf import { ExpressController } from "@/contexts/common/infrastructure/express"; import { DeleteDealerUseCase } from "@/contexts/sales/application"; import { ensureIdIsValid } from "@shared/contexts"; -import { ISalesContext } from "../../../Sales.context"; +import { ISalesContext } from "../../../../Sales.context"; export class DeleteDealerController extends ExpressController { private useCase: DeleteDealerUseCase; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/index.ts similarity index 79% rename from server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/index.ts index ef389e1..cb4caf0 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/deleteDealer/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/deleteDealer/index.ts @@ -1,7 +1,7 @@ import { DeleteDealerUseCase } from "@/contexts/sales/application"; import Express from "express"; -import { registerDealerRepository } from "../../../Dealer.repository"; -import { ISalesContext } from "../../../Sales.context"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; import { DeleteDealerController } from "./DeleteDealer.controller"; export const deleteDealerController = ( diff --git a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/GetDealer.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/GetDealer.controller.ts similarity index 97% rename from server/src/contexts/sales/infrastructure/express/controllers/getDealer/GetDealer.controller.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/GetDealer.controller.ts index 0382113..dd4f322 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/GetDealer.controller.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/GetDealer.controller.ts @@ -6,7 +6,7 @@ import { IInfrastructureError, InfrastructureError } from "@/contexts/common/inf import { GetDealerUseCase } from "@/contexts/sales/application"; import { Dealer } from "@/contexts/sales/domain"; import { IGetDealerResponse_DTO, ensureIdIsValid } from "@shared/contexts"; -import { ISalesContext } from "../../../Sales.context"; +import { ISalesContext } from "../../../../Sales.context"; import { IGetDealerPresenter } from "./presenter/GetDealer.presenter"; export class GetDealerController extends ExpressController { diff --git a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/index.ts similarity index 81% rename from server/src/contexts/sales/infrastructure/express/controllers/getDealer/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/index.ts index 7f098a1..79f8e81 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/index.ts @@ -1,7 +1,7 @@ import { GetDealerUseCase } from "@/contexts/sales/application"; import Express from "express"; -import { registerDealerRepository } from "../../../Dealer.repository"; -import { ISalesContext } from "../../../Sales.context"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; import { GetDealerController } from "./GetDealer.controller"; import { GetDealerPresenter } from "./presenter"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/presenter/GetDealer.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/presenter/GetDealer.presenter.ts similarity index 59% rename from server/src/contexts/sales/infrastructure/express/controllers/getDealer/presenter/GetDealer.presenter.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/presenter/GetDealer.presenter.ts index 0abc9c7..3bbff81 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/presenter/GetDealer.presenter.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/presenter/GetDealer.presenter.ts @@ -1,11 +1,13 @@ -import { Dealer } from "../../../../../domain"; -import { ISalesContext } from "../../../../Sales.context"; +import { IGetDealerResponse_DTO } from "@shared/contexts"; +import { Dealer } from "../../../../../../domain"; +import { ISalesContext } from "../../../../../Sales.context"; export interface IGetDealerPresenter { map: (dealer: Dealer, context: ISalesContext) => IGetDealerResponse_DTO; } export const GetDealerPresenter: IGetDealerPresenter = { + // eslint-disable-next-line @typescript-eslint/no-unused-vars map: (dealer: Dealer, context: ISalesContext): IGetDealerResponse_DTO => { return { id: dealer.id.toString(), diff --git a/server/src/contexts/sales/infrastructure/express/controllers/getDealer/presenter/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/presenter/index.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/getDealer/presenter/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealer/presenter/index.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/GetDealerByUser.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/GetDealerByUser.controller.ts new file mode 100644 index 0000000..47097f2 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/GetDealerByUser.controller.ts @@ -0,0 +1,97 @@ +import { IUseCaseError, UseCaseError } from "@/contexts/common/application/useCases"; +import { ExpressController } from "@/contexts/common/infrastructure/express"; + +import { IServerError } from "@/contexts/common/domain/errors"; +import { IInfrastructureError, InfrastructureError } from "@/contexts/common/infrastructure"; +import { GetDealerByUserUseCase } from "@/contexts/sales/application"; +import { Dealer } from "@/contexts/sales/domain"; +import { IGetDealerResponse_DTO, ensureIdIsValid } from "@shared/contexts"; +import { ISalesContext } from "../../../../Sales.context"; +import { IGetDealerByUserPresenter } from "./presenter"; + +export class GetDealerByUserController extends ExpressController { + private useCase: GetDealerByUserUseCase; + private presenter: IGetDealerByUserPresenter; + private context: ISalesContext; + + constructor( + props: { + useCase: GetDealerByUserUseCase; + presenter: IGetDealerByUserPresenter; + }, + context: ISalesContext + ) { + super(); + + const { useCase, presenter } = props; + this.useCase = useCase; + this.presenter = presenter; + this.context = context; + } + + async executeImpl(): Promise { + const { dealerId } = this.req.params; + + // Validar ID + const dealerIdOrError = ensureIdIsValid(dealerId); + if (dealerIdOrError.isFailure) { + const errorMessage = "Dealer ID is not valid"; + const infraError = InfrastructureError.create( + InfrastructureError.INVALID_INPUT_DATA, + errorMessage, + dealerIdOrError.error + ); + return this.invalidInputError(errorMessage, infraError); + } + + try { + const result = await this.useCase.execute({ + userId: dealerIdOrError.object, + }); + + if (result.isFailure) { + return this._handleExecuteError(result.error); + } + + const dealer = result.object; + + return this.ok(this.presenter.map(dealer, this.context)); + } catch (e: unknown) { + return this.fail(e as IServerError); + } + } + + private _handleExecuteError(error: IUseCaseError) { + let errorMessage: string; + let infraError: IInfrastructureError; + + switch (error.code) { + case UseCaseError.NOT_FOUND_ERROR: + errorMessage = "Dealer not found"; + + infraError = InfrastructureError.create( + InfrastructureError.RESOURCE_NOT_FOUND_ERROR, + errorMessage, + error + ); + + return this.notFoundError(errorMessage, infraError); + break; + + case UseCaseError.UNEXCEPTED_ERROR: + errorMessage = error.message; + + infraError = InfrastructureError.create( + InfrastructureError.UNEXCEPTED_ERROR, + errorMessage, + error + ); + return this.internalServerError(errorMessage, infraError); + break; + + default: + errorMessage = error.message; + return this.clientError(errorMessage); + } + } +} diff --git a/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/index.ts new file mode 100644 index 0000000..ed34c57 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/index.ts @@ -0,0 +1,24 @@ +import { GetDealerByUserUseCase } from "@/contexts/sales/application"; +import Express from "express"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; +import { GetDealerByUserController } from "./GetDealerByUser.controller"; +import { GetDealerByUserPresenter } from "./presenter"; + +export const getDealerByUserController = ( + req: Express.Request, + res: Express.Response, + next: Express.NextFunction +) => { + const context: ISalesContext = res.locals.context; + + registerDealerRepository(context); + + return new GetDealerByUserController( + { + useCase: new GetDealerByUserUseCase(context), + presenter: GetDealerByUserPresenter, + }, + context + ).execute(req, res, next); +}; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/GetDealerByUser.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/GetDealerByUser.presenter.ts new file mode 100644 index 0000000..13da90a --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/GetDealerByUser.presenter.ts @@ -0,0 +1,17 @@ +import { IGetDealerResponse_DTO } from "@shared/contexts"; +import { Dealer } from "../../../../../../domain"; +import { ISalesContext } from "../../../../../Sales.context"; + +export interface IGetDealerByUserPresenter { + map: (dealer: Dealer, context: ISalesContext) => IGetDealerResponse_DTO; +} + +export const GetDealerByUserPresenter: IGetDealerByUserPresenter = { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + map: (dealer: Dealer, context: ISalesContext): IGetDealerResponse_DTO => { + return { + id: dealer.id.toString(), + name: dealer.name.toString(), + }; + }, +}; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/index.ts new file mode 100644 index 0000000..e11168c --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/getDealerByUser/presenter/index.ts @@ -0,0 +1 @@ +export * from "./GetDealerByUser.presenter"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/dealers/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/index.ts new file mode 100644 index 0000000..62c9249 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/index.ts @@ -0,0 +1,5 @@ +export * from "./createDealer"; +export * from "./deleteDealer"; +export * from "./getDealer"; +export * from "./listDealers"; +export * from "./updateDealer"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/ListDealers.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/ListDealers.controller.ts similarity index 97% rename from server/src/contexts/sales/infrastructure/express/controllers/listDealers/ListDealers.controller.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/ListDealers.controller.ts index ba2d8ac..562a8fd 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/ListDealers.controller.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/ListDealers.controller.ts @@ -13,7 +13,7 @@ import { Result, RuleValidator, } from "@shared/contexts"; -import { ISalesContext } from "../../../Sales.context"; +import { ISalesContext } from "../../../../Sales.context"; import { IListDealersPresenter } from "./presenter"; export class ListDealersController extends ExpressController { diff --git a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/index.ts similarity index 82% rename from server/src/contexts/sales/infrastructure/express/controllers/listDealers/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/index.ts index 5536f3a..0cd4b69 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/index.ts @@ -1,7 +1,7 @@ import { ListDealersUseCase } from "@/contexts/sales/application"; import Express from "express"; -import { registerDealerRepository } from "../../../Dealer.repository"; -import { ISalesContext } from "../../../Sales.context"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; import { ListDealersController } from "./ListDealers.controller"; import { listDealersPresenter } from "./presenter/ListDealers.presenter"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/presenter/ListDealers.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/presenter/ListDealers.presenter.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/listDealers/presenter/ListDealers.presenter.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/presenter/ListDealers.presenter.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/listDealers/presenter/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/presenter/index.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/listDealers/presenter/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/listDealers/presenter/index.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/UpdateDealer.controller.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/UpdateDealer.controller.ts similarity index 98% rename from server/src/contexts/sales/infrastructure/express/controllers/updateDealer/UpdateDealer.controller.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/UpdateDealer.controller.ts index b69fd6d..864afe0 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/UpdateDealer.controller.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/UpdateDealer.controller.ts @@ -10,7 +10,7 @@ import { ensureIdIsValid, ensureUpdateDealer_Request_DTOIsValid, } from "@shared/contexts"; -import { ISalesContext } from "../../../Sales.context"; +import { ISalesContext } from "../../../../Sales.context"; import { IUpdateDealerPresenter } from "./presenter/UpdateDealer.presenter"; export class UpdateDealerController extends ExpressController { diff --git a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/index.ts similarity index 82% rename from server/src/contexts/sales/infrastructure/express/controllers/updateDealer/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/index.ts index 47d7a11..f29256e 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/index.ts @@ -1,7 +1,7 @@ import { UpdateDealerUseCase } from "@/contexts/sales/application"; import Express from "express"; -import { registerDealerRepository } from "../../../Dealer.repository"; -import { ISalesContext } from "../../../Sales.context"; +import { registerDealerRepository } from "../../../../Dealer.repository"; +import { ISalesContext } from "../../../../Sales.context"; import { UpdateDealerController } from "./UpdateDealer.controller"; import { UpdateDealerPresenter } from "./presenter/UpdateDealer.presenter"; diff --git a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/presenter/UpdateDealer.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/presenter/UpdateDealer.presenter.ts similarity index 89% rename from server/src/contexts/sales/infrastructure/express/controllers/updateDealer/presenter/UpdateDealer.presenter.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/presenter/UpdateDealer.presenter.ts index 1d08571..b41b73f 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/presenter/UpdateDealer.presenter.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/presenter/UpdateDealer.presenter.ts @@ -7,6 +7,7 @@ export interface IUpdateDealerPresenter { } export const UpdateDealerPresenter: IUpdateDealerPresenter = { + // eslint-disable-next-line @typescript-eslint/no-unused-vars map: (dealer: Dealer, context: ISalesContext): IUpdateDealer_Response_DTO => { return { id: dealer.id.toString(), diff --git a/server/src/contexts/sales/infrastructure/express/controllers/updateDealer/presenter/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/presenter/index.ts similarity index 100% rename from server/src/contexts/sales/infrastructure/express/controllers/updateDealer/presenter/index.ts rename to server/src/contexts/sales/infrastructure/express/controllers/dealers/updateDealer/presenter/index.ts diff --git a/server/src/contexts/sales/infrastructure/express/controllers/index.ts b/server/src/contexts/sales/infrastructure/express/controllers/index.ts index 62c9249..895d623 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/index.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/index.ts @@ -1,5 +1 @@ -export * from "./createDealer"; -export * from "./deleteDealer"; -export * from "./getDealer"; -export * from "./listDealers"; -export * from "./updateDealer"; +export * from "./dealers"; diff --git a/server/src/contexts/sales/infrastructure/express/dealers.routes.ts b/server/src/contexts/sales/infrastructure/express/dealers.routes.ts new file mode 100644 index 0000000..590f037 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/dealers.routes.ts @@ -0,0 +1,26 @@ +import { isAdmin, isUser } from "@/contexts/auth"; +import Express from "express"; +import { + createDealerController, + deleteDealerController, + getDealerController, + updateDealerController, +} from "./controllers/dealers"; +import { listDealersController } from "./controllers/dealers/listDealers"; +import { getDealerMiddleware } from "./middlewares/dealerMiddleware"; +import { quoteRoutes } from "./quote.routes"; + +export const DealerRouter = (appRouter: Express.Router) => { + const dealerRoutes: Express.Router = Express.Router({ mergeParams: true }); + + dealerRoutes.get("/", isAdmin, listDealersController); + dealerRoutes.get("/:dealerId", isUser, getDealerMiddleware, getDealerController); + dealerRoutes.post("/", isAdmin, createDealerController); + dealerRoutes.put("/:dealerId", isAdmin, updateDealerController); + dealerRoutes.delete("/:dealerId", isAdmin, deleteDealerController); + + // Anidar quotes en /dealers/:dealerId + dealerRoutes.use("/:dealerId/quotes", quoteRoutes); + + appRouter.use("/dealers", dealerRoutes); +}; diff --git a/server/src/contexts/sales/infrastructure/express/middlewares/dealerMiddleware.ts b/server/src/contexts/sales/infrastructure/express/middlewares/dealerMiddleware.ts new file mode 100644 index 0000000..4e6e572 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/middlewares/dealerMiddleware.ts @@ -0,0 +1,3 @@ +import { getDealerByUserController } from "../controllers/dealers/getDealerByUser"; + +export const getDealerMiddleware = getDealerByUserController; diff --git a/server/src/contexts/sales/infrastructure/express/quote.routes.ts b/server/src/contexts/sales/infrastructure/express/quote.routes.ts new file mode 100644 index 0000000..6aa7f99 --- /dev/null +++ b/server/src/contexts/sales/infrastructure/express/quote.routes.ts @@ -0,0 +1,21 @@ +import { isAdmin } from "@/contexts/auth"; +import Express from "express"; + +export const quoteRoutes: Express.Router = Express.Router({ mergeParams: true }); + +//quoteRoutes.use(isUser, xxx); + +/*quoteRoutes.get("/", listQuotesController); + quoteRoutes.get("/:quoteId", getQuoteController); + quoteRoutes.post("/", createQuoteController); + quoteRoutes.put("/:quoteId", updateQuoteController); + quoteRoutes.delete("/:quoteId", deleteQuoteController);*/ + +quoteRoutes.get("/", isAdmin, (req, res) => { + console.log(req.params); + res.status(200).json(); +}); + +export const QuoteRouter = (appRouter: Express.Router) => { + appRouter.use("/quotes", quoteRoutes); +}; diff --git a/server/src/contexts/sales/infrastructure/express/routes.ts b/server/src/contexts/sales/infrastructure/express/routes.ts index cc78139..d540516 100644 --- a/server/src/contexts/sales/infrastructure/express/routes.ts +++ b/server/src/contexts/sales/infrastructure/express/routes.ts @@ -1,21 +1,8 @@ -import { applyMiddleware } from "@/contexts/common/infrastructure/express"; import Express from "express"; -import { - createDealerController, - deleteDealerController, - getDealerController, - updateDealerController, -} from "./controllers"; -import { listDealersController } from "./controllers/listDealers"; +import { DealerRouter } from "./dealers.routes"; +import { QuoteRouter } from "./quote.routes"; -export const DealerRouter = (appRouter: Express.Router) => { - const dealerRoutes: Express.Router = Express.Router({ mergeParams: true }); - - dealerRoutes.get("/", applyMiddleware("isAdminUser"), listDealersController); - dealerRoutes.get("/:dealerId", applyMiddleware("isAdminUser"), getDealerController); - dealerRoutes.post("/", applyMiddleware("isAdminUser"), createDealerController); - dealerRoutes.put("/:dealerId", applyMiddleware("isAdminUser"), updateDealerController); - dealerRoutes.delete("/:dealerId", applyMiddleware("isAdminUser"), deleteDealerController); - - appRouter.use("/dealers", dealerRoutes); +export const SalesRouter = (appRouter: Express.Router) => { + DealerRouter(appRouter); + QuoteRouter(appRouter); }; diff --git a/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts b/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts index 674e758..8bb0603 100644 --- a/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts +++ b/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts @@ -23,7 +23,16 @@ export class Dealer_Model extends Model< return Promise.resolve(); }*/ - static associate(connection: Sequelize) {} + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static associate(connection: Sequelize) { + const { Dealer_Model, User_Model } = connection.models; + + Dealer_Model.hasMany(User_Model, { + as: "users", + foreignKey: "dealer_id", + onDelete: "RESTRICT", + }); + } declare id: string; declare id_contact?: string; // number ?? diff --git a/server/src/contexts/users/infrastructure/express/routes.ts b/server/src/contexts/users/infrastructure/express/routes.ts index 4636dbc..9a7ee59 100644 --- a/server/src/contexts/users/infrastructure/express/routes.ts +++ b/server/src/contexts/users/infrastructure/express/routes.ts @@ -1,4 +1,4 @@ -import { applyMiddleware } from "@/contexts/common/infrastructure/express"; +import { isAdmin } from "@/contexts/auth"; import Express from "express"; import { createCreateUserController, @@ -13,37 +13,37 @@ export const UserRouter = (appRouter: Express.Router) => { userRoutes.get( "/", - applyMiddleware("isAdminUser"), + isAdmin, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createListUsersController(res.locals["context"]).execute(req, res, next), + createListUsersController(res.locals["context"]).execute(req, res, next) ); userRoutes.get( "/:userId", - applyMiddleware("isAdminUser"), + isAdmin, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createGetUserController(res.locals["context"]).execute(req, res, next), + createGetUserController(res.locals["context"]).execute(req, res, next) ); userRoutes.post( "/", - applyMiddleware("isAdminUser"), + isAdmin, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createCreateUserController(res.locals["context"]).execute(req, res, next), + createCreateUserController(res.locals["context"]).execute(req, res, next) ); userRoutes.put( "/:userId", - applyMiddleware("isAdminUser"), + isAdmin, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createUpdateUserController(res.locals["context"]).execute(req, res, next), + createUpdateUserController(res.locals["context"]).execute(req, res, next) ); userRoutes.delete( "/:userId", - applyMiddleware("isAdminUser"), + isAdmin, (req: Express.Request, res: Express.Response, next: Express.NextFunction) => - createDeleteUserController(res.locals["context"]).execute(req, res, next), + createDeleteUserController(res.locals["context"]).execute(req, res, next) ); appRouter.use("/users", userRoutes); diff --git a/server/src/contexts/users/infrastructure/sequelize/user.model.ts b/server/src/contexts/users/infrastructure/sequelize/user.model.ts index b9243cd..faa6c00 100644 --- a/server/src/contexts/users/infrastructure/sequelize/user.model.ts +++ b/server/src/contexts/users/infrastructure/sequelize/user.model.ts @@ -18,7 +18,16 @@ export class User_Model extends Model< return Promise.resolve(); }*/ - static associate(connection: Sequelize) {} + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static associate(connection: Sequelize) { + const { User_Model, Dealer_Model } = connection.models; + + User_Model.belongsTo(Dealer_Model, { + as: "dealer", + foreignKey: "dealer_id", + onDelete: "RESTRICT", + }); + } declare id: string; declare name: string; @@ -79,7 +88,7 @@ export default (sequelize: Sequelize) => { }; }, }, - }, + } ); return User_Model; diff --git a/server/src/infrastructure/express/api/v1.ts b/server/src/infrastructure/express/api/v1.ts index 68b7ebf..2e57802 100644 --- a/server/src/infrastructure/express/api/v1.ts +++ b/server/src/infrastructure/express/api/v1.ts @@ -1,7 +1,6 @@ import { AuthRouter } from "@/contexts/auth"; import { CatalogRouter } from "@/contexts/catalog"; -import { createMiddlewareMap } from "@/contexts/common/infrastructure/express"; -import { DealerRouter } from "@/contexts/sales/infrastructure/express"; +import { SalesRouter } from "@/contexts/sales/infrastructure/express"; import { UserRouter } from "@/contexts/users"; import Express from "express"; import { createContextMiddleware } from "./context.middleware"; @@ -15,7 +14,7 @@ export const v1Routes = () => { routes.use((req: Express.Request, res: Express.Response, next: Express.NextFunction) => { res.locals["context"] = createContextMiddleware(); - res.locals["middlewares"] = createMiddlewareMap(); + //res.locals["middlewares"] = createMiddlewareMap(); return next(); }); @@ -27,7 +26,7 @@ export const v1Routes = () => { AuthRouter(routes); UserRouter(routes); CatalogRouter(routes); - DealerRouter(routes); + SalesRouter(routes); return routes; }; diff --git a/server/src/infrastructure/express/app.ts b/server/src/infrastructure/express/app.ts index cf6b777..e607fcc 100644 --- a/server/src/infrastructure/express/app.ts +++ b/server/src/infrastructure/express/app.ts @@ -1,4 +1,3 @@ -import rTracer from "cls-rtracer"; import cors from "cors"; import express from "express"; import helmet from "helmet"; @@ -7,10 +6,9 @@ import responseTime from "response-time"; import { configurePassportAuth } from "@/contexts/auth"; import morgan from "morgan"; import passport from "passport"; -import { initLogger } from "../logger"; import { v1Routes } from "./api/v1"; -const logger = initLogger(rTracer); +//const logger = initLogger(rTracer); // Create Express server const app = express(); @@ -41,7 +39,7 @@ app.use( "Pagination-Page", "Pagination-Limit", ], - }), + }) ); // secure apps by setting various HTTP headers diff --git a/shared/lib/contexts/sales/renamer.sh b/shared/lib/contexts/sales/renamer.sh new file mode 100755 index 0000000..cd9d2e0 --- /dev/null +++ b/shared/lib/contexts/sales/renamer.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Cambia "Dealer" por "Dealer" en todos los archivos y directorios de forma recursiva +find . -depth -name "*Reseller*" | while read file; do + # Obtén el nuevo nombre con 'Reseller' reemplazado por 'Dealer' + newfile=$(echo "$file" | sed 's/Reseller/Dealer/g') + # Renombra el archivo/directorio + mv "$file" "$newfile" +done