/** * Container registry for dashboards that need partition key validation * and createIfNotExists support. */ import { Container, PartitionKeyDefinition } from "@azure/cosmos"; import { getDatabase, getCosmosClient } from "./client.js"; import type { ContainerConfig } from "./types.js"; const _registry: Map = new Map(); const _containerCache: Map = new Map(); /** * Register containers with their partition key configuration. * Call once at app startup before any getRegisteredContainer() calls. */ export function registerContainers( definitions: Record, ): void { for (const [name, config] of Object.entries(definitions)) { _registry.set(name, config); } } /** * Get a container that was previously registered. * Throws if the container name is unknown. */ export function getRegisteredContainer(name: string): Container { if (!_registry.has(name)) { throw new Error( `Unknown container '${name}'. Valid: ${[..._registry.keys()].join(", ")}`, ); } let container = _containerCache.get(name); if (!container) { container = getDatabase().container(name); _containerCache.set(name, container); } return container; } /** * Create all registered containers if they don't exist. * Call from a seed script or on first deploy. */ export async function initializeAllContainers(): Promise { const client = getCosmosClient(); const dbId = process.env.COSMOS_DATABASE || "lysnrai"; const { database } = await client.databases.createIfNotExists({ id: dbId }); for (const [name, config] of _registry.entries()) { await database.containers.createIfNotExists({ id: name, partitionKey: { paths: [config.partitionKeyPath], } as PartitionKeyDefinition, ...(config.defaultTtl != null && { defaultTtl: config.defaultTtl }), }); } } /** * Reset the registry (useful for testing). * @internal */ export function _resetRegistry(): void { _registry.clear(); _containerCache.clear(); }