import { Injectable } from '@nestjs/common'; import type { ScopeVector } from '@insignia/iios-contracts'; import { WebhookAdapter, type ChannelAdapter } from '@insignia/iios-adapter-sdk'; export interface AdapterConfig { secret: string; scope: ScopeVector; } /** * Registers channel adapters + their per-channel config (secret + scope). In P5 * one reference WebhookAdapter backs several channelTypes (WEBHOOK/EMAIL/WHATSAPP) * so the fixtures exercise the same anti-corruption pipeline. Secrets come from * ADAPTER_SECRETS (JSON map); scope defaults to the demo scope. */ @Injectable() export class AdapterRegistry { private readonly adapters = new Map(); constructor() { let secrets: Record = {}; try { secrets = JSON.parse(process.env.ADAPTER_SECRETS ?? '{}'); } catch { secrets = {}; } const scope: ScopeVector = { orgId: process.env.ADAPTER_ORG ?? 'org_portal-demo', appId: process.env.ADAPTER_APP ?? 'portal-demo', }; for (const channelType of ['WEBHOOK', 'EMAIL', 'WHATSAPP']) { this.adapters.set(channelType, { adapter: new WebhookAdapter(channelType), config: { secret: secrets[channelType] ?? 'dev-adapter-secret', scope }, }); } } get(channelType: string): { adapter: ChannelAdapter; config: AdapterConfig } | undefined { return this.adapters.get(channelType); } }