metis-desk/modules/companies/src/api/application/mailbox-input.mapper.ts
2026-10-10 12:01:58 +02:00

69 lines
2.1 KiB
TypeScript

import { Result } from "@repo/rdx-utils";
import type { Mailbox } from "../domain/mailbox.aggregate";
import type { MailboxUse } from "../domain/mailbox-use.aggregate";
import type { MailboxInput, MailboxUseInput } from "../domain/mailbox-values";
import { MailboxError } from "../domain/mailbox-values";
import { MailboxUseValues } from "../domain/value-objects/mailbox-use-values.vo";
import { MailboxValues } from "../domain/value-objects/mailbox-values.vo";
import type { MailboxContext } from "./mailbox.repository";
export function mapMailboxInput(input: MailboxInput, context: MailboxContext, previous?: Mailbox) {
const values = MailboxValues.create(input);
if (!values.isSuccess) {
return values;
}
if (
context.mailboxes.some(
(item) =>
item.id.toPrimitive() !== previous?.id.toPrimitive() &&
item.values.address.equals(values.data.address)
)
) {
return Result.fail(new MailboxError("MAILBOX_EXISTS"));
}
const accountId = values.data.accountId.getOrUndefined();
if (
accountId &&
!context.items.some((item) => item.id.equals(accountId) && item.values.kind === "account")
) {
return Result.fail(new MailboxError("MAILBOX_SCOPE_MISMATCH"));
}
return values;
}
export function mapMailboxUseInput(
input: MailboxUseInput,
context: MailboxContext,
previous?: MailboxUse
) {
const values = MailboxUseValues.create(input);
if (!values.isSuccess) {
return values;
}
const mailbox = context.mailboxes.find((item) => item.id.equals(values.data.mailboxId));
const person = context.people.find((item) => item.id.equals(values.data.personId));
if (!(mailbox && person)) {
return Result.fail(new MailboxError("MAILBOX_SCOPE_MISMATCH"));
}
if (!(previous || (mailbox.values.active && person.active))) {
return Result.fail(new MailboxError("MAILBOX_UNAVAILABLE"));
}
if (
context.uses.some(
(item) =>
item.id.toPrimitive() !== previous?.id.toPrimitive() && item.values.overlaps(values.data)
)
) {
return Result.fail(new MailboxError("MAILBOX_USE_OVERLAP"));
}
return values;
}