import {z} from 'zod' export type DbaasServiceName = string; export type JsonSchemaPgbouncer = {min_pool_size?: number | undefined, ignore_startup_parameters?: (Array<'extra_float_digits' | 'search_path'>) | undefined, server_lifetime?: number | undefined, autodb_pool_mode?: ('transaction' | 'session' | 'statement') | undefined, server_idle_timeout?: number | undefined, autodb_max_db_connections?: number | undefined, max_prepared_statements?: number | undefined, server_reset_query_always?: boolean | undefined, autodb_pool_size?: number | undefined, autodb_idle_timeout?: number | undefined}; export type EnumPgVariant = 'timescale' | 'aiven'; export type JsonSchemaTimescaledb = {max_background_workers?: number | undefined}; export type JsonSchemaPgaudit = {role?: string | undefined, log_parameter?: boolean | undefined, log_rows?: boolean | undefined, log_level?: ('debug1' | 'debug2' | 'debug3' | 'debug4' | 'debug5' | 'info' | 'notice' | 'warning' | 'log') | undefined, log_relation?: boolean | undefined, log_statement_once?: boolean | undefined, log_max_string_length?: number | undefined, log_catalog?: boolean | undefined, log_nested_statements?: boolean | undefined, log_statement?: boolean | undefined, log_client?: boolean | undefined, feature_enabled?: boolean | undefined, log?: (Array<'all' | 'ddl' | 'function' | 'misc' | 'misc_set' | 'read' | 'role' | 'write'>) | undefined, log_parameter_max_size?: number | undefined}; export type EnumPgSynchronousReplication = 'quorum' | 'off'; export type JsonSchemaPglookout = {max_failover_replication_time_lag?: number | undefined}; export type DbaasPgTargetVersions = '14' | '17' | '15' | '18' | '13' | '16'; export type JsonSchemaPg = {track_activity_query_size?: number | undefined, timezone?: string | undefined, track_io_timing?: ('off' | 'on') | undefined, 'pg_stat_monitor.pgsm_enable_query_plan'?: boolean | undefined, max_files_per_process?: number | undefined, 'pg_stat_monitor.pgsm_max_buckets'?: number | undefined, io_max_concurrency?: number | undefined, wal?: ({max_slot_wal_keep_size?: number | undefined, max_wal_senders?: number | undefined, wal_sender_timeout?: number | undefined, wal_writer_delay?: number | undefined}) | undefined, default_toast_compression?: ('lz4' | 'pglz') | undefined, deadlock_timeout?: number | undefined, idle_in_transaction_session_timeout?: number | undefined, max_pred_locks_per_transaction?: number | undefined, max_replication_slots?: number | undefined, max_sync_workers_per_subscription?: number | undefined, autovacuum?: ({log_autovacuum_min_duration?: number | undefined, autovacuum_vacuum_cost_limit?: number | undefined, autovacuum_max_workers?: number | undefined, autovacuum_vacuum_threshold?: number | undefined, autovacuum_naptime?: number | undefined, autovacuum_vacuum_scale_factor?: number | undefined, autovacuum_vacuum_cost_delay?: number | undefined, autovacuum_analyze_scale_factor?: number | undefined, autovacuum_analyze_threshold?: number | undefined, autovacuum_freeze_max_age?: number | undefined}) | undefined, max_parallel_workers_per_gather?: number | undefined, io_combine_limit?: number | undefined, password_encryption?: ('md5' | 'scram-sha-256' | null) | undefined, io_workers?: number | undefined, 'pg_partman_bgw.interval'?: number | undefined, log_line_prefix?: (''pid=%p,user=%u,db=%d,app=%a,client=%h '' | ''pid=%p,user=%u,db=%d,app=%a,client=%h,txid=%x,qid=%Q '' | ''%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '' | ''%m [%p] %q[user=%u,db=%d,app=%a] '') | undefined, log_temp_files?: number | undefined, max_locks_per_transaction?: number | undefined, track_commit_timestamp?: ('off' | 'on') | undefined, track_functions?: ('all' | 'pl' | 'none') | undefined, io_max_combine_limit?: number | undefined, io_method?: ('worker' | 'sync' | 'io_uring') | undefined, max_stack_depth?: number | undefined, max_parallel_workers?: number | undefined, 'pg_partman_bgw.role'?: string | undefined, max_logical_replication_workers?: number | undefined, max_prepared_transactions?: number | undefined, max_worker_processes?: number | undefined, 'pg_stat_statements.track'?: ('all' | 'top' | 'none') | undefined, temp_file_limit?: number | undefined, log_error_verbosity?: ('TERSE' | 'DEFAULT' | 'VERBOSE') | undefined, log_min_duration_statement?: number | undefined, max_standby_streaming_delay?: number | undefined, jit?: boolean | undefined, max_standby_archive_delay?: number | undefined, 'bg-writer'?: ({bgwriter_delay?: number | undefined, bgwriter_flush_after?: number | undefined, bgwriter_lru_maxpages?: number | undefined, bgwriter_lru_multiplier?: number | undefined}) | undefined}; export type EnumMigrationMethod = 'dump' | 'replication'; export type CreateApiDbaasPostgresNameArgs = {name: DbaasServiceName, body: {'pgbouncer-settings'?: JsonSchemaPgbouncer | undefined, 'backup-schedule'?: ({'backup-hour'?: (number | null) | undefined, 'backup-minute'?: (number | null) | undefined}) | undefined, variant?: EnumPgVariant | undefined, integrations?: (Array<{type: 'read_replica', 'source-service'?: DbaasServiceName | undefined, 'dest-service'?: DbaasServiceName | undefined, settings?: Record | undefined}>) | undefined, 'timescaledb-settings'?: JsonSchemaTimescaledb | undefined, 'ip-filter'?: Array | undefined, 'termination-protection'?: boolean | undefined, 'pgaudit-settings'?: JsonSchemaPgaudit | undefined, 'fork-from-service'?: DbaasServiceName | undefined, 'synchronous-replication'?: EnumPgSynchronousReplication | undefined, 'recovery-backup-time'?: string | undefined, 'pglookout-settings'?: JsonSchemaPglookout | undefined, maintenance?: ({dow: 'saturday' | 'tuesday' | 'never' | 'wednesday' | 'sunday' | 'friday' | 'monday' | 'thursday', time: string}) | undefined, 'admin-username'?: string | undefined, version?: DbaasPgTargetVersions | undefined, plan: string, 'work-mem'?: number | undefined, 'shared-buffers-percentage'?: number | undefined, 'pg-settings'?: JsonSchemaPg | undefined, 'admin-password'?: string | undefined, migration?: ({host: string, port: number, password?: string | undefined, ssl?: boolean | undefined, username?: string | undefined, dbname?: string | undefined, 'ignore-dbs'?: string | undefined, method?: EnumMigrationMethod | undefined}) | undefined}}; export type CreateApiDbaasPostgresNameOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const operation = z.object({id: z.string().optional(), reason: z.enum(["incorrect", "unknown", "unavailable", "forbidden", "busy", "fault", "partial", "not-found", "interrupted", "unsupported", "conflict"]).optional(), reference: z.object({id: z.string().optional(), link: z.string().optional(), command: z.string().optional()}).optional(), message: z.string().optional(), state: z.enum(["failure", "pending", "success", "timeout"]).optional()}); 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 }; /** * Create a DBaaS PostgreSQL service * * POST /dbaas-postgres/{name} */ export const createApiDbaasPostgresName = async (args: CreateApiDbaasPostgresNameArgs, options?: CreateApiDbaasPostgresNameOptions) => { const {baseUrl = "https://api-ch-gva-2.exoscale.com/v2", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/dbaas-postgres/${encodeURIComponent(String(args.name))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", 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(operation, await res.json()) };