This commit is contained in:
David Arranz 2024-09-08 18:46:17 +02:00
parent 69a24e452f
commit 12331c8c48
26 changed files with 92 additions and 157 deletions

View File

@ -1,17 +1,13 @@
import { AuthUser } from "@/contexts/auth/domain";
import { generateExpressError } from "@/contexts/common/infrastructure/express";
import * as express from "express";
import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status";
interface AuthenticatedRequest extends express.Request {
interface AuthenticatedRequest extends Request {
user?: AuthUser;
}
const profileMiddleware = (
req: express.Request,
res: express.Response,
next: express.NextFunction
) => {
const profileMiddleware = (req: Request, res: Response, next: NextFunction) => {
const _req = req as AuthenticatedRequest;
const user = <AuthUser>_req.user;

View File

@ -1,5 +1,5 @@
import { IError_Response_DTO } from "@shared/contexts";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status";
import { URL } from "url";
import { IServerError } from "../../domain/errors";
@ -8,16 +8,16 @@ import { InfrastructureError } from "../InfrastructureError";
import { generateExpressError } from "./ExpressErrorResponse";
export abstract class ExpressController implements IController {
protected req: Express.Request;
protected res: Express.Response;
protected next: Express.NextFunction;
protected req: Request;
protected res: Response;
protected next: NextFunction;
protected serverURL: string = "";
protected file: any;
protected abstract executeImpl(): Promise<void | any>;
public execute(req: Express.Request, res: Express.Response, next: Express.NextFunction): void {
public execute(req: Request, res: Response, next: NextFunction): void {
this.req = req;
this.res = res;
this.next = next;
@ -109,7 +109,7 @@ export abstract class ExpressController implements IController {
return this._errorResponse(httpStatus.SERVICE_UNAVAILABLE, message);
}
private _jsonResponse(statusCode: number, jsonPayload: any): Express.Response<any> {
private _jsonResponse(statusCode: number, jsonPayload: any): Response<any> {
return this.res.status(statusCode).json(jsonPayload).send();
}
@ -117,7 +117,7 @@ export abstract class ExpressController implements IController {
statusCode: number,
message?: string,
error?: Error | InfrastructureError
): Express.Response<IError_Response_DTO> {
): Response<IError_Response_DTO> {
return generateExpressError(this.req, this.res, statusCode, message, error);
}

View File

@ -1,16 +1,16 @@
import { IErrorExtra_Response_DTO, IError_Response_DTO } from "@shared/contexts";
import Express from "express";
import { Request, Response } from "express";
import { UseCaseError } from "../../application";
import { InfrastructureError } from "../InfrastructureError";
import { ProblemDocument, ProblemDocumentExtension } from "./ProblemDocument";
export const generateExpressError = (
req: Express.Request,
res: Express.Response,
req: Request,
res: Response,
statusCode: number,
message?: string,
error?: Error | InfrastructureError
): Express.Response<IError_Response_DTO> => {
): Response<IError_Response_DTO> => {
const context = {
user: res.locals.user || undefined,
params: req.params || undefined,

View File

@ -1,9 +1,9 @@
import Express from "express";
import { NextFunction, Request, RequestHandler, Response } from "express";
const registeredMiddlewares: Record<string, Express.RequestHandler> = {};
const registeredMiddlewares: Record<string, RequestHandler> = {};
function registerMiddleware(name: string, middleware: Express.RequestHandler) {
return (req: Express.Request, res: Express.Response, next: Express.NextFunction) => {
function registerMiddleware(name: string, middleware: RequestHandler) {
return (req: Request, res: Response, next: NextFunction) => {
registeredMiddlewares[name] = middleware;
next();
};
@ -12,7 +12,7 @@ function registerMiddleware(name: string, middleware: Express.RequestHandler) {
function applyMiddleware(middlewares: string | Array<string>) {
const middlewareNames = typeof middlewares === "string" ? [middlewares] : middlewares;
return (req: Express.Request, res: Express.Response, next: Express.NextFunction) => {
return (req: Request, res: Response, next: NextFunction) => {
middlewareNames.forEach((name) => {
const middleware = registeredMiddlewares[name];
if (middleware) {
@ -25,12 +25,12 @@ function applyMiddleware(middlewares: string | Array<string>) {
}
function createMiddlewareMap() {
return new Map<string, Express.RequestHandler>();
return new Map<string, RequestHandler>();
}
function composeMiddleware(middlewareArray: any[]) {
if (!middlewareArray.length) {
return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) {
return function (req: Request, res: Response, next: NextFunction) {
next();
};
}
@ -38,7 +38,7 @@ function composeMiddleware(middlewareArray: any[]) {
const head = middlewareArray[0];
const tail = middlewareArray.slice(1);
return function (req: Express.Request, res: Express.Response, next: Express.NextFunction) {
return function (req: Request, res: Response, next: NextFunction) {
head(req, res, function (err: unknown) {
if (err) return next(err);
composeMiddleware(tail)(req, res, next);

View File

@ -1,8 +1,9 @@
//export * from "./CreateDealer.useCase";
//export * from "./DeleteDealer.useCase";
export * from "./GetDealer.useCase";
export * from "./GetDealerByUser.useCase";
export * from "./ListDealers.useCase";
//export * from "./UpdateDealer.useCase";
/*export * from "./CreateDealer.useCase";
export * from "./DeleteDealer.useCase";
export * from "./UpdateDealer.useCase";*/
export * from "./dealerServices";

View File

@ -1,15 +1,11 @@
import { CreateDealerUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerDealerRepository } from "../../../../Dealer.repository";
import { ISalesContext } from "../../../../Sales.context";
import { CreateDealerController } from "./CreateDealer.controller";
import { CreateDealerPresenter } from "./presenter";
export const createDealerController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const createDealerController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerDealerRepository(context);

View File

@ -1,5 +1,4 @@
import { DeleteDealerUseCase } from "@/contexts/sales/application";
import Express from "express";
import { registerDealerRepository } from "../../../../Dealer.repository";
import { ISalesContext } from "../../../../Sales.context";
import { DeleteDealerController } from "./DeleteDealer.controller";

View File

@ -1,15 +1,11 @@
import { GetDealerUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerDealerRepository } from "../../../../Dealer.repository";
import { ISalesContext } from "../../../../Sales.context";
import { GetDealerController } from "./GetDealer.controller";
import { GetDealerPresenter } from "./presenter";
export const getDealerController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const getDealerController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerDealerRepository(context);

View File

@ -1,15 +1,11 @@
import { GetDealerByUserUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } 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
) => {
export const getDealerByUserController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerDealerRepository(context);

View File

@ -1,15 +1,11 @@
import { ListDealersUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerDealerRepository } from "../../../../Dealer.repository";
import { ISalesContext } from "../../../../Sales.context";
import { ListDealersController } from "./ListDealers.controller";
import { listDealersPresenter } from "./presenter/ListDealers.presenter";
export const listDealersController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const listDealersController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerDealerRepository(context);

View File

@ -1,5 +1,4 @@
import { UpdateDealerUseCase } from "@/contexts/sales/application";
import Express from "express";
import { registerDealerRepository } from "../../../../Dealer.repository";
import { ISalesContext } from "../../../../Sales.context";
import { UpdateDealerController } from "./UpdateDealer.controller";

View File

@ -1,15 +1,11 @@
import { CreateQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { CreateQuoteController } from "./CreateQuote.controller";
import { CreateQuotePresenter } from "./presenter";
export const createQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const createQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,14 +1,10 @@
import { DeleteQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { DeleteQuoteController } from "./DeleteQuote.controller";
export const deleteQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const deleteQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,15 +1,11 @@
import { GetQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { GetQuoteController } from "./GetQuote.controller";
import { GetQuotePresenter } from "./presenter";
export const getQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const getQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,15 +1,11 @@
import { ListQuotesUseCase } from "@/contexts/sales/application";
import { registerQuoteRepository } from "@/contexts/sales/infrastructure/Quote.repository";
import { ISalesContext } from "@/contexts/sales/infrastructure/Sales.context";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { ListQuotesController } from "./ListQuotes.controller";
import { ListQuotesPresenter } from "./presenter";
export const listQuotesController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const listQuotesController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,15 +1,11 @@
import { GetQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { ReportQuotePresenter } from "./reporter/ReportQuote.reporter";
import { ReportQuoteController } from "./ReportQuote.controller";
export const reportQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const reportQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,14 +1,10 @@
import { SetStatusQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { SetStatusQuoteController } from "./SetStatusQuote.controller";
export const setStatusQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const setStatusQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,15 +1,11 @@
import { UpdateQuoteUseCase } from "@/contexts/sales/application";
import Express from "express";
import { NextFunction, Request, Response } from "express";
import { registerQuoteRepository } from "../../../../Quote.repository";
import { ISalesContext } from "../../../../Sales.context";
import { UpdateQuoteController } from "./UpdateQuote.controller";
import { UpdateQuotePresenter } from "./presenter/UpdateQuote.presenter";
export const updateQuoteController = (
req: Express.Request,
res: Express.Response,
next: Express.NextFunction
) => {
export const updateQuoteController = (req: Request, res: Response, next: NextFunction) => {
const context: ISalesContext = res.locals.context;
registerQuoteRepository(context);

View File

@ -1,15 +1,12 @@
import { checkUser } from "@/contexts/auth";
import Express from "express";
import { NextFunction, Request, Response, Router } from "express";
import { listArticlesController } from "../../../../contexts/catalog/infrastructure/express/controllers";
export const catalogRouter = (appRouter: Express.Router) => {
const catalogRoutes: Express.Router = Express.Router({ mergeParams: true });
export const catalogRouter = (appRouter: Router) => {
const catalogRoutes: Router = Router({ mergeParams: true });
catalogRoutes.get(
"/",
checkUser,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
listArticlesController(res.locals["context"]).execute(req, res, next)
catalogRoutes.get("/", checkUser, (req: Request, res: Response, next: NextFunction) =>
listArticlesController(res.locals["context"]).execute(req, res, next)
);
appRouter.use("/catalog", catalogRoutes);

View File

@ -4,10 +4,10 @@ import {
listDealersController,
} from "@/contexts/sales/infrastructure/express/controllers/dealers";
import { getDealerMiddleware } from "@/contexts/sales/infrastructure/express/middlewares/dealerMiddleware";
import Express from "express";
import { Router } from "express";
export const DealerRouter = (appRouter: Express.Router) => {
const dealerRoutes: Express.Router = Express.Router({ mergeParams: true });
export const DealerRouter = (appRouter: Router) => {
const dealerRoutes: Router = Router({ mergeParams: true });
dealerRoutes.get("/", checkisAdmin, listDealersController);
dealerRoutes.get("/:dealerId", checkUser, getDealerMiddleware, getDealerController);

View File

@ -3,23 +3,17 @@ import {
createGetProfileController,
createUpdateProfileController,
} from "@/contexts/profile/infrastructure";
import Express from "express";
import { NextFunction, Request, Response, Router } from "express";
export const profileRouter = (appRouter: Express.Router) => {
const profileRoutes: Express.Router = Express.Router({ mergeParams: true });
export const profileRouter = (appRouter: Router) => {
const profileRoutes: Router = Router({ mergeParams: true });
profileRoutes.get(
"/",
checkUser,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createGetProfileController(res.locals["context"]).execute(req, res, next)
profileRoutes.get("/", checkUser, (req: Request, res: Response, next: NextFunction) =>
createGetProfileController(res.locals["context"]).execute(req, res, next)
);
profileRoutes.put(
"/",
checkUser,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createUpdateProfileController(res.locals["context"]).execute(req, res, next)
profileRoutes.put("/", checkUser, (req: Request, res: Response, next: NextFunction) =>
createUpdateProfileController(res.locals["context"]).execute(req, res, next)
);
appRouter.use("/profile", profileRoutes);

View File

@ -8,10 +8,10 @@ import {
updateQuoteController,
} from "@/contexts/sales/infrastructure/express/controllers";
import { getDealerMiddleware } from "@/contexts/sales/infrastructure/express/middlewares/dealerMiddleware";
import Express from "express";
import { Router } from "express";
export const QuoteRouter = (appRouter: Express.Router) => {
const quoteRoutes: Express.Router = Express.Router({ mergeParams: true });
export const QuoteRouter = (appRouter: Router) => {
const quoteRoutes: Router = Router({ mergeParams: true });
// Users CRUD
quoteRoutes.get("/", checkUser, getDealerMiddleware, listQuotesController);

View File

@ -1,5 +1,5 @@
import { checkAdminOrSelf, checkisAdmin } from "@/contexts/auth";
import Express from "express";
import { NextFunction, Request, Response, Router } from "express";
import {
createCreateUserController,
createDeleteUserController,
@ -8,42 +8,27 @@ import {
createUpdateUserController,
} from "../../../../contexts/users/infrastructure/express/controllers";
export const usersRouter = (appRouter: Express.Router) => {
const userRoutes: Express.Router = Express.Router({ mergeParams: true });
export const usersRouter = (appRouter: Router) => {
const userRoutes: Router = Router({ mergeParams: true });
userRoutes.get(
"/",
checkisAdmin,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createListUsersController(res.locals["context"]).execute(req, res, next)
userRoutes.get("/", checkisAdmin, (req: Request, res: Response, next: NextFunction) =>
createListUsersController(res.locals["context"]).execute(req, res, next)
);
userRoutes.get(
"/:userId",
checkAdminOrSelf,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createGetUserController(res.locals["context"]).execute(req, res, next)
userRoutes.get("/:userId", checkAdminOrSelf, (req: Request, res: Response, next: NextFunction) =>
createGetUserController(res.locals["context"]).execute(req, res, next)
);
userRoutes.post(
"/",
checkisAdmin,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createCreateUserController(res.locals["context"]).execute(req, res, next)
userRoutes.post("/", checkisAdmin, (req: Request, res: Response, next: NextFunction) =>
createCreateUserController(res.locals["context"]).execute(req, res, next)
);
userRoutes.put(
"/:userId",
checkisAdmin,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createUpdateUserController(res.locals["context"]).execute(req, res, next)
userRoutes.put("/:userId", checkisAdmin, (req: Request, res: Response, next: NextFunction) =>
createUpdateUserController(res.locals["context"]).execute(req, res, next)
);
userRoutes.delete(
"/:userId",
checkisAdmin,
(req: Express.Request, res: Express.Response, next: Express.NextFunction) =>
createDeleteUserController(res.locals["context"]).execute(req, res, next)
userRoutes.delete("/:userId", checkisAdmin, (req: Request, res: Response, next: NextFunction) =>
createDeleteUserController(res.locals["context"]).execute(req, res, next)
);
appRouter.use("/users", userRoutes);

View File

@ -1,4 +1,4 @@
import Express from "express";
import { NextFunction, Request, Response, Router } from "express";
import { createContextMiddleware } from "./context.middleware";
import {
DealerRouter,
@ -10,13 +10,13 @@ import {
} from "./routes";
export const v1Routes = () => {
const routes = Express.Router({ mergeParams: true });
const routes = Router({ mergeParams: true });
routes.get("/hello", (req, res) => {
res.send("Hello world!");
});
routes.use((req: Express.Request, res: Express.Response, next: Express.NextFunction) => {
routes.use((req: Request, res: Response, next: NextFunction) => {
res.locals["context"] = createContextMiddleware();
//res.locals["middlewares"] = createMiddlewareMap();

View File

@ -2,7 +2,7 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"types": ["jest"],
//"baseUrl": "./src",
"baseUrl": "./src",
"moduleResolution": "node",
"paths": {
"@/*": ["./src/*"],

View File

@ -75,6 +75,14 @@
"src/**/*.test.*",
"node_modules",
"src/**/firebird/*"
"src/**/firebird/*",
"src/**/CreateDealer.useCase.ts",
"src/**/UpdateDealer.useCase.ts",
"src/**/DeleteDealer.useCase.ts",
"src/**/createDealer/*",
"src/**/updateDealer/*",
"src/**/deleteDealer/*"
]
}