metis-desk/modules/assets/src/api/infrastructure/persistence/asset-relationship-persistence.mapper.ts

62 lines
2.3 KiB
TypeScript

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,
};
}
}