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 { IQuoteRepository } from "../../domain"; import { IInfrastructureError } from "@/contexts/common/infrastructure"; import { Quote } from "../../domain/entities/Quote"; export interface IGetQuoteUseCaseRequest extends IUseCaseRequest { id: UniqueID; } export type GetQuoteResponseOrError = | Result // Misc errors (value objects) | Result; // Success! export class GetQuoteUseCase 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: IGetQuoteUseCaseRequest): Promise { const { id } = request; // Validación de datos // No hay en este caso return await this.findQuote(id); } private async findQuote(id: UniqueID) { const transaction = this._adapter.startTransaction(); const QuoteRepoBuilder = this._getQuoteRepository(); let Quote: Quote | null = null; try { await transaction.complete(async (t) => { const QuoteRepo = QuoteRepoBuilder({ transaction: t }); Quote = await QuoteRepo.getById(id); }); if (!Quote) { return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Quote not found")); } return Result.ok(Quote!); } catch (error: unknown) { const _error = error as IInfrastructureError; return Result.fail( UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Error al consultar el usuario", _error) ); } } private _getQuoteRepository() { return this._repositoryManager.getRepository("Quote"); } }