69 lines
2.1 KiB
TypeScript
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;
|
|
}
|