2026-10-04 19:04:14 +00:00
|
|
|
import { Maybe } from "@repo/rdx-utils";
|
|
|
|
|
import { z } from "zod/v4";
|
|
|
|
|
|
|
|
|
|
import { AssetRelationship } from "../../domain/asset-relationship.aggregate";
|
|
|
|
|
import {
|
|
|
|
|
AssetRelationshipValues,
|
|
|
|
|
RelationshipValuesSchema,
|
2026-10-09 08:38:19 +00:00
|
|
|
} from "../../domain/value-objects/asset-relationship-values.vo";
|
2026-10-04 19:04:14 +00:00
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|