metis-desk/modules/assets/src/api/application/workstation.use-cases.ts

73 lines
2.6 KiB
TypeScript

import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { AssetCatalogError } from "../domain/asset-definition";
import { Workstation } from "../domain/workstation.aggregate";
import type { WorkstationInput } from "../domain/workstation-values";
import type { IAssetRepository } from "./asset.repository";
import { mapWorkstationInput } from "./workstation-input.mapper";
export class WorkstationUseCases {
constructor(private readonly repository: IAssetRepository) {}
remove(companyId: string, id: string) {
const company = UniqueID.create(companyId);
const identity = UniqueID.create(id);
if (!(company.isSuccess && identity.isSuccess)) {
return Promise.resolve(Result.fail(new AssetCatalogError("INVALID_REQUEST")));
}
return this.repository.removeWorkstation(company.data, identity.data);
}
decommission(companyId: string, id: string, actorId: string) {
const company = UniqueID.create(companyId);
const identity = UniqueID.create(id);
const actor = UniqueID.create(actorId);
if (!(company.isSuccess && identity.isSuccess && actor.isSuccess)) {
return Promise.resolve(Result.fail(new AssetCatalogError("INVALID_REQUEST")));
}
return this.repository.saveWorkstation(company.data, (context) => {
const workstation = context.workstations.find((item) => item.id.equals(identity.data));
return workstation
? workstation.decommission(actor.data, new Date().toISOString())
: Result.fail(new AssetCatalogError("WORKSTATION_NOT_FOUND"));
});
}
save(companyId: string, id: string | undefined, input: WorkstationInput, actorId: string) {
const company = UniqueID.create(companyId);
const actor = UniqueID.create(actorId);
const identity = id ? UniqueID.create(id) : undefined;
if (!(company.isSuccess && actor.isSuccess) || (identity && !identity.isSuccess)) {
return Promise.resolve(Result.fail(new AssetCatalogError("INVALID_REQUEST")));
}
return this.repository.saveWorkstation(company.data, (context) => {
const previous = identity?.isSuccess
? context.workstations.find((item) => item.id.equals(identity.data))
: undefined;
if (id && !previous) {
return Result.fail(new AssetCatalogError("WORKSTATION_NOT_FOUND"));
}
const values = mapWorkstationInput(input, context, previous);
if (!values.isSuccess) {
return Result.fail(values.error);
}
const now = new Date().toISOString();
return previous
? previous.update(values.data, actor.data, now)
: Workstation.create(company.data, values.data, actor.data, now);
});
}
}