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; }