import { UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import { PrinterConfiguration } from "../domain/printer-configuration.aggregate"; import type { PrinterConfigurationInput } from "../domain/printer-configuration-values"; import { PrinterConfigurationError } from "../domain/printer-configuration-values"; import type { IPrinterConfigurationRepository } from "./printer-configuration.repository"; import { mapPrinterInput } from "./printer-configuration-input.mapper"; export class PrinterConfigurationUseCases { constructor(private readonly repository: IPrinterConfigurationRepository) {} get(companyId: string) { const company = UniqueID.create(companyId); return company.isSuccess ? this.repository.get(company.data) : Promise.resolve(Result.fail(new PrinterConfigurationError("INVALID_REQUEST"))); } save( companyId: string, id: string | undefined, input: PrinterConfigurationInput, actorId: string ) { const company = UniqueID.create(companyId); const actor = UniqueID.create(actorId); const identity = id ? UniqueID.create(id) : undefined; if (!(company.isSuccess && actor.isSuccess) || (identity && !identity.isSuccess)) { return Promise.resolve(Result.fail(new PrinterConfigurationError("INVALID_REQUEST"))); } return this.repository.save(company.data, (context) => { const previous = identity?.isSuccess ? context.configurations.find((item) => item.id.equals(identity.data)) : undefined; if (id && !previous) { return Result.fail(new PrinterConfigurationError("PRINTER_CONFIGURATION_NOT_FOUND")); } const values = mapPrinterInput(input, context, previous); if (!values.isSuccess) { return values; } const now = new Date().toISOString(); const candidate = previous ? previous.update(values.data, actor.data, now) : PrinterConfiguration.create(company.data, values.data, actor.data, now); if (!candidate.isSuccess) { return candidate; } return candidate; }); } }