This commit is contained in:
David Arranz 2025-02-21 12:25:46 +01:00
parent 829c839f9b
commit c8d4f4fa52
19 changed files with 109 additions and 68 deletions

View File

@ -1,4 +1,4 @@
import { Result } from "@common/helpers"; import { Collection, Result } from "@common/helpers";
import { ITransactionManager } from "@common/infrastructure/database"; import { ITransactionManager } from "@common/infrastructure/database";
import { User } from "@contexts/auth/domain"; import { User } from "@contexts/auth/domain";
import { IUserService } from "@contexts/auth/domain/services"; import { IUserService } from "@contexts/auth/domain/services";
@ -9,9 +9,9 @@ export class ListUsersUseCase {
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public async execute(): Promise<Result<User[], Error>> { public execute(): Promise<Result<Collection<User>, Error>> {
return await this.transactionManager.complete(async (transaction) => { return this.transactionManager.complete((transaction) => {
return await this.userService.findUsers(transaction); return this.userService.findUsers(transaction);
}); });
} }
} }

View File

@ -1,8 +1,8 @@
import { UniqueID } from "@common/domain"; import { UniqueID } from "@common/domain";
import { Result } from "@common/helpers"; import { Collection, Result } from "@common/helpers";
import { User } from "../aggregates"; import { User } from "../aggregates";
export interface IUserService { export interface IUserService {
findUsers(transaction?: any): Promise<Result<User[], Error>>; findUsers(transaction?: any): Promise<Result<Collection<User>, Error>>;
findUserById(userId: UniqueID, transaction?: any): Promise<Result<User>>; findUserById(userId: UniqueID, transaction?: any): Promise<Result<User>>;
} }

View File

@ -0,0 +1,17 @@
import { Collection, Result } from "@common/helpers";
import { ITransactionManager } from "@common/infrastructure/database";
import { Company } from "@contexts/companies/domain";
import { ICompanyService } from "@contexts/companies/domain/services/company-service.interface";
export class ListCompaniesUseCase {
constructor(
private readonly companyService: ICompanyService,
private readonly transactionManager: ITransactionManager
) {}
public execute(): Promise<Result<Collection<Company>, Error>> {
return this.transactionManager.complete((transaction) => {
return this.companyService.findCompanies(transaction);
});
}
}

View File

@ -1,17 +0,0 @@
import { Result } from "@common/domain";
import { ITransactionManager } from "@common/infrastructure/database";
import { User } from "@contexts/auth/domain";
import { IUserService } from "@contexts/auth/domain/services";
export class ListCompaniesUseCase {
constructor(
private readonly userService: IUserService,
private readonly transactionManager: ITransactionManager
) {}
public async execute(): Promise<Result<User[], Error>> {
return await this.transactionManager.complete(async (transaction) => {
return await this.userService.findCompanies(transaction);
});
}
}

View File

@ -1 +1,9 @@
export interface ICompanyRepository {} import { EmailAddress, UniqueID } from "@common/domain";
import { Collection, Result } from "@common/helpers";
import { Company } from "../aggregates";
export interface ICompanyRepository {
findAll(transaction?: any): Promise<Result<Collection<Company>, Error>>;
findById(id: UniqueID, transaction?: any): Promise<Result<Company, Error>>;
findByEmail(email: EmailAddress, transaction?: any): Promise<Result<Company, Error>>;
}

View File

@ -1,7 +1,8 @@
import { Result, UniqueID } from "@common/domain"; import { UniqueID } from "@common/domain";
import { Collection, Result } from "@common/helpers";
import { Company } from "../aggregates"; import { Company } from "../aggregates";
export interface ICompanyService { export interface ICompanyService {
findCompanies(transaction?: any): Promise<Result<Company[], Error>>; findCompanies(transaction?: any): Promise<Result<Collection<Company>, Error>>;
findCompanyById(userId: UniqueID, transaction?: any): Promise<Result<Company>>; findCompanyById(userId: UniqueID, transaction?: any): Promise<Result<Company>>;
} }

View File

