metis-desk/modules/assets/src/api/application/asset.repository.ts

52 lines
2.1 KiB
TypeScript
Raw Normal View History

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";
2026-10-04 19:04:14 +00:00
import type { AssetRelationship } from "../domain/asset-relationship.aggregate";
2026-10-07 16:08:48 +00:00
import type { Brand } from "../domain/brand.aggregate";
2026-10-09 08:38:19 +00:00
import type { AssetValues } from "../domain/value-objects/asset-values.vo";
2026-10-04 19:04:14 +00:00
import type { Workstation } from "../domain/workstation.aggregate";
export type InventoryContext = Readonly<{
2026-10-04 19:04:14 +00:00
workstations: readonly Workstation[];
catalog: AssetCatalog;
2026-10-07 16:08:48 +00:00
brands: readonly Brand[];
assets: readonly Asset[];
2026-10-04 19:04:14 +00:00
relationships: readonly AssetRelationship[];
sites: readonly UniqueID[];
people: readonly { id: UniqueID; active: boolean }[];
actorNames: ReadonlyMap<string, string>;
}>;
export interface IAssetRepository {
removeRelationship(company: UniqueID, id: UniqueID): Promise<Result<void, AssetCatalogError>>;
2026-10-04 19:04:14 +00:00
saveWorkstation(
companyId: UniqueID,
action: (context: InventoryContext) => Result<Workstation, AssetCatalogError>
): Promise<
Result<{ workstation: Workstation; actorNames: ReadonlyMap<string, string> }, AssetCatalogError>
>;
get(companyId: UniqueID): Promise<Result<InventoryContext, AssetCatalogError>>;
2026-10-04 19:04:14 +00:00
saveRelationship(
companyId: UniqueID,
action: (context: InventoryContext) => Result<AssetRelationship, AssetCatalogError>
): Promise<
Result<
{ relationship: AssetRelationship; actorNames: ReadonlyMap<string, string> },
AssetCatalogError
>
>;
save(
companyId: UniqueID,
action: (context: InventoryContext) => Result<Asset, AssetCatalogError>
): Promise<Result<{ asset: Asset; actorNames: ReadonlyMap<string, string> }, 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>(true);
}