import { Maybe } from "@repo/rdx-utils"; import { z } from "zod/v4"; import { AssetRelationship } from "../../domain/asset-relationship.aggregate"; import { AssetRelationshipValues, RelationshipValuesSchema, } from "../../domain/value-objects/asset-relationship-values.vo"; import { inventoryIdentity } from "./asset-persistence.mapper"; import type { RelationshipModel } from "./asset-relationship.model"; export class AssetRelationshipPersistenceMapper { toDomain(row: RelationshipModel) { const values = AssetRelationshipValues.create(RelationshipValuesSchema.parse(row.values)); if ( !(values.isSuccess && z.iso.datetime().safeParse(row.createdAt).success) || (row.endedAt !== null && (!z.iso.datetime().safeParse(row.endedAt).success || row.endedAt < row.createdAt)) || (row.endedAt === null) !== (row.endedBy === null) ) { throw new Error("Relación de activos persistida inconsistente."); } const item = AssetRelationship.rehydrate( { companyId: inventoryIdentity(row.companyId), values: values.data, createdBy: inventoryIdentity(row.createdBy), createdAt: row.createdAt, endedBy: row.endedBy ? Maybe.some(inventoryIdentity(row.endedBy)) : Maybe.none(), endedAt: row.endedAt ? Maybe.some(row.endedAt) : Maybe.none(), }, inventoryIdentity(row.id) ); if ( row.sourceId !== item.values.sourceId.toPrimitive() || row.targetId !== item.values.targetId.toPrimitive() || row.typeId !== item.values.typeId.toPrimitive() || row.activeKey !== (item.active ? `${row.companyId}:${item.values.key()}` : null) ) { throw new Error("Referencias de relación persistidas inconsistentes."); } return item; } toPersistence(item: AssetRelationship) { const values = item.values.toPrimitive(); return { id: item.id.toPrimitive(), companyId: item.companyId.toPrimitive(), sourceId: values.sourceId, targetId: values.targetId, typeId: values.typeId, values, createdBy: item.createdBy.toPrimitive(), createdAt: item.createdAt, endedBy: item.endedBy.getOrUndefined()?.toPrimitive() ?? null, endedAt: item.endedAt.getOrUndefined() ?? null, activeKey: item.active ? `${item.companyId.toPrimitive()}:${item.values.key()}` : null, }; } }