import { SequelizeRepository, errorMapper } from "@erp/core/api"; import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Collection, Result } from "@repo/rdx-utils"; import { Transaction } from "sequelize"; import { Customer, ICustomerRepository } from "../../domain"; import { ICustomerMapper } from "../mappers/customer.mapper"; import { CustomerModel } from "./customer.model"; export class CustomerRepository extends SequelizeRepository implements ICustomerRepository { //private readonly model: typeof CustomerModel; private readonly mapper!: ICustomerMapper; constructor(mapper: ICustomerMapper) { super(); this.mapper = mapper; } async existsById(id: UniqueID, transaction?: Transaction): Promise> { try { const result = await this._exists(CustomerModel, "id", id.toString(), transaction); return Result.ok(Boolean(result)); } catch (err: unknown) { return Result.fail(errorMapper.toDomainError(err)); } } /** * * Persiste una nueva factura o actualiza una existente. * * @param invoice - El agregado a guardar. * @param transaction - Transacción activa para la operación. * @returns Result */ async save(invoice: Customer, transaction: Transaction): Promise> { try { const data = this.mapper.mapToPersistence(invoice); await CustomerModel.upsert(data, { transaction }); return Result.ok(invoice); } catch (err: unknown) { return Result.fail(errorMapper.toDomainError(err)); } } /** * * Busca una factura por su identificador único. * @param id - UUID de la factura. * @param transaction - Transacción activa para la operación. * @returns Result */ async findById(id: UniqueID, transaction: Transaction): Promise> { try { const rawData = await this._findById(CustomerModel, id.toString(), { transaction }); if (!rawData) { return Result.fail(new Error(`Invoice with id ${id} not found.`)); } return this.mapper.mapToDomain(rawData); } catch (err: unknown) { return Result.fail(errorMapper.toDomainError(err)); } } /** * * Consulta facturas usando un objeto Criteria (filtros, orden, paginación). * @param criteria - Criterios de búsqueda. * @param transaction - Transacción activa para la operación. * @returns Result * * @see Criteria */ public async findByCriteria( criteria: Criteria, transaction: Transaction ): Promise, Error>> { try { const converter = new CriteriaToSequelizeConverter(); const query = converter.convert(criteria); console.debug({ criteria, transaction, query, CustomerModel }); const instances = await CustomerModel.findAll({ ...query, transaction, }); console.debug(instances); return this.mapper.mapArrayToDomain(instances); } catch (err: unknown) { console.error(err); return Result.fail(errorMapper.toDomainError(err)); } } /** * * Elimina o marca como eliminada una factura. * @param id - UUID de la factura a eliminar. * @param transaction - Transacción activa para la operación. * @returns Result */ async deleteById(id: UniqueID, transaction: any): Promise> { try { await this._deleteById(CustomerModel, id, false, transaction); return Result.ok(); } catch (err: unknown) { return Result.fail(errorMapper.toDomainError(err)); } } }