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 UniqueID[]; people: readonly { id: UniqueID; active: boolean }[]; actorNames: ReadonlyMap; }>; export interface IAssetRepository { 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 }, AssetCatalogError>>; } export function validateAssetReferences(context: InventoryContext, values: AssetValues) { const next = values.toPrimitive(); if (next.siteId && !context.sites.some((site) => site.toPrimitive() === next.siteId)) { return Result.fail(new AssetCatalogError("SITE_NOT_FOUND")); } return Result.ok(true); }