import { Result } from "@repo/rdx-utils"; import { AssetCatalogError } from "../domain/asset-definition"; import { canAssignAsset } from "../domain/asset-state"; 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( (site) => site.id.toPrimitive() === values.siteId && (site.active || previous?.values.toPrimitive().siteId === 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) { const error = memberError(id, values, context, previous); if (error) { return Result.fail(new AssetCatalogError(error)); } } return mapped; } function memberError( id: string, values: WorkstationInput, context: InventoryContext, previous: Workstation | undefined ) { const asset = context.assets.find((item) => item.id.toPrimitive() === id); if (!asset) { return "ASSET_NOT_FOUND"; } if (!values.active) { return undefined; } const previousMembers = previous?.values.assetIds; const retained = previous?.values.active && previousMembers?.some((item) => item.toPrimitive() === id); if (!(retained || canAssignAsset(asset.values.technicalStatus, false))) { return "ASSET_NOT_OPERATIONAL"; } const others = context.workstations.filter( (item) => item.values.active && item.id.toPrimitive() !== previous?.id.toPrimitive() ); const exclusiveElsewhere = others.some((item) => item.values.assetIds.some((assetId) => assetId.toPrimitive() === id) ); if (exclusiveElsewhere) { return "ASSET_IN_WORKSTATION"; } return undefined; }