From d50fbd9012b53e0a22b44885b8093abb4c8ab6be Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Fri, 28 Feb 2025 17:50:16 +0800 Subject: [PATCH] Fix connection pooling feature flag (#33914) * Fix connection pooling feature flag * Fix type issues with lint-query after updating API typs * Apply same fix for connection_string to ConnectTabContent * Update useMemo dependency arrays in ConnectionPooling * Remove allowPgBouncerSelection enabled check on react queries - feels unnecessary and adds some complexity to the loading state of the forms * Remove conosle log --- .../interfaces/Connect/ConnectTabContent.tsx | 10 +- .../Connect/DatabaseConnectionString.tsx | 7 +- .../Settings/Addons/IPv4SidePanel.tsx | 5 +- .../ConnectionPooling/ConnectionPooling.tsx | 30 +- apps/studio/data/lint/lint-query.ts | 6 +- packages/api-types/types/api.d.ts | 216 ++++++++ packages/api-types/types/platform.d.ts | 518 ++++++++++++++++-- 7 files changed, 714 insertions(+), 78 deletions(-) diff --git a/apps/studio/components/interfaces/Connect/ConnectTabContent.tsx b/apps/studio/components/interfaces/Connect/ConnectTabContent.tsx index 9d4eedca032..123540e493a 100644 --- a/apps/studio/components/interfaces/Connect/ConnectTabContent.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectTabContent.tsx @@ -28,10 +28,7 @@ const ConnectTabContent = forwardRef( const allowPgBouncerSelection = useFlag('dualPoolerSupport') const { data: settings } = useProjectSettingsV2Query({ projectRef }) - const { data: pgbouncerConfig } = usePgbouncerConfigQuery( - { projectRef }, - { enabled: allowPgBouncerSelection } - ) + const { data: pgbouncerConfig } = usePgbouncerConfigQuery({ projectRef }) const { data: supavisorConfig } = useSupavisorConfigurationQuery({ projectRef }) const isPgBouncerEnabled = allowPgBouncerSelection && !!pgbouncerConfig?.pgbouncer_enabled @@ -47,7 +44,10 @@ const ConnectTabContent = forwardRef( ? getConnectionStringsV2({ connectionInfo, poolingInfo: { - connectionString: poolingConfiguration.connectionString, + connectionString: + 'connection_string' in poolingConfiguration + ? poolingConfiguration.connection_string + : poolingConfiguration.connectionString, db_host: poolingConfiguration.db_host, db_name: poolingConfiguration.db_name, db_port: poolingConfiguration.db_port, diff --git a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx index 5801e3be505..5f3ea463615 100644 --- a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx +++ b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx @@ -68,7 +68,7 @@ export const DatabaseConnectionString = () => { isLoading: isLoadingPgbouncerConfig, isError: isErrorPgbouncerConfig, isSuccess: isSuccessPgBouncerConfig, - } = usePgbouncerConfigQuery({ projectRef }, { enabled: allowPgBouncerSelection }) + } = usePgbouncerConfigQuery({ projectRef }) const { data: supavisorConfig, error: supavisorConfigError, @@ -135,7 +135,10 @@ export const DatabaseConnectionString = () => { ? getConnectionStrings({ connectionInfo, poolingInfo: { - connectionString: poolingConfiguration.connectionString, + connectionString: + 'connection_string' in poolingConfiguration + ? poolingConfiguration.connection_string + : poolingConfiguration.connectionString, db_host: poolingConfiguration.db_host, db_name: poolingConfiguration.db_name, db_port: poolingConfiguration.db_port, diff --git a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx index ec62b6fc26c..bbebfdfb510 100644 --- a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx @@ -33,10 +33,7 @@ const IPv4SidePanel = () => { const visible = panel === 'ipv4' const { data: addons, isLoading } = useProjectAddonsQuery({ projectRef }) - const { data: pgbouncerConfig } = usePgbouncerConfigQuery( - { projectRef }, - { enabled: allowPgBouncerSelection } - ) + const { data: pgbouncerConfig } = usePgbouncerConfigQuery({ projectRef }) const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organization?.slug }) const { mutate: updateAddon, isLoading: isUpdating } = useProjectAddonUpdateMutation({ onSuccess: () => { diff --git a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx index 3cc87379db2..a88432b1481 100644 --- a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx +++ b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx @@ -113,7 +113,7 @@ export const ConnectionPooling = () => { isLoading: isLoadingPgbouncerConfig, isError: isErrorPgbouncerConfig, isSuccess: isSuccessPgbouncerConfig, - } = usePgbouncerConfigQuery({ projectRef }, { enabled: allowPgBouncerSelection }) + } = usePgbouncerConfigQuery({ projectRef }) const { data: maxConnData } = useMaxConnectionsQuery({ projectRef: project?.ref, @@ -169,22 +169,32 @@ export const ConnectionPooling = () => { max_client_conn: null, }, }) - const { type, default_pool_size, max_client_conn } = form.watch() + const { type, default_pool_size } = form.watch() const error = useMemo( - () => (type === 'PgBouncer' ? pgbouncerConfigError : supavisorConfigError), - [type] + () => + allowPgBouncerSelection && type === 'PgBouncer' ? pgbouncerConfigError : supavisorConfigError, + [allowPgBouncerSelection, type, pgbouncerConfigError, supavisorConfigError] ) const isLoading = useMemo( - () => (type === 'PgBouncer' ? isLoadingPgbouncerConfig : isLoadingSupavisorConfig), - [type] + () => + allowPgBouncerSelection && type === 'PgBouncer' + ? isLoadingPgbouncerConfig + : isLoadingSupavisorConfig, + [allowPgBouncerSelection, type, isLoadingPgbouncerConfig, isLoadingSupavisorConfig] ) const isError = useMemo( - () => (type === 'PgBouncer' ? isErrorPgbouncerConfig : isErrorSupavisorConfig), - [type] + () => + allowPgBouncerSelection && type === 'PgBouncer' + ? isErrorPgbouncerConfig + : isErrorSupavisorConfig, + [allowPgBouncerSelection, type, isErrorPgbouncerConfig, isErrorSupavisorConfig] ) const isSuccess = useMemo( - () => (type === 'PgBouncer' ? isSuccessPgbouncerConfig : isSuccessSupavisorConfig), - [type] + () => + allowPgBouncerSelection && type === 'PgBouncer' + ? isSuccessPgbouncerConfig + : isSuccessSupavisorConfig, + [allowPgBouncerSelection, type, isSuccessPgbouncerConfig, isSuccessSupavisorConfig] ) const isSaving = isUpdatingSupavisor || isUpdatingPgBouncer diff --git a/apps/studio/data/lint/lint-query.ts b/apps/studio/data/lint/lint-query.ts index c1ccafb0da5..af9e11d5f12 100644 --- a/apps/studio/data/lint/lint-query.ts +++ b/apps/studio/data/lint/lint-query.ts @@ -10,9 +10,9 @@ import { lintKeys } from './keys' export type ProjectLintsVariables = { projectRef?: string } -export type ProjectLintResponse = components['schemas']['ProjectLintResponse'] -export type Lint = ProjectLintResponse -export type LINT_TYPES = ProjectLintResponse['name'] +type ProjectLintResponse = components['schemas']['GetProjectLintsResponseDto'] +export type Lint = ProjectLintResponse[0] +export type LINT_TYPES = ProjectLintResponse[0]['name'] export async function getProjectLints({ projectRef }: ProjectLintsVariables, signal?: AbortSignal) { if (!projectRef) throw new Error('Project ref is required') diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts index 22e98c27a4e..72d4c686f43 100644 --- a/packages/api-types/types/api.d.ts +++ b/packages/api-types/types/api.d.ts @@ -317,6 +317,43 @@ export interface paths { patch: operations['v1-update-auth-service-config'] trace?: never } + '/v1/projects/{ref}/config/auth/signing-keys': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** [Alpha] List all signing keys for the project */ + get: operations['listSigningKeysForProject'] + put?: never + /** [Alpha] Create a new signing key for the project in standby status */ + post: operations['createSigningKeyForProject'] + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v1/projects/{ref}/config/auth/signing-keys/{id}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** [Alpha] Get information about a signing key */ + get: operations['getSigningKeyForProject'] + put?: never + post?: never + /** [Alpha] Remove a signing key from a project, where the status is previously_used */ + delete: operations['deleteSigningKey'] + options?: never + head?: never + /** [Alpha] Update a signing key, mainly its status */ + patch: operations['patchSigningKey'] + trace?: never + } '/v1/projects/{ref}/config/auth/sso/providers': { parameters: { query?: never @@ -1517,6 +1554,12 @@ export interface components { name: string value: string } + CreateSigningKeyBody: { + /** @enum {string} */ + algorithm: 'EdDSA' | 'ES256' | 'RS256' | 'HS256' + /** @enum {string} */ + status?: 'in_use' | 'standby' + } CreateThirdPartyAuthBody: { custom_jwks?: Record jwks_url?: string @@ -1852,6 +1895,34 @@ export interface components { | 'ap-south-1' | 'sa-east-1' } + SigningKeyResponse: { + /** @enum {string} */ + algorithm: 'EdDSA' | 'ES256' | 'RS256' | 'HS256' + /** Format: date-time */ + created_at: string + /** Format: uuid */ + id: string + public_jwk?: unknown + /** @enum {string} */ + status: 'in_use' | 'previously_used' | 'revoked' | 'standby' + /** Format: date-time */ + updated_at: string + } + SigningKeysResponse: { + keys: { + /** @enum {string} */ + algorithm: 'EdDSA' | 'ES256' | 'RS256' | 'HS256' + /** Format: date-time */ + created_at: string + /** Format: uuid */ + id: string + public_jwk?: unknown + /** @enum {string} */ + status: 'in_use' | 'previously_used' | 'revoked' | 'standby' + /** Format: date-time */ + updated_at: string + }[] + } SnippetContent: { favorite: boolean schema_version: string @@ -2223,6 +2294,10 @@ export interface components { saml?: components['schemas']['SamlDescriptor'] updated_at?: string } + UpdateSigningKeyBody: { + /** @enum {string} */ + status: 'in_use' | 'previously_used' | 'revoked' | 'standby' + } UpdateStorageConfigBody: { features?: components['schemas']['StorageFeatures'] /** Format: int64 */ @@ -3266,6 +3341,147 @@ export interface operations { } } } + listSigningKeysForProject: { + parameters: { + query?: never + header?: never + path: { + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SigningKeysResponse'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + createSigningKeyForProject: { + parameters: { + query?: never + header?: never + path: { + ref: string + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['CreateSigningKeyBody'] + } + } + responses: { + /** @description [Alpha] Create a new signing key for the project in standby status */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreateSigningKeyBody'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + getSigningKeyForProject: { + parameters: { + query?: never + header?: never + path: { + id: string + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SigningKeyResponse'] + } + } + } + } + deleteSigningKey: { + parameters: { + query?: never + header?: never + path: { + id: string + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SigningKeyResponse'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + patchSigningKey: { + parameters: { + query?: never + header?: never + path: { + id: string + ref: string + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateSigningKeyBody'] + } + } + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SigningKeyResponse'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } 'v1-list-all-sso-provider': { parameters: { query?: never diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts index f452a0a40d4..626079ca3ae 100644 --- a/packages/api-types/types/platform.d.ts +++ b/packages/api-types/types/platform.d.ts @@ -2899,6 +2899,40 @@ export interface paths { patch?: never trace?: never } + '/platform/projects/{ref}/run-lints/leaked-service-key': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Run project leaked service key lint */ + get: operations['ProjectRunLintsController_runLeakedServiceKeyLint'] + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/platform/projects/{ref}/run-lints/no-backup-admin': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Run project backup admin lint */ + get: operations['ProjectRunLintsController_runAuthBackupAdminLint'] + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } '/platform/projects/{ref}/service-versions': { parameters: { query?: never @@ -3100,9 +3134,11 @@ export interface paths { path?: never cookie?: never } - get?: never + /** Gets a pipeline by id */ + get: operations['ReplicationPipelinesController_getPipeline'] put?: never - post?: never + /** Updates a pipeline */ + post: operations['ReplicationPipelinesController_updatePipeline'] /** Deletes a pipeline */ delete: operations['ReplicationPipelinesController_deletePipeline'] options?: never @@ -3186,9 +3222,11 @@ export interface paths { path?: never cookie?: never } - get?: never + /** Gets a sink by id */ + get: operations['ReplicationSinksController_getSink'] put?: never - post?: never + /** Updates a sink */ + post: operations['ReplicationSinksController_updateSink'] /** Deletes a sink */ delete: operations['ReplicationSinksController_deleteSink'] options?: never @@ -3961,6 +3999,59 @@ export interface components { result: Record[] retention_period: number } + AuthBackupAdminLintResponseDto: { + lints: { + cache_key: string + categories: ('PERFORMANCE' | 'SECURITY')[] + description: string + detail: string + /** @enum {string} */ + facing: 'EXTERNAL' + /** @enum {string} */ + level: 'ERROR' | 'WARN' | 'INFO' + metadata?: { + entity?: string + fkey_columns?: number[] + fkey_name?: string + name?: string + schema?: string + /** @enum {string} */ + type?: 'table' | 'view' | 'auth' | 'function' | 'extension' | 'compliance' + } + /** @enum {string} */ + name: + | 'unindexed_foreign_keys' + | 'auth_users_exposed' + | 'auth_rls_initplan' + | 'no_primary_key' + | 'unused_index' + | 'multiple_permissive_policies' + | 'policy_exists_rls_disabled' + | 'rls_enabled_no_policy' + | 'duplicate_index' + | 'security_definer_view' + | 'function_search_path_mutable' + | 'rls_disabled_in_public' + | 'extension_in_public' + | 'rls_references_user_metadata' + | 'materialized_view_in_api' + | 'foreign_table_in_api' + | 'unsupported_reg_types' + | 'auth_otp_long_expiry' + | 'auth_otp_short_length' + | 'ssl_not_enforced' + | 'network_restrictions_not_set' + | 'password_requirements_min_length' + | 'pitr_not_enabled' + | 'auth_leaked_password_protection' + | 'auth_insufficient_mfa_options' + | 'auth_password_policy_missing' + | 'leaked_service_key' + | 'no_backup_admin' + remediation: string + title: string + }[] + } AutoApiService: { app: { id?: number @@ -4479,7 +4570,7 @@ export interface components { database_type: 'PRIMARY' | 'READ_REPLICA' DatabaseDetailResponse: { /** @enum {string} */ - cloud_provider: 'AWS' | 'FLY' + cloud_provider: 'AWS' | 'AWS_K8S' | 'FLY' connectionString: string db_host: string db_name: string @@ -4668,6 +4759,59 @@ export interface components { private: number shared: number } + GetLeakedServiceKeyLintResponseDto: { + lints: { + cache_key: string + categories: ('PERFORMANCE' | 'SECURITY')[] + description: string + detail: string + /** @enum {string} */ + facing: 'EXTERNAL' + /** @enum {string} */ + level: 'ERROR' | 'WARN' | 'INFO' + metadata?: { + entity?: string + fkey_columns?: number[] + fkey_name?: string + name?: string + schema?: string + /** @enum {string} */ + type?: 'table' | 'view' | 'auth' | 'function' | 'extension' | 'compliance' + } + /** @enum {string} */ + name: + | 'unindexed_foreign_keys' + | 'auth_users_exposed' + | 'auth_rls_initplan' + | 'no_primary_key' + | 'unused_index' + | 'multiple_permissive_policies' + | 'policy_exists_rls_disabled' + | 'rls_enabled_no_policy' + | 'duplicate_index' + | 'security_definer_view' + | 'function_search_path_mutable' + | 'rls_disabled_in_public' + | 'extension_in_public' + | 'rls_references_user_metadata' + | 'materialized_view_in_api' + | 'foreign_table_in_api' + | 'unsupported_reg_types' + | 'auth_otp_long_expiry' + | 'auth_otp_short_length' + | 'ssl_not_enforced' + | 'network_restrictions_not_set' + | 'password_requirements_min_length' + | 'pitr_not_enabled' + | 'auth_leaked_password_protection' + | 'auth_insufficient_mfa_options' + | 'auth_password_policy_missing' + | 'leaked_service_key' + | 'no_backup_admin' + remediation: string + title: string + }[] + } GetOAuthAuthorizationResponse: { approved_at?: string approved_organization_slug?: string @@ -4728,6 +4872,57 @@ export interface components { GetProjectByFlyExtensionIdResponse: { ref: string } + GetProjectLintsResponseDto: { + cache_key: string + categories: ('PERFORMANCE' | 'SECURITY')[] + description: string + detail: string + /** @enum {string} */ + facing: 'EXTERNAL' + /** @enum {string} */ + level: 'ERROR' | 'WARN' | 'INFO' + metadata?: { + entity?: string + fkey_columns?: number[] + fkey_name?: string + name?: string + schema?: string + /** @enum {string} */ + type?: 'table' | 'view' | 'auth' | 'function' | 'extension' | 'compliance' + } + /** @enum {string} */ + name: + | 'unindexed_foreign_keys' + | 'auth_users_exposed' + | 'auth_rls_initplan' + | 'no_primary_key' + | 'unused_index' + | 'multiple_permissive_policies' + | 'policy_exists_rls_disabled' + | 'rls_enabled_no_policy' + | 'duplicate_index' + | 'security_definer_view' + | 'function_search_path_mutable' + | 'rls_disabled_in_public' + | 'extension_in_public' + | 'rls_references_user_metadata' + | 'materialized_view_in_api' + | 'foreign_table_in_api' + | 'unsupported_reg_types' + | 'auth_otp_long_expiry' + | 'auth_otp_short_length' + | 'ssl_not_enforced' + | 'network_restrictions_not_set' + | 'password_requirements_min_length' + | 'pitr_not_enabled' + | 'auth_leaked_password_protection' + | 'auth_insufficient_mfa_options' + | 'auth_password_policy_missing' + | 'leaked_service_key' + | 'no_backup_admin' + remediation: string + title: string + }[] GetPublicUrlBody: { options?: components['schemas']['PublicUrlOptions'] path: string @@ -5470,6 +5665,7 @@ export interface components { defaultPaymentMethodId: string | null } PgbouncerConfigResponse: { + connection_string: string connectionString: string db_dns_name: string db_host: string @@ -5897,52 +6093,6 @@ export interface components { supabase_project_ref: string updated_at: string } - ProjectLintMetadata: { - entity?: string - fkey_columns?: number[] - fkey_name?: string - name?: string - schema?: string - /** @enum {string} */ - type?: 'table' | 'view' | 'auth' | 'function' | 'extension' - } - ProjectLintResponse: { - cache_key: string - categories: ('PERFORMANCE' | 'SECURITY')[] - description: string - detail: string - facing: string - /** @enum {string} */ - level: 'ERROR' | 'WARN' | 'INFO' - metadata: components['schemas']['ProjectLintMetadata'] | null - /** @enum {string} */ - name: - | 'unindexed_foreign_keys' - | 'auth_users_exposed' - | 'auth_rls_initplan' - | 'no_primary_key' - | 'unused_index' - | 'multiple_permissive_policies' - | 'policy_exists_rls_disabled' - | 'rls_enabled_no_policy' - | 'duplicate_index' - | 'security_definer_view' - | 'function_search_path_mutable' - | 'rls_disabled_in_public' - | 'extension_in_public' - | 'rls_references_user_metadata' - | 'materialized_view_in_api' - | 'foreign_table_in_api' - | 'unsupported_reg_types' - | 'auth_otp_long_expiry' - | 'auth_otp_short_length' - | 'ssl_not_enforced' - | 'network_restrictions_not_set' - | 'password_requirements_min_length' - | 'pitr_not_enabled' - remediation: Record - title: string - } ProjectRefResponse: { id: number name: string @@ -6076,6 +6226,22 @@ export interface components { * @enum {string} */ ReleaseChannel: 'internal' | 'alpha' | 'beta' | 'ga' | 'withdrawn' | 'preview' + ReplicationPipelineResponse: { + config: { + config: { + max_fill_secs: number + max_size: number + } + } + id: number + publication_name: string + replicator_id: number + sink_id: number + sink_name: string + source_id: number + source_name: string + tenant_id: string + } ReplicationPipelinesResponse: { pipelines: { config: { @@ -6107,6 +6273,18 @@ export interface components { }[] }[] } + ReplicationSinkResponse: { + config: { + big_query: { + dataset_id: string + project_id: string + service_account_key: string + } + } + id: number + name: string + tenant_id: string + } ReplicationSinksResponse: { sinks: { config: { @@ -6889,6 +7067,31 @@ export interface components { /** @description Whether to only allow private channels */ private_only?: boolean } + UpdateReplicationPipelineBody: { + /** @description Pipeline config */ + config?: { + config: { + max_fill_secs: number + max_size: number + } + } + /** @description Publication name */ + publication_name?: string + /** @description Sink id */ + sink_id?: number + /** @description Source id */ + source_id?: number + } + UpdateReplicationSinkBody: { + /** @description BigQuery dataset id */ + dataset_id: string + /** @description BigQuery project id */ + project_id: string + /** @description BigQuery service account key */ + service_account_key: string + /** @description Sink name */ + sink_name: string + } UpdateSchemaBody: { name?: string owner?: string @@ -14111,7 +14314,9 @@ export interface operations { parameters: { query?: never header?: never - path?: never + path: { + ref: string + } cookie?: never } requestBody?: never @@ -14137,7 +14342,9 @@ export interface operations { parameters: { query?: never header?: never - path?: never + path: { + ref: string + } cookie?: never } requestBody: { @@ -15050,6 +15257,7 @@ export interface operations { | 'physical_replication_lag_physical_replica_lag_seconds' | 'pg_stat_database_num_backends' | 'supavisor_connections_active' + | 'pgbouncer_pools_client_active_connections' databaseIdentifier?: string endDate: string interval?: '1m' | '5m' | '10m' | '30m' | '1h' | '1d' @@ -15412,7 +15620,63 @@ export interface operations { [name: string]: unknown } content: { - 'application/json': components['schemas']['ProjectLintResponse'][] + 'application/json': components['schemas']['GetProjectLintsResponseDto'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + ProjectRunLintsController_runLeakedServiceKeyLint: { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['GetLeakedServiceKeyLintResponseDto'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + ProjectRunLintsController_runAuthBackupAdminLint: { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AuthBackupAdminLintResponseDto'] } } 403: { @@ -15783,6 +16047,79 @@ export interface operations { } } } + ReplicationPipelinesController_getPipeline: { + parameters: { + query?: never + header?: never + path: { + pipeline_id: number + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Returns the pipeline. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ReplicationPipelineResponse'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + /** @description Failed to get pipeline */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + ReplicationPipelinesController_updatePipeline: { + parameters: { + query?: never + header?: never + path: { + pipeline_id: number + ref: string + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateReplicationPipelineBody'] + } + } + responses: { + 201: { + headers: { + [name: string]: unknown + } + content?: never + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + /** @description Failed to update pipeline */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } ReplicationPipelinesController_deletePipeline: { parameters: { query?: never @@ -15990,6 +16327,79 @@ export interface operations { } } } + ReplicationSinksController_getSink: { + parameters: { + query?: never + header?: never + path: { + ref: string + sink_id: number + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Returns the sink. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ReplicationSinkResponse'] + } + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + /** @description Failed to get sink */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + ReplicationSinksController_updateSink: { + parameters: { + query?: never + header?: never + path: { + ref: string + sink_id: number + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateReplicationSinkBody'] + } + } + responses: { + 201: { + headers: { + [name: string]: unknown + } + content?: never + } + 403: { + headers: { + [name: string]: unknown + } + content?: never + } + /** @description Failed to update sink */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } ReplicationSinksController_deleteSink: { parameters: { query?: never