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" >; 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; } export interface IAssetDashboardReader extends IInventoryDashboardReader { inactivePeople(companyId?: string): Promise<{ id: string }[]>; } export type DashboardBlock = "summary" | "attention" | "activity" | "companies" | "details"; export interface IDashboardRepository { companyExists(id: string): Promise; read(block: DashboardBlock, query: DashboardDetailsQuery): Promise; } export class DashboardUseCases { constructor(private readonly repository: IDashboardRepository) {} async read(block: DashboardBlock, query: DashboardDetailsQuery) { let normalized = query; if (query.companyId) { const id = UniqueID.create(query.companyId); 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() }; } return Result.ok(await this.repository.read(block, normalized)); } }