metis-desk/modules/companies/src/api/application/mail-configuration.use-cases.ts
David e099b8c507 feat(mail): implement mail configuration management with persistence and UI components
- Added migration scripts for mail configurations and revisions.
- Created persistence mapper for mail configurations and revisions.
- Developed Sequelize repository for mail configuration management.
- Introduced common schemas and types for mail configurations.
- Implemented API for fetching and saving mail configurations.
- Built React components for mail configuration forms and pages.
- Added internationalization support for mail-related texts in English and Spanish.
- Implemented feedback mechanism for API errors in mail components.
- Created tests for mail configuration components and functionality.
2026-10-04 23:06:07 +02:00

50 lines
2.0 KiB
TypeScript

import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { MailConfiguration } from "../domain/mail-configuration.aggregate";
import {
MailConfigurationError,
type MailConfigurationInput,
} from "../domain/mail-configuration-values";
import type { IMailConfigurationRepository } from "./mail-configuration.repository";
import { mapMailValues, validateMailInput } from "./mail-configuration-input.mapper";
export class MailConfigurationUseCases {
constructor(private readonly repository: IMailConfigurationRepository) {}
get(companyId: string) {
const company = UniqueID.create(companyId);
return company.isSuccess
? this.repository.get(company.data)
: Promise.resolve(Result.fail(new MailConfigurationError("INVALID_REQUEST")));
}
save(companyId: string, id: string | undefined, input: MailConfigurationInput, 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 MailConfigurationError("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 MailConfigurationError("MAIL_CONFIGURATION_NOT_FOUND"));
}
const values = mapMailValues(input);
if (!values.isSuccess) {
return values;
}
const now = new Date().toISOString();
const candidate = previous
? previous.update(values.data, actor.data, now)
: MailConfiguration.create(company.data, values.data, actor.data, now);
if (!candidate.isSuccess) {
return candidate;
}
const validated = validateMailInput(values.data, context, previous);
return validated.isSuccess ? candidate : validated;
});
}
}