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 IGetDealerUseCaseRequest extends IUseCaseRequest { id: UniqueID; } export type GetDealerResponseOrError = | Result // Misc errors (value objects) | Result; // Success! export class GetDealerUseCase implements IUseCase> { private _adapter: ISequelizeAdapter; private _repositoryManager: IRepositoryManager; constructor(props: { adapter: ISequelizeAdapter; repositoryManager: IRepositoryManager }) { this._adapter = props.adapter; this._repositoryManager = props.repositoryManager; } private getRepositoryByName(name: string) { return this._repositoryManager.getRepository(name); } async execute(request: IGetDealerUseCaseRequest): Promise { const { id } = request; // Validación de datos // No hay en este caso return await this.findDealer(id); } private async findDealer(id: UniqueID) { const transaction = this._adapter.startTransaction(); const dealerRepoBuilder = this.getRepositoryByName("Dealer"); let dealer: Dealer | null = null; try { await transaction.complete(async (t) => { const dealerRepo = dealerRepoBuilder({ transaction: t }); dealer = await dealerRepo.getById(id); }); if (!dealer) { return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Dealer not found")); } return Result.ok(dealer!); } catch (error: unknown) { const _error = error as IInfrastructureError; return Result.fail( UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Error al consultar el usuario", _error) ); } } }