@ -1,19 +1,20 @@
import { Result, UniqueID } from "@common/domain"; import { UniqueID } from "@common/domain";
import { Collection, Result } from "@common/helpers";
import { Company, ICompanyRepository } from ".."; import { Company, ICompanyRepository } from "..";
import { ICompanyService } from "./company-service.interface"; import { ICompanyService } from "./company-service.interface";
export class CompanyService implements ICompanyService { export class CompanyService implements ICompanyService {
constructor(private readonly companyRepository: ICompanyRepository) {} constructor(private readonly companyRepository: ICompanyRepository) {}
async findCompanies(transaction?: any): Promise<Result<Company[], Error>> { async findCompanies(transaction?: any): Promise<Result<Collection<Company>, Error>> {
const companysOrError = await this.companyRepository.findAll(transaction); const companysOrError = await this.companyRepository.findAll(transaction);
if (companysOrError.isFailure) { if (companysOrError.isFailure) {
return Result.fail(companysOrError.error); return Result.fail(companysOrError.error);
} }
// Solo devolver usuarios activos // Solo devolver usuarios activos
const activeCompanies = companysOrError.data.filter((company) => company /*.isActive*/); const activeCompanies = companysOrError.data.filter((company) => company.isActive);
return Result.ok(activeCompanies); return Result.ok(new Collection(activeCompanies));
} }
async findCompanyById(companyId: UniqueID, transaction?: any): Promise<Result<Company>> { async findCompanyById(companyId: UniqueID, transaction?: any): Promise<Result<Company>> {

View File

@ -1,3 +1,2 @@
export * from "./mappers"; export * from "./mappers";
export * from "./passport";
export * from "./sequelize"; export * from "./sequelize";

View File

@ -1,15 +1,16 @@
import { SequelizeTransactionManager } from "@common/infrastructure"; import { SequelizeTransactionManager } from "@common/infrastructure";
import { ListcompaniesUseCase } from "@contexts/auth/application/list-companies/list-companies.use-case"; import { ListCompaniesUseCase } from "@contexts/companies/application/list-companies/list-companies.use-case";
import { userRepository } from "@contexts/auth/infraestructure"; import { CompanyService } from "@contexts/companies/domain/services/company.service";
import { ListcompaniesController } from "./list-companies.controller"; import { companyRepository } from "@contexts/companies/infraestructure";
import { listcompaniesPresenter } from "./list-companies.presenter"; import { ListCompaniesController } from "./list-companies.controller";
import { listCompaniesPresenter } from "./list-companies.presenter";
export const listcompaniesController = () => { export const listCompaniesController = () => {
const transactionManager = new SequelizeTransactionManager(); const transactionManager = new SequelizeTransactionManager();
const companieservice = new companieservice(userRepository); const companyService = new CompanyService(companyRepository);
const useCase = new ListcompaniesUseCase(companieservice, transactionManager); const useCase = new ListCompaniesUseCase(companyService, transactionManager);
const presenter = listcompaniesPresenter; const presenter = listCompaniesPresenter;
return new ListcompaniesController(useCase, presenter); return new ListCompaniesController(useCase, presenter);
}; };

View File

@ -1,17 +1,17 @@
import { ExpressController } from "@common/presentation"; import { ExpressController } from "@common/presentation";
import { ListCompaniesUseCase } from "@contexts/companies/application/list-companies/list-users.use-case"; import { ListCompaniesUseCase } from "@contexts/companies/application/list-companies/list-companies.use-case";
import { IListCompaniesPresenter } from "./list-companies.presenter"; import { IListCompaniesPresenter } from "./list-companies.presenter";
export class ListcompaniesController extends ExpressController { export class ListCompaniesController extends ExpressController {
public constructor( public constructor(
private readonly listcompanies: ListCompaniesUseCase, private readonly listCompanies: ListCompaniesUseCase,
private readonly presenter: IListCompaniesPresenter private readonly presenter: IListCompaniesPresenter
) { ) {
super(); super();
} }
protected async executeImpl() { protected async executeImpl() {
const companiesOrError = await this.listcompanies.execute(); const companiesOrError = await this.listCompanies.execute();
if (companiesOrError.isFailure) { if (companiesOrError.isFailure) {
return this.handleError(companiesOrError.error); return this.handleError(companiesOrError.error);

View File

@ -1,4 +1,4 @@
import { Collection, ensureString } from "@common/helpers"; import { Collection, ensureBoolean, ensureNumber, ensureString } from "@common/helpers";
import { Company } from "@contexts/companies/domain"; import { Company } from "@contexts/companies/domain";
import { IListCompaniesResponseDTO } from "../../dto"; import { IListCompaniesResponseDTO } from "../../dto";

View File

@ -0,0 +1,5 @@
export * from "./aggregates";
export * from "./entities";
export * from "./events";
export * from "./repositories";
export * from "./value-objects";

View File

@ -0,0 +1,2 @@
export * from "./mappers";
export * from "./sequelize";

View File

@ -0,0 +1,2 @@
export * from "./controllers";
export * from "./dto";

View File

@ -0,0 +1,20 @@
import { validateRequestDTO } from "@common/presentation";
import { checkTabContext } from "@contexts/auth/infraestructure";
import { listCompaniesController, ListCompaniesSchema } from "@contexts/companies/presentation";
import { NextFunction, Request, Response, Router } from "express";
export const companiesRouter = (appRouter: Router) => {
const companiesRoutes: Router = Router({ mergeParams: true });
companiesRoutes.get(
"/",
validateRequestDTO(ListCompaniesSchema),
checkTabContext,
//checkUser,
(req: Request, res: Response, next: NextFunction) => {
listCompaniesController().execute(req, res, next);
}
);
appRouter.use("/companies", companiesRoutes);
};

View File

@ -1,20 +0,0 @@
import { validateRequestDTO } from "@common/presentation";
import { checkTabContext, checkUser } from "@contexts/auth/infraestructure";
import { ListCompaniesSchema } from "@contexts/companies/presentation";
import { NextFunction, Request, Response, Router } from "express";
export const companyRouter = (appRouter: Router) => {
const companyRoutes: Router = Router({ mergeParams: true });
companyRoutes.get(
"/",
validateRequestDTO(ListCompaniesSchema),
checkTabContext,
checkUser,
(req: Request, res: Response, next: NextFunction) => {
listCompaniesController().execute(req, res, next);
}
);
appRouter.use("/company", companyRoutes);
};

View File

@ -16,5 +16,5 @@ export const userRouter = (appRouter: Router) => {
} }
); );
appRouter.use("/users", authRoutes); appRouter.use("/customers", authRoutes);
}; };

View File

@ -0,0 +1,20 @@
import { validateRequestDTO } from "@common/presentation";
import { checkTabContext, checkUserIsAdmin } from "@contexts/auth/infraestructure";
import { listUsersController, ListUsersSchema } from "@contexts/auth/presentation";
import { NextFunction, Request, Response, Router } from "express";
export const usersRouter = (appRouter: Router) => {
const usersRoutes: Router = Router({ mergeParams: true });
usersRoutes.get(
"/",
validateRequestDTO(ListUsersSchema),
checkTabContext,
checkUserIsAdmin,
(req: Request, res: Response, next: NextFunction) => {
listUsersController().execute(req, res, next);
}
);
appRouter.use("/users", usersRoutes);
};

View File

@ -1,6 +1,7 @@
import { Router } from "express"; import { Router } from "express";
import { authRouter } from "./auth.routes"; import { authRouter } from "./auth.routes";
import { userRouter } from "./user.routes"; import { companiesRouter } from "./companies.routes";
import { usersRouter } from "./users.routes";
export const v1Routes = () => { export const v1Routes = () => {
const routes = Router({ mergeParams: true }); const routes = Router({ mergeParams: true });
@ -10,7 +11,8 @@ export const v1Routes = () => {
}); });
authRouter(routes); authRouter(routes);
userRouter(routes); usersRouter(routes);
companiesRouter(routes);
return routes; return routes;
}; };