metis-desk/modules/companies/src/api/domain/process-task.entity.ts

66 lines
2.2 KiB
TypeScript

import { DomainEntity, Name, UniqueID } from "@repo/rdx-ddd";
import { Maybe } from "@repo/rdx-utils";
import type { ProcessReferenceInput, ProcessTaskInput } from "./process-values";
import { ProcessTaskSchema } from "./process-values";
import { ProcessReferenceValues } from "./value-objects/process-reference-values.vo";
type Values = {
title: Name;
status: ProcessTaskInput["status"];
notes: Maybe<string>;
reference: Maybe<ProcessReferenceValues>;
};
function mapped(value: Omit<ProcessTaskInput, "id">): Values {
const title = Name.create(value.title, 160);
if (!title.isSuccess) {
throw new Error("Título de tarea inconsistente.");
}
return {
title: title.data,
status: value.status,
notes: value.notes ? Maybe.some(value.notes) : Maybe.none(),
reference: value.reference
? Maybe.some(ProcessReferenceValues.create(value.reference))
: Maybe.none(),
};
}
export class ProcessTask extends DomainEntity<Values> {
static create(title: string, reference: ProcessReferenceInput | null = null) {
return new ProcessTask(
Object.freeze(mapped({ title, status: "pending", notes: null, reference }))
);
}
static rehydrate(input: ProcessTaskInput) {
const value = ProcessTaskSchema.parse(input);
const id = UniqueID.create(value.id);
if (!id.isSuccess) {
throw new Error("Identidad de tarea inconsistente.");
}
return new ProcessTask(Object.freeze(mapped(value)), id.data);
}
toPrimitive(): ProcessTaskInput {
return {
id: this.id.toPrimitive(),
title: this.props.title.toPrimitive(),
status: this.props.status,
notes: this.props.notes.getOrUndefined() ?? null,
reference: this.props.reference.getOrUndefined()?.toPrimitive() ?? null,
};
}
sameValues(other: ProcessTask) {
const a = this.props;
const b = other.props;
const ref = a.reference.getOrUndefined();
const otherRef = b.reference.getOrUndefined();
const referencesEqual = ref ? Boolean(otherRef && ref.equals(otherRef)) : !otherRef;
return (
this.id.equals(other.id) &&
a.title.equals(b.title) &&
a.status === b.status &&
a.notes.getOrUndefined() === b.notes.getOrUndefined() &&
referencesEqual
);
}
}