.
This commit is contained in:
parent
50a6001252
commit
71913c7c73
@ -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 = <AuthUser>req.user;
|
||||
if (req.isAuthenticated()) {
|
||||
req.authInfo = <AuthUser>req.user;
|
||||
return next();
|
||||
}
|
||||
|
||||
return generateExpressError(req, res, httpStatus.UNAUTHORIZED);
|
||||
|
||||
/*const user = <AuthUser>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 = <AuthUser>req.user;
|
||||
const user = <AuthUser>req.authInfo;
|
||||
if (!user.isAdmin) {
|
||||
return generateExpressError(req, res, httpStatus.UNAUTHORIZED);
|
||||
generateExpressError(req, res, httpStatus.UNAUTHORIZED);
|
||||
}
|
||||
next();
|
||||
},
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -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");
|
||||
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
@ -3,25 +3,16 @@ import Express from "express";
|
||||
const registeredMiddlewares: Record<string, Express.RequestHandler> = {};
|
||||
|
||||
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<string>) {
|
||||
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<string, Express.RequestHandler>();
|
||||
}
|
||||
|
||||
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 };
|
||||
|
||||
@ -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
|
||||
);
|
||||
|
||||
@ -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<never, IUseCaseError> // Misc errors (value objects)
|
||||
| Result<Dealer, never>; // Success!
|
||||
|
||||
export class GetDealerByUserUseCase
|
||||
implements
|
||||
IUseCase<IGetDealerByUserByUserUseCaseRequest, Promise<GetDealerByUserResponseOrError>>
|
||||
{
|
||||
private _adapter: ISequelizeAdapter;
|
||||
private _repositoryManager: IRepositoryManager;
|
||||
|
||||
constructor(props: { adapter: ISequelizeAdapter; repositoryManager: IRepositoryManager }) {
|
||||
this._adapter = props.adapter;
|
||||
this._repositoryManager = props.repositoryManager;
|
||||
}
|
||||
|
||||
private getRepositoryByName<T>(name: string) {
|
||||
return this._repositoryManager.getRepository<T>(name);
|
||||
}
|
||||
|
||||
async execute(
|
||||
request: IGetDealerByUserByUserUseCaseRequest
|
||||
): Promise<GetDealerByUserResponseOrError> {
|
||||
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<IDealerRepository>("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>(dealer!);
|
||||
} catch (error: unknown) {
|
||||
const _error = error as IInfrastructureError;
|
||||
return Result.fail(
|
||||
UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Error al consultar el usuario", _error)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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";
|
||||
|
||||
@ -11,4 +11,6 @@ export interface IDealerRepository extends IRepository<any> {
|
||||
findAll(queryCriteria?: IQueryCriteria): Promise<ICollection<Dealer>>;
|
||||
|
||||
removeById(id: UniqueID): Promise<void>;
|
||||
|
||||
getByUserId(userId: UniqueID): Promise<Dealer | null>;
|
||||
}
|
||||
|
||||
@ -52,6 +52,29 @@ export class DealerRepository extends SequelizeRepository<Dealer> implements IDe
|
||||
return this.mapper.mapToDomain(rawDealer);
|
||||
}
|
||||
|
||||
public async getByUserId(userId: UniqueID): Promise<Dealer | null> {
|
||||
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<ICollection<any>> {
|
||||
const { rows, count } = await this._findAll(
|
||||
"Dealer_Model",
|
||||
|
||||
@ -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 {
|
||||
@ -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";
|
||||
|
||||
@ -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;
|
||||
@ -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 = (
|
||||
@ -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 {
|
||||
@ -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";
|
||||
|
||||
@ -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(),
|
||||
@ -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<any> {
|
||||
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 = <Dealer>result.object;
|
||||
|
||||
return this.ok<IGetDealerResponse_DTO>(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
};
|
||||
@ -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(),
|
||||
};
|
||||
},
|
||||
};
|
||||
@ -0,0 +1 @@
|
||||
export * from "./GetDealerByUser.presenter";
|
||||
@ -0,0 +1,5 @@
|
||||
export * from "./createDealer";
|
||||
export * from "./deleteDealer";
|
||||
export * from "./getDealer";
|
||||
export * from "./listDealers";
|
||||
export * from "./updateDealer";
|
||||
@ -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 {
|
||||
@ -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";
|
||||
|
||||
@ -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 {
|
||||
@ -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";
|
||||
|
||||
@ -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(),
|
||||
@ -1,5 +1 @@
|
||||
export * from "./createDealer";
|
||||
export * from "./deleteDealer";
|
||||
export * from "./getDealer";
|
||||
export * from "./listDealers";
|
||||
export * from "./updateDealer";
|
||||
export * from "./dealers";
|
||||
|
||||
@ -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);
|
||||
};
|
||||
@ -0,0 +1,3 @@
|
||||
import { getDealerByUserController } from "../controllers/dealers/getDealerByUser";
|
||||
|
||||
export const getDealerMiddleware = getDealerByUserController;
|
||||
@ -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);
|
||||
};
|
||||
@ -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);
|
||||
};
|
||||
|
||||
@ -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 ??
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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
|
||||
|
||||
9
shared/lib/contexts/sales/renamer.sh
Executable file
9
shared/lib/contexts/sales/renamer.sh
Executable file
@ -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
|
||||
Loading…
Reference in New Issue
Block a user