metis-desk/modules/resources/src/api/application/resource-inventory.service.ts

58 lines
1.8 KiB
TypeScript
Raw Normal View History

import type { UniqueID } from "@repo/rdx-ddd";
import type { IResourceRepository } from "./resource.repository";
2026-10-10 10:01:58 +00:00
export interface IResourceInventoryService {
list(company: UniqueID): Promise<
readonly {
id: UniqueID;
name: string;
active: boolean;
usage: "application" | "certificate" | null;
expiresOn: string | null;
}[]
>;
}
2026-10-10 10:01:58 +00:00
export class ResourceInventoryService implements IResourceInventoryService {
constructor(private readonly repository: IResourceRepository) {}
2026-10-10 10:01:58 +00:00
async list(company: UniqueID) {
const result = await this.repository.get(company);
2026-10-10 10:01:58 +00:00
if (!result.isSuccess) {
throw new Error("No se pudo consultar el inventario de recursos.");
}
const expiryFieldId = result.data.catalog.definitions
.find((item) => item.stockKey.getOrUndefined() === "field:expires")
?.id.toPrimitive();
2026-10-10 10:01:58 +00:00
return result.data.resources.map((resource) => {
const template = result.data.catalog.definitions.find(
(item) => item.id.toPrimitive() === resource.values.toPrimitive().templateId
);
const data = template?.values.data;
const key = template?.stockKey.getOrUndefined();
const usage: "application" | "certificate" | null =
key === "template:application"
? "application"
: key === "template:certificate"
? "certificate"
: data?.kind === "template"
? (data.usage ?? null)
: null;
const expiresOn = expiryFieldId
? resource.values.toPrimitive().characteristics[expiryFieldId]
: null;
2026-10-10 10:01:58 +00:00
return {
id: resource.id,
name: resource.values.toPrimitive().name,
active: resource.values.toPrimitive().active,
usage,
expiresOn: typeof expiresOn === "string" ? expiresOn : null,
};
});
}
}