metis-desk/modules/companies/src/api/application/dashboard.use-cases.ts

54 lines
1.7 KiB
TypeScript
Raw Normal View History

import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import type { DashboardDetailsQuery, DashboardEntryDTO } from "../../common/dashboard";
import { CompanyError } from "../domain/company-error";
export type InventoryEntry = Pick<
DashboardEntryDTO,
"id" | "companyId" | "companyName" | "name" | "recordedAt" | "actorName" | "eventId"
>;
2026-10-10 10:01:58 +00:00
export interface IInventoryDashboardReader {
stats(companyId?: string): Promise<{ companyId: string; count: number }[]>;
entries(
companyId?: string,
issue?: string,
page?: number
): Promise<{ items: InventoryEntry[]; total: number }>;
activity(companyId?: string): Promise<InventoryEntry[]>;
}
2026-10-10 10:01:58 +00:00
export interface IAssetDashboardReader extends IInventoryDashboardReader {
inactivePeople(companyId?: string): Promise<{ id: string }[]>;
}
export type DashboardBlock = "summary" | "attention" | "activity" | "companies" | "details";
2026-10-10 10:01:58 +00:00
export interface IDashboardRepository {
companyExists(id: string): Promise<boolean>;
read(block: DashboardBlock, query: DashboardDetailsQuery): Promise<unknown>;
}
export class DashboardUseCases {
constructor(private readonly repository: IDashboardRepository) {}
2026-10-10 10:01:58 +00:00
async read(block: DashboardBlock, query: DashboardDetailsQuery) {
let normalized = query;
2026-10-10 10:01:58 +00:00
if (query.companyId) {
const id = UniqueID.create(query.companyId);
2026-10-10 10:01:58 +00:00
if (!id.isSuccess) {
return Result.fail(new CompanyError("INVALID_REQUEST"));
}
if (!(await this.repository.companyExists(id.data.toPrimitive()))) {
return Result.fail(new CompanyError("COMPANY_NOT_FOUND"));
}
normalized = { ...query, companyId: id.data.toPrimitive() };
}
2026-10-10 10:01:58 +00:00
return Result.ok(await this.repository.read(block, normalized));
}
}