/** * Supported DNS provider types. Initially Cloudflare; the abstraction is * designed so additional providers (Route53, Gandi, DigitalOcean…) can be * added by implementing the IDnsProvider class interface in ts/dns/providers/. */ export type TDnsProviderType = 'cloudflare'; /** * Status of the last connection test against a provider. */ export type TDnsProviderStatus = 'untested' | 'ok' | 'error'; /** * Cloudflare-specific credential shape. */ export interface ICloudflareCredentials { apiToken: string; } /** * Discriminated union of all supported provider credential shapes. * Persisted opaquely on `IDnsProvider.credentials`. */ export type TDnsProviderCredentials = | ({ type: 'cloudflare' } & ICloudflareCredentials); /** * A registered DNS provider account. Holds the credentials needed to * call the provider's API and a snapshot of its last health check. */ export interface IDnsProvider { id: string; name: string; type: TDnsProviderType; /** Opaque credentials object — shape depends on `type`. */ credentials: TDnsProviderCredentials; status: TDnsProviderStatus; lastTestedAt?: number; lastError?: string; createdAt: number; updatedAt: number; createdBy: string; } /** * A redacted view of IDnsProvider safe to send to the UI / over the wire. * Strips secret fields from `credentials` while preserving the rest. */ export interface IDnsProviderPublic { id: string; name: string; type: TDnsProviderType; status: TDnsProviderStatus; lastTestedAt?: number; lastError?: string; createdAt: number; updatedAt: number; createdBy: string; /** Whether credentials are configured (true after creation). Never the secret itself. */ hasCredentials: boolean; } /** * A domain reported by a provider's API (not yet imported into dcrouter). */ export interface IProviderDomainListing { /** FQDN of the zone (e.g. 'example.com'). */ name: string; /** Provider's internal zone identifier (zone_id for Cloudflare). */ externalId: string; /** Authoritative nameservers reported by the provider. */ nameservers: string[]; }