import { DomainEntity, Name, UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import { type InterventionStepInput, InterventionStepInputSchema, InterventionTemplateError, } from "./intervention-template-values"; type Props = Readonly<{ title: Name; instructions: string; required: boolean }>; export class InterventionTemplateStep extends DomainEntity { private constructor(props: Props, id: UniqueID) { super(Object.freeze({ ...props }), id); } static create( input: InterventionStepInput ): Result { const parsed = InterventionStepInputSchema.safeParse(input); if (!parsed.success) { return Result.fail(new InterventionTemplateError("INVALID_REQUEST")); } const title = Name.create(parsed.data.title, 200); const id = UniqueID.create(parsed.data.id); if (!(title.isSuccess && id.isSuccess)) { return Result.fail(new InterventionTemplateError("INVALID_REQUEST")); } return Result.ok( new InterventionTemplateStep( { title: title.data, instructions: parsed.data.instructions, required: parsed.data.required, }, id.data ) ); } static rehydrate(props: Props, id: UniqueID) { return new InterventionTemplateStep(props, id); } equals(other: InterventionTemplateStep) { return ( this.id.equals(other.id) && this.props.title.equals(other.props.title) && this.props.instructions === other.props.instructions && this.props.required === other.props.required ); } toPrimitive(): InterventionStepInput { return { id: this.id.toPrimitive(), title: this.props.title.toPrimitive(), instructions: this.props.instructions, required: this.props.required, }; } }