import { Result } from "@repo/rdx-utils"; import { AssetCatalogError } from "../domain/asset-definition"; import { WorkstationValues } from "../domain/value-objects/workstation-values.vo"; import type { Workstation } from "../domain/workstation.aggregate"; import type { WorkstationInput } from "../domain/workstation-values"; import type { InventoryContext } from "./asset.repository"; export function mapWorkstationInput( input: WorkstationInput, context: InventoryContext, previous?: Workstation ) { const mapped = WorkstationValues.create(input); if (!mapped.isSuccess) { return mapped; } const values = mapped.data.toPrimitive(); if (values.siteId && !context.sites.some((id) => id.toPrimitive() === values.siteId)) { return Result.fail(new AssetCatalogError("SITE_NOT_FOUND")); } const person = context.people.find((item) => item.id.toPrimitive() === values.personId); if ( values.personId && (!person || (!person.active && previous?.values.toPrimitive().personId !== values.personId)) ) { return Result.fail(new AssetCatalogError("PERSON_UNAVAILABLE")); } for (const id of [...values.assetIds, ...values.sharedAssetIds]) { const asset = context.assets.find((item) => item.id.toPrimitive() === id); if (!asset) { return Result.fail(new AssetCatalogError("ASSET_NOT_FOUND")); } if ( values.active && context.workstations.some( (item) => item.id.toPrimitive() !== previous?.id.toPrimitive() && item.values.active && (item.values.assetIds.some((assetId) => assetId.toPrimitive() === id) || (values.assetIds.includes(id) && item.values.sharedAssetIds.some((assetId) => assetId.toPrimitive() === id))) ) ) { return Result.fail(new AssetCatalogError("ASSET_IN_WORKSTATION")); } } return mapped; }