import {z} from 'zod' export type VicidialAgentAPIConfiguration = {url: string, username: string, password: string, source?: string | undefined}; export type VicidialNonAgentAPIConfiguration = {url?: (string | null) | undefined, username?: (string | null) | undefined, password?: (string | null) | undefined, source?: string | undefined}; export type VicidialExternalPBXConfiguration = {type?: 'vicidial' | undefined, agent_api: VicidialAgentAPIConfiguration, non_agent_api?: (VicidialNonAgentAPIConfiguration | null) | undefined, timeout_seconds?: number | undefined}; export type ARIConfigurationRequest = {provider?: 'ari' | undefined, ari_endpoint: string, app_name: string, app_password: string, ws_client_name?: string | undefined, dial_string_template?: string | undefined, external_pbx?: (VicidialExternalPBXConfiguration | null) | undefined}; export type CloudonixConfigurationRequest = {provider?: 'cloudonix' | undefined, bearer_token: string, domain_id: string, application_name?: (string | null) | undefined}; export type ExotelConfigurationRequest = {provider?: 'exotel' | undefined, account_sid: string, api_key: string, api_token: string, api_base_url?: string | undefined, from_numbers?: Array | undefined}; export type PlivoConfigurationRequest = {provider?: 'plivo' | undefined, auth_id: string, auth_token: string, application_id?: (string | null) | undefined}; export type TelnyxConfigurationRequest = {provider?: 'telnyx' | undefined, api_key: string, connection_id?: (string | null) | undefined, webhook_public_key?: (string | null) | undefined}; export type TwilioConfigurationRequest = {provider?: 'twilio' | undefined, account_sid: string, auth_token: string}; export type VobizConfigurationRequest = {provider?: 'vobiz' | undefined, auth_id: string, auth_token: string, application_id?: (string | null) | undefined}; export type VonageConfigurationRequest = {provider?: 'vonage' | undefined, api_key: string, api_secret: string, application_id: string, private_key: string, signature_secret?: (string | null) | undefined}; export type WhatsAppConfigurationRequest = {provider?: 'whatsapp' | undefined, access_token: string, waba_id: string, app_secret: string}; export type TelephonyConfigurationUpdateRequest = {name?: (string | null) | undefined, config?: (ARIConfigurationRequest | CloudonixConfigurationRequest | ExotelConfigurationRequest | PlivoConfigurationRequest | TelnyxConfigurationRequest | TwilioConfigurationRequest | VobizConfigurationRequest | VonageConfigurationRequest | WhatsAppConfigurationRequest | null) | undefined}; export type UpdateApiApiV1OrganizationsTelephonyConfigsConfigIdArgs = {config_id: number, authorization?: (string | null) | undefined, 'X-API-Key'?: (string | null) | undefined, body: TelephonyConfigurationUpdateRequest}; export type UpdateApiApiV1OrganizationsTelephonyConfigsConfigIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const sIPTransportDetails = z.object({transport: z.string(), hostname: z.string(), port: z.number().int(), uri: z.string()}); export const sIPRegionDetails = z.object({region: z.string(), inbound_transports: z.array(sIPTransportDetails), outbound_origin_ip: z.string()}); export const sIPConnectivityDetails = z.object({provider_display_name: z.string(), regions: z.array(sIPRegionDetails)}); export const setupStep = z.object({key: z.string(), title: z.string(), description: z.string(), complete: z.boolean(), blocks_outbound: z.boolean().optional()}); export const providerSetupChecklist = z.object({ready_for_outbound: z.boolean(), outbound_blocked_reason: z.string().nullable(), steps: z.array(setupStep), docs_url: z.string().nullable().optional()}); export const trunkResponse = z.object({id: z.number().int(), name: z.string(), enabled: z.boolean(), settings: z.record(z.string(), z.unknown()), phone_number_count: z.number().int().optional(), created_at: z.string(), updated_at: z.string()}); export const telephonyConfigurationDetail = z.object({id: z.number().int(), name: z.string(), provider: z.string(), connectivity: z.enum(["api", "sip"]).optional(), is_default_outbound: z.boolean(), inactive: z.boolean().optional(), inactive_since: z.string().nullable().optional(), inactive_reason: z.string().nullable().optional(), credentials: z.record(z.string(), z.unknown()), sip_connectivity: sIPConnectivityDetails.nullable().optional(), supports_outbound: z.boolean().optional(), setup_checklist: providerSetupChecklist.nullable().optional(), supports_trunks: z.boolean().optional(), trunks: z.array(trunkResponse).optional(), supports_phone_number_sync: z.boolean().optional(), created_at: z.string(), updated_at: z.string()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Update Telephony Configuration * * PUT /api/v1/organizations/telephony-configs/{config_id} */ export const updateApiApiV1OrganizationsTelephonyConfigsConfigId = async (args: UpdateApiApiV1OrganizationsTelephonyConfigsConfigIdArgs, options?: UpdateApiApiV1OrganizationsTelephonyConfigsConfigIdOptions) => { const {baseUrl = "https://app.dograh.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.authorization != null) headers.set("authorization", String(args.authorization)) if (args['X-API-Key'] != null) headers.set("X-API-Key", String(args['X-API-Key'])) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/organizations/telephony-configs/${encodeURIComponent(String(args.config_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(telephonyConfigurationDetail, await res.json()) };