export interface RegistryRow { id: string; owner_sub: string; tenant_id: string; name: string; url: string; config: unknown; created_at: Date; } export interface PoolLike { query(text: string, values?: unknown[]): Promise<{ rows: Record[] }>; } function toRegistry(row: Record): { id: string; name: string; url: string; config: unknown; createdAt: string; } { return { id: String(row.id), name: String(row.name), url: String(row.url), config: row.config, createdAt: new Date(row.created_at as string).toISOString(), }; } export async function listRegistries(db: PoolLike, ownerSub: string, tenantId: string) { const res = await db.query( "SELECT id, owner_sub, tenant_id, name, url, config, created_at FROM registries WHERE owner_sub = $1 AND tenant_id = $2 ORDER BY created_at DESC", [ownerSub, tenantId], ); return res.rows.map(toRegistry); } export async function createRegistry( db: PoolLike, ownerSub: string, tenantId: string, input: { name: string; url: string; config?: unknown }, ) { const res = await db.query( "INSERT INTO registries (owner_sub, tenant_id, name, url, config) VALUES ($1, $2, $3, $4, $5::jsonb) RETURNING id, owner_sub, tenant_id, name, url, config, created_at", [ownerSub, tenantId, input.name, input.url, JSON.stringify(input.config ?? {})], ); return toRegistry(res.rows[0]); } export async function getRegistry(db: PoolLike, ownerSub: string, tenantId: string, id: string) { const res = await db.query( "SELECT id, owner_sub, tenant_id, name, url, config, created_at FROM registries WHERE owner_sub = $1 AND tenant_id = $2 AND id = $3", [ownerSub, tenantId, id], ); return res.rows[0] ? toRegistry(res.rows[0]) : null; }