metis-desk/modules/assets/src/api/application/workstation-input.mapper.ts

50 lines
1.8 KiB
TypeScript

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;
}