This commit is contained in:
David Arranz 2024-05-23 17:38:41 +02:00
parent 50a6001252
commit 71913c7c73
44 changed files with 418 additions and 173 deletions

View File

@ -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();
},

View File

@ -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);
});

View File

@ -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");

View File

@ -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);
};

View File

@ -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 };

View File

@ -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
);

View File

@ -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)
);
}
}
}

View File

@ -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";

View File

@ -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>;
}

View File

@ -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",

View File

@ -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 {

View File

@ -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";

View File

@ -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;

View File

@ -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 = (

View File

@ -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 {

View File

@ -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";

View File

@ -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(),

View File

@ -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);
}
}
}

View File

@ -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);
};

View File

@ -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(),
};
},
};

View File

@ -0,0 +1 @@
export * from "./GetDealerByUser.presenter";

View File

@ -0,0 +1,5 @@
export * from "./createDealer";
export * from "./deleteDealer";
export * from "./getDealer";
export * from "./listDealers";
export * from "./updateDealer";

View File

@ -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 {

View File

@ -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";

View File

@ -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 {

View File

@ -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";

View File

@ -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(),

View File

@ -1,5 +1 @@
export * from "./createDealer";
export * from "./deleteDealer";
export * from "./getDealer";
export * from "./listDealers";
export * from "./updateDealer";
export * from "./dealers";

View File

@ -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);
};

View File

@ -0,0 +1,3 @@
import { getDealerByUserController } from "../controllers/dealers/getDealerByUser";
export const getDealerMiddleware = getDealerByUserController;

View File

@ -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);
};

View File

@ -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);
};

View File

@ -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 ??

View File

@ -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);

View File

@ -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;

View File

@ -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;
};

View File

@ -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

View 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