metis-desk/modules/resources/src/common/inventory.ts
2026-10-25 01:19:17 +02:00

75 lines
2.5 KiB
TypeScript

import { z } from "zod/v4";
import {
ResourceInputSchema,
ResourceSpecificationSchema,
ResourceValueSchema,
} from "../api/domain/resource-values";
import { DirectoryDomainSchema } from "./directory-domains";
import { NetworkShareSchema } from "./network-shares";
export type { ResourceCharacteristic, ResourceInput } from "../api/domain/resource-values";
export { ResourceInputSchema, ResourceSpecificationSchema, ResourceValueSchema };
export const InventoryParamsSchema = z.strictObject({ companyId: z.uuid() });
export const ResourceParamsSchema = InventoryParamsSchema.extend({ id: z.uuid() });
export const SaveResourceRequestSchema = z.strictObject({ values: ResourceInputSchema });
export const SetResourceActiveRequestSchema = z.strictObject({ active: z.boolean() });
export const DeleteResourceResponseSchema = z.strictObject({ deleted: z.literal(true) });
export const ResourceRevisionSchema = z.strictObject({
id: z.uuid(),
values: ResourceInputSchema,
specification: ResourceSpecificationSchema.optional(),
actorId: z.uuid(),
actorName: z.string().min(1),
recordedAt: z.iso.datetime(),
});
export const ResourceSchema = z.strictObject({
directory: DirectoryDomainSchema.optional(),
networkShare: NetworkShareSchema.optional(),
id: z.uuid(),
companyId: z.uuid(),
specification: ResourceSpecificationSchema,
values: ResourceInputSchema,
history: z.array(ResourceRevisionSchema).min(1),
});
export type { ResourceOwnership, ResourceScope } from "../api/domain/resource-scope";
export { ResourceOwnershipSchema, ResourceScopeSchema } from "../api/domain/resource-scope";
export const ScopedResourceSchema = z.discriminatedUnion("scope", [
ResourceSchema.extend({ scope: z.literal("company") }),
ResourceSchema.extend({ scope: z.literal("global"), companyId: z.null() }),
]);
export type ScopedResourceDTO = z.infer<typeof ScopedResourceSchema>;
export const ResourceReferenceSchema = z.strictObject({
id: z.uuid(),
kind: z.enum(["account", "system", "environment", "resource_type"]),
name: z.string(),
active: z.boolean(),
systemId: z.uuid().nullable(),
});
export type ResourceReferenceDTO = z.infer<typeof ResourceReferenceSchema>;
export const InventoryResponseSchema = z.strictObject({
resources: z.array(ResourceSchema),
references: z.array(ResourceReferenceSchema).optional(),
});
export const ResourceResponseSchema = z.strictObject({ resource: ResourceSchema });
export type ResourceDTO = z.infer<typeof ResourceSchema>;
export type ResourceResponseDTO = z.infer<typeof ResourceResponseSchema>;