import type { UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import type { Asset } from "../domain/asset.aggregate"; import type { AssetCatalog } from "../domain/asset-catalog.aggregate"; import { AssetCatalogError } from "../domain/asset-definition"; import type { AssetRelationship } from "../domain/asset-relationship.aggregate"; import type { Brand } from "../domain/brand.aggregate"; import type { AssetValues } from "../domain/value-objects/asset-values.vo"; import type { Workstation } from "../domain/workstation.aggregate"; export type InventoryContext = Readonly<{ workstations: readonly Workstation[]; catalog: AssetCatalog; brands: readonly Brand[]; assets: readonly Asset[]; relationships: readonly AssetRelationship[]; sites: readonly { id: UniqueID; active: boolean }[]; people: readonly { id: UniqueID; active: boolean }[]; actorNames: ReadonlyMap; }>; export interface IAssetRepository { remove( company: UniqueID, id: UniqueID ): Promise< Result< { asset: Asset; actorNames: ReadonlyMap; workstations: readonly Workstation[]; }, AssetCatalogError > >; removeWorkstation(company: UniqueID, id: UniqueID): Promise>; removeRelationship(company: UniqueID, id: UniqueID): Promise>; saveWorkstation( companyId: UniqueID, action: (context: InventoryContext) => Result ): Promise< Result<{ workstation: Workstation; actorNames: ReadonlyMap }, AssetCatalogError> >; get(companyId: UniqueID): Promise>; saveRelationship( companyId: UniqueID, action: (context: InventoryContext) => Result ): Promise< Result< { relationship: AssetRelationship; actorNames: ReadonlyMap }, AssetCatalogError > >; save( companyId: UniqueID, action: (context: InventoryContext) => Result ): Promise< Result< { asset: Asset; actorNames: ReadonlyMap; workstations: readonly Workstation[]; }, AssetCatalogError > >; } export function validateAssetReferences( context: InventoryContext, values: AssetValues, previous?: Asset ) { const next = values.toPrimitive(); if ( next.siteId && !context.sites.some( (site) => site.id.toPrimitive() === next.siteId && (site.active || previous?.values.toPrimitive().siteId === next.siteId) ) ) { return Result.fail(new AssetCatalogError("SITE_NOT_FOUND")); } return Result.ok(true); }