- {/* {isRestoreDisabled ? (
-
-
-
- Project cannot be restored through the dashboard
-
-
- This project has been paused for over{' '}
-
- {pauseStatus?.max_days_till_restore_disabled ?? 90} days
- {' '}
- and cannot be restored through the dashboard. However, your data remains
- intact and can be downloaded as a backup.
-
-
-
-
-
-
- {latestBackup === undefined && (
-
- No backups available
-
- )}
-
-
-
- ) : isFreePlan ? (
+ {enforceNinetyDayUnpauseExpiry && (
<>
-
- To prevent future pauses, consider upgrading to Pro.
-
-
-
- Project can be restored through the dashboard within the next{' '}
- {pauseStatus.remaining_days_till_restore_disabled} day
- {(pauseStatus?.remaining_days_till_restore_disabled ?? 0) > 1 ? 's' : ''}
-
-
- Free projects cannot be restored through the dashboard if they are paused
- for more than{' '}
-
- {pauseStatus.max_days_till_restore_disabled} days
-
- . However, your database backup will still be available for download.
-
-
+ {isLoading && }
+ {isError && (
+
+ )}
+ {isSuccess && (
+ <>
+ {isRestoreDisabled ? (
+
+
+
+ Project cannot be restored through the dashboard
+
+
+ This project has been paused for over{' '}
+
+ {pauseStatus?.max_days_till_restore_disabled ?? 90} days
+ {' '}
+ and cannot be restored through the dashboard. However, your data
+ remains intact and can be downloaded as a backup.
+
+
+
+
+ }
+ loading={isDownloading}
+ disabled={!latestBackup}
+ className="pointer-events-auto"
+ onClick={() => onSelectDownloadBackup()}
+ >
+ Download backup
+
+
+ {!latestBackup && (
+
+ No backups available, please reach out via support for
+ assistance
+
+ )}
+
+
+
+ ) : isFreePlan ? (
+ <>
+
+ To prevent future pauses, consider upgrading to Pro.
+
+
+
+ Project can be restored through the dashboard within the next{' '}
+ {finalDaysRemainingBeforeRestoreDisabled} day
+ {finalDaysRemainingBeforeRestoreDisabled > 1 ? 's' : ''}
+
+
+ Free projects cannot be restored through the dashboard if they are
+ paused for more than{' '}
+
+ {pauseStatus?.max_days_till_restore_disabled} days
+
+ . The latest that your project can be restored is by{' '}
+
+ {dayjs()
+ .utc()
+ .add(pauseStatus.max_days_till_restore_disabled ?? 0, 'day')
+ .format('DD MMM YYYY')}
+
+ . However, your database backup will still be available for download
+ thereafter.
+
+
+ >
+ ) : (
+
+ )}
+ >
+ )}
>
- ) : null} */}
-
- {!isFreePlan && (
-
-
-
- Project will count towards compute usage once restored
-
-
- For every hour your instance is active, we will bill you based on the instance
- size of your project.
-
-
- }>
-
- More information
-
-
-
-
)}
+
+ {!enforceNinetyDayUnpauseExpiry && !isFreePlan && }
- {!isRestoreDisabled && (
+ {(!enforceNinetyDayUnpauseExpiry || (isSuccess && !isRestoreDisabled)) && (
diff --git a/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx b/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx
new file mode 100644
index 00000000000..6394fd5627d
--- /dev/null
+++ b/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx
@@ -0,0 +1,42 @@
+import { useParams } from 'common'
+import { Loader2 } from 'lucide-react'
+
+import { useProjectDetailQuery } from 'data/projects/project-detail-query'
+import { PROJECT_STATUS } from 'lib/constants'
+
+const RestartingState = () => {
+ const { ref } = useParams()
+ useProjectDetailQuery(
+ { ref },
+ {
+ // setting a refetch interval here will cause the `useSelectedProject()` in `ProjectLayout.tsx` to
+ // rerender every 4 seconds while the project is restarting. Once restarting is complete, it will
+ // no longer show this state.
+ refetchInterval(data) {
+ return data?.status !== PROJECT_STATUS.ACTIVE_HEALTHY ? 4000 : false
+ },
+ }
+ )
+
+ return (
+
+
+
+
+
+
+
+
+
Restarting...
+
+ Restarting can take a few minutes. Your project will be offline while it restarts.
+
+
+
+
+
+
+ )
+}
+
+export default RestartingState
diff --git a/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx b/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx
new file mode 100644
index 00000000000..5e6273c6149
--- /dev/null
+++ b/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx
@@ -0,0 +1,42 @@
+import Link from 'next/link'
+import { Button } from 'ui'
+import { CriticalIcon } from 'ui-patterns/Icons/StatusIcons'
+
+import { useProjectContext } from './ProjectContext'
+
+const RestoreFailedState = () => {
+ const { project } = useProjectContext()
+
+ return (
+
+
+
+
+
+
+
+
+
Something went wrong while restoring your project
+
+ Your project's data is intact, but your project is inaccessible due to the
+ restoration failure. Please contact support for assistance.
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default RestoreFailedState
diff --git a/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx b/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx
new file mode 100644
index 00000000000..e121d0efec6
--- /dev/null
+++ b/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx
@@ -0,0 +1,29 @@
+import { ExternalLink } from 'lucide-react'
+import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui'
+import { WarningIcon } from 'ui-patterns/Icons/StatusIcons'
+
+export const RestorePaidPlanProjectNotice = () => {
+ return (
+
+
+
+ Project will count towards compute usage once restored
+
+
+ For every hour your instance is active, we will bill you based on the instance size of your
+ project.
+
+
+ }>
+
+ More information
+
+
+
+
+ )
+}
diff --git a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx
index 67dc31d1560..a4f75929165 100644
--- a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx
+++ b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx
@@ -1,9 +1,9 @@
import { useQueryClient } from '@tanstack/react-query'
import { useParams } from 'common'
-import Link from 'next/link'
import { useEffect, useRef, useState } from 'react'
-import { Button, IconAlertCircle, IconCheckCircle, IconLoader } from 'ui'
+import { Button, IconCheckCircle, IconLoader } from 'ui'
+import { projectKeys } from 'data/projects/keys'
import { invalidateProjectDetailsQuery } from 'data/projects/project-detail-query'
import { getWithTimeout } from 'lib/common/fetch'
import { API_URL, PROJECT_STATUS } from 'lib/constants'
@@ -16,7 +16,6 @@ const RestoringState = () => {
const checkServerInterval = useRef()
const [loading, setLoading] = useState(false)
- const [isFailed, setIsFailed] = useState(false)
const [isCompleted, setIsCompleted] = useState(false)
useEffect(() => {
@@ -32,12 +31,11 @@ const RestoringState = () => {
})
if (projectStatus && !projectStatus.error) {
const { status } = projectStatus
- if (status === PROJECT_STATUS.RESTORATION_FAILED) {
- clearInterval(checkServerInterval.current)
- setIsFailed(true)
- } else if (status === PROJECT_STATUS.ACTIVE_HEALTHY) {
+ if (status === PROJECT_STATUS.ACTIVE_HEALTHY) {
clearInterval(checkServerInterval.current)
setIsCompleted(true)
+ } else {
+ queryClient.invalidateQueries(projectKeys.detail(ref))
}
}
}
@@ -71,32 +69,6 @@ const RestoringState = () => {
- ) : isFailed ? (
-
-
-
-
-
-
-
Something went wrong while restoring your project
-
- Our engineers have already been notified of this, do hang tight while we are
- investigating into the issue.
-
-
-
- {isFailed && (
-
-
-
- )}
-
) : (
diff --git a/apps/studio/data/misc/reset-password-mutation.ts b/apps/studio/data/misc/reset-password-mutation.ts
index 17eeba8201b..1e2e21d597b 100644
--- a/apps/studio/data/misc/reset-password-mutation.ts
+++ b/apps/studio/data/misc/reset-password-mutation.ts
@@ -1,9 +1,12 @@
+import * as Sentry from '@sentry/nextjs'
import { useMutation, UseMutationOptions } from '@tanstack/react-query'
import { toast } from 'react-hot-toast'
import { handleError, post } from 'data/fetchers'
import type { ResponseError } from 'types'
+const WHITELIST_ERRORS = ['email must be an email']
+
export type ResetPasswordVariables = {
email: string
hcaptchaToken: string | null
@@ -42,6 +45,9 @@ export const useResetPasswordMutation = ({
} else {
onError(data, variables, context)
}
+ if (!WHITELIST_ERRORS.some((error) => data.message.includes(error))) {
+ Sentry.captureMessage('[CRITICAL] Failed to send reset password email: ' + data.message)
+ }
},
...options,
}
diff --git a/apps/studio/data/misc/signup-mutation.ts b/apps/studio/data/misc/signup-mutation.ts
index c29f2e6eaa8..e00bfbebf15 100644
--- a/apps/studio/data/misc/signup-mutation.ts
+++ b/apps/studio/data/misc/signup-mutation.ts
@@ -1,9 +1,17 @@
+import * as Sentry from '@sentry/nextjs'
import { useMutation, UseMutationOptions } from '@tanstack/react-query'
import { toast } from 'react-hot-toast'
import { handleError, post } from 'data/fetchers'
import type { ResponseError } from 'types'
+const WHITELIST_ERRORS = [
+ 'A user with this email already exists',
+ 'Password should contain at least one character of each',
+ 'You attempted to send email to an inactive recipient',
+ 'email must be an email',
+]
+
export type SignUpVariables = {
email: string
password: string
@@ -38,6 +46,9 @@ export const useSignUpMutation = ({
} else {
onError(data, variables, context)
}
+ if (!WHITELIST_ERRORS.some((error) => data.message.includes(error))) {
+ Sentry.captureMessage('[CRITICAL] Failed to sign up: ' + data.message)
+ }
},
...options,
})
diff --git a/apps/studio/data/organizations/organization-payment-methods-query.ts b/apps/studio/data/organizations/organization-payment-methods-query.ts
index 39b278254e1..610142e4668 100644
--- a/apps/studio/data/organizations/organization-payment-methods-query.ts
+++ b/apps/studio/data/organizations/organization-payment-methods-query.ts
@@ -5,8 +5,7 @@ import { get, handleError } from 'data/fetchers'
import { components } from 'api-types'
export type OrganizationPaymentMethodsVariables = { slug?: string }
-export type OrganizationPaymentMethodsResponse = components['schemas']['PaymentsResponseV2']
-export type OrganizationPaymentMethod = components['schemas']['PaymentV2']
+export type OrganizationPaymentMethod = components['schemas']['Payment']
export async function getOrganizationPaymentMethods(
{ slug }: OrganizationPaymentMethodsVariables,
@@ -25,11 +24,9 @@ export async function getOrganizationPaymentMethods(
},
signal,
})
- if (error) handleError(error)
- // Due to API versioning, this is not correctly recognized until the old endpoint is removed
- // @ts-ignore
- return data as OrganizationPaymentMethodsResponse
+ if (error) handleError(error)
+ return data
}
export type OrganizationPaymentMethodsData = Awaited<
diff --git a/apps/studio/data/profile/mfa-challenge-and-verify-mutation.ts b/apps/studio/data/profile/mfa-challenge-and-verify-mutation.ts
index 29f3d141661..88b90bf0b24 100644
--- a/apps/studio/data/profile/mfa-challenge-and-verify-mutation.ts
+++ b/apps/studio/data/profile/mfa-challenge-and-verify-mutation.ts
@@ -1,8 +1,13 @@
+import * as Sentry from '@sentry/nextjs'
import type { AuthMFAVerifyResponse, MFAChallengeAndVerifyParams } from '@supabase/supabase-js'
-import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query'
+import { UseMutationOptions, useMutation, useQueryClient } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+
import { auth } from 'lib/gotrue'
import { profileKeys } from './keys'
+const WHITELIST_ERRORS = ['Invalid TOTP code entered']
+
interface MFAChallengeAndVerifyVariables extends MFAChallengeAndVerifyParams {
refreshFactors?: boolean
}
@@ -18,6 +23,7 @@ type CustomMFAVerifyError = NonNullable
export const useMfaChallengeAndVerifyMutation = ({
onSuccess,
+ onError,
...options
}: Omit<
UseMutationOptions,
@@ -42,6 +48,16 @@ export const useMfaChallengeAndVerifyMutation = ({
await onSuccess?.(data, variables, context)
},
+ async onError(data, variables, context) {
+ if (onError === undefined) {
+ toast.error(`Failed to sign in: ${data.message}`)
+ } else {
+ onError(data, variables, context)
+ }
+ if (!WHITELIST_ERRORS.some((error) => data.message.includes(error))) {
+ Sentry.captureMessage('[CRITICAL] Failed to sign in via MFA: ' + data.message)
+ }
+ },
...options,
}
)
diff --git a/apps/studio/data/projects/project-detail-query.ts b/apps/studio/data/projects/project-detail-query.ts
index 66427808b74..6f791b0c85b 100644
--- a/apps/studio/data/projects/project-detail-query.ts
+++ b/apps/studio/data/projects/project-detail-query.ts
@@ -10,13 +10,14 @@ export type ProjectDetailVariables = { ref?: string }
export type ProjectMinimal = components['schemas']['ProjectInfo']
export type ProjectDetail = components['schemas']['ProjectDetailResponse']
-export interface Project extends ProjectDetail {
+export interface Project extends Omit {
/**
* postgrestStatus is available on client side only.
* We use this status to check if a project instance is HEALTHY or not
* If not we will show ConnectingState and run a polling until it's back online
*/
postgrestStatus?: 'ONLINE' | 'OFFLINE'
+ status: components['schemas']['ResourceWithServicesStatusResponse']['status']
}
export async function getProjectDetail({ ref }: ProjectDetailVariables, signal?: AbortSignal) {
diff --git a/apps/studio/data/projects/projects-query.ts b/apps/studio/data/projects/projects-query.ts
index cbb2067adb6..89d28eb0da6 100644
--- a/apps/studio/data/projects/projects-query.ts
+++ b/apps/studio/data/projects/projects-query.ts
@@ -11,13 +11,15 @@ export type ProjectsVariables = {
ref?: string
}
-export type ProjectInfo = components['schemas']['ProjectInfo']
+export type ProjectInfo = components['schemas']['ProjectInfo'] & {
+ status: components['schemas']['ResourceWithServicesStatusResponse']['status']
+}
export async function getProjects(signal?: AbortSignal) {
const { data, error } = await get('/platform/projects', { signal })
if (error) handleError(error)
- return data
+ return data as ProjectInfo[]
}
export type ProjectsData = Awaited>
diff --git a/apps/studio/lib/constants/infrastructure.ts b/apps/studio/lib/constants/infrastructure.ts
index a8f3212bd34..c7a15c75386 100644
--- a/apps/studio/lib/constants/infrastructure.ts
+++ b/apps/studio/lib/constants/infrastructure.ts
@@ -69,7 +69,7 @@ export const PROVIDERS = {
} as const
export const PROJECT_STATUS: {
- [key: string]: components['schemas']['ProjectDetailResponse']['status']
+ [key: string]: components['schemas']['ResourceWithServicesStatusResponse']['status']
} = {
INACTIVE: 'INACTIVE',
ACTIVE_HEALTHY: 'ACTIVE_HEALTHY',
@@ -79,12 +79,12 @@ export const PROJECT_STATUS: {
GOING_DOWN: 'GOING_DOWN',
INIT_FAILED: 'INIT_FAILED',
REMOVED: 'REMOVED',
+ RESTARTING: 'RESTARTING',
RESTORING: 'RESTORING',
+ RESTORE_FAILED: 'RESTORE_FAILED',
UPGRADING: 'UPGRADING',
- // @ts-ignore [Joshen] API codegen seems to be wrong here, pausing is still a valid status
PAUSING: 'PAUSING',
- // @ts-ignore [Joshen] This is no longer part of the project status enum, but leaving here for now just in case
- RESTORATION_FAILED: 'RESTORATION_FAILED',
+ PAUSE_FAILED: 'PAUSE_FAILED',
}
export const DEFAULT_MINIMUM_PASSWORD_STRENGTH = 4
diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx
index 7a9a56becf7..b0ed5dafb40 100644
--- a/apps/studio/pages/new/[slug].tsx
+++ b/apps/studio/pages/new/[slug].tsx
@@ -1,5 +1,6 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
+import { PopoverSeparator } from '@ui/components/shadcn/ui/popover'
import { components } from 'api-types'
import { useParams } from 'common'
import {
@@ -19,6 +20,7 @@ import {
ProjectCreateVariables,
useProjectCreateMutation,
} from 'data/projects/project-create-mutation'
+import { useProjectsQuery } from 'data/projects/projects-query'
import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query'
import generator from 'generate-password-browser'
import { useCheckPermissions, useFlag, withAuth } from 'hooks'
@@ -26,6 +28,7 @@ import {
CloudProvider,
DEFAULT_MINIMUM_PASSWORD_STRENGTH,
DEFAULT_PROVIDER,
+ PROJECT_STATUS,
PROVIDERS,
} from 'lib/constants'
import { passwordStrength } from 'lib/helpers'
@@ -59,10 +62,8 @@ import {
} from 'ui'
import { Input } from 'ui-patterns/DataInputs/Input'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
-import { z } from 'zod'
import { InfoTooltip } from 'ui-patterns/info-tooltip'
-import { useProjectsQuery } from 'data/projects/projects-query'
-import { PopoverSeparator } from '@ui/components/shadcn/ui/popover'
+import { z } from 'zod'
type DesiredInstanceSize = components['schemas']['DesiredInstanceSize']
@@ -173,7 +174,8 @@ const Wizard: NextPageWithLayout = () => {
const { data: allProjects } = useProjectsQuery({})
const organizationProjects =
allProjects?.filter(
- (project) => project.organization_id === currentOrg?.id && project.status !== 'paused'
+ (project) =>
+ project.organization_id === currentOrg?.id && project.status !== PROJECT_STATUS.INACTIVE
) ?? []
const { data: orgSubscription } = useOrgSubscriptionQuery({
diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts
index 1f00abc4776..9bbf3572900 100644
--- a/packages/api-types/types/api.d.ts
+++ b/packages/api-types/types/api.d.ts
@@ -157,8 +157,6 @@ export interface paths {
get: operations['CustomerController_getCustomer']
/** Updates the billing customer */
put: operations['updateCustomerV2']
- /** Updates the Stripe customer */
- patch: operations['CustomerController_updateCustomer']
}
'/platform/organizations/{slug}/roles': {
/** Gets the given organization's roles */
@@ -267,7 +265,7 @@ export interface paths {
}
'/platform/organizations/{slug}/payments': {
/** Gets Stripe payment methods for the given organization */
- get: operations['PaymentsController_getPaymentMethods']
+ get: operations['getPaymentMethodsV2']
/** Detach payment method with the given card ID */
delete: operations['PaymentsController_detachPaymentMethod']
}
@@ -2582,51 +2580,11 @@ export interface components {
email: string
address: components['schemas']['CustomerBillingAddress'] | null
balance: number
- invoice_settings: Record
billing_via_partner: boolean
}
BillingCustomerUpdateBody: {
address?: components['schemas']['CustomerBillingAddress']
}
- CustomerUpdateResponse: {
- id: string
- object: string
- address: Record
- balance: number
- cash_balance?: Record
- created: number
- currency: string
- default_currency?: string
- default_source: string
- delinquent: boolean
- description: string
- discount: Record
- email: string
- invoice_credit_balance?: Record
- invoice_prefix: string
- invoice_settings: Record
- livemode: boolean
- metadata: Record
- name: string
- next_invoice_sequence?: number
- phone: string
- preferred_locales: string[]
- shipping: Record
- sources?: Record
- subscriptions?: Record
- tax?: Record
- tax_exempt?: string
- tax_ids?: Record
- test_clock?: Record
- lastResponse: {
- headers?: Record
- requestId?: string
- statusCode?: number
- apiVersion?: string
- idempotencyKey?: string
- stripeAccount?: string
- }
- }
OrganizationRole: {
id: number
name: string
@@ -2819,70 +2777,16 @@ export interface components {
exp_year: number
last4: string
}
- PaymentV2: {
+ Payment: {
id: string
card?: components['schemas']['PaymentMethodCard']
created: number
type: string
is_default: boolean
}
- PaymentsResponseV2: {
- defaultPaymentMethodId: string | null
- data: components['schemas']['PaymentV2'][]
- }
- Payment: {
- id: string
- object: string
- acss_debit?: Record
- affirm?: Record
- afterpay_clearpay?: Record
- alipay?: Record
- au_becs_debit?: Record
- bacs_debit?: Record
- bancontact?: Record
- billing_details: Record
- blik?: Record
- boleto?: Record
- card?: Record
- card_present?: Record
- created: number
- customer: Record
- customer_balance?: Record
- eps?: Record
- fpx?: Record
- giropay?: Record
- grabpay?: Record
- ideal?: Record
- interac_present?: Record
- klarna?: Record
- konbini?: Record
- link?: Record
- livemode: boolean
- metadata: Record
- oxxo?: Record
- p24?: Record
- paynow?: Record
- promptpay?: Record
- radar_options?: Record
- sepa_debit?: Record
- sofort?: Record
- type: string
- us_bank_account?: Record
- wechat_pay?: Record
- }
PaymentsResponse: {
- object: string
+ defaultPaymentMethodId: string | null
data: components['schemas']['Payment'][]
- has_more: boolean
- url: string
- lastResponse: {
- headers?: Record
- requestId?: string
- statusCode?: number
- apiVersion?: string
- idempotencyKey?: string
- stripeAccount?: string
- }
}
DetachPaymentMethodBody: {
card_id: string
@@ -2894,37 +2798,8 @@ export interface components {
hcaptchaToken: string
}
SetupIntentResponse: {
- id: string
- object: string
- application: Record
- attach_to_self?: boolean
- cancellation_reason: string
client_secret: string
- created: number
- customer: Record
- description: string
- flow_directions: Record
- last_setup_error: Record
- latest_attempt: Record
- livemode: boolean
- mandate: Record
- metadata: Record
- next_action: Record
- on_behalf_of: Record
payment_method: Record
- payment_method_options: Record
- payment_method_types: string[]
- single_use_mandate: Record
- status: string
- usage: string
- lastResponse: {
- headers?: Record
- requestId?: string
- statusCode?: number
- apiVersion?: string
- idempotencyKey?: string
- stripeAccount?: string
- }
}
/** @enum {string} */
BillingPlanId: 'free' | 'pro' | 'team' | 'enterprise'
@@ -2978,12 +2853,6 @@ export interface components {
name: string
ref: string
}
- PaymentMethodCardDetails: {
- last_4_digits: string
- brand: string
- expiry_month: number
- expiry_year: number
- }
ScheduledPlanChange: {
target_plan: components['schemas']['BillingPlanId']
/** Format: date-time */
@@ -3000,8 +2869,6 @@ export interface components {
addons: components['schemas']['BillingSubscriptionAddon'][]
project_addons: components['schemas']['BillingProjectAddonResponse'][]
payment_method_type: string
- payment_method_id?: string
- payment_method_card_details?: components['schemas']['PaymentMethodCardDetails']
billing_via_partner: boolean
/** @enum {string} */
billing_partner: 'fly' | 'aws'
@@ -3947,9 +3814,10 @@ export interface components {
}
Buffer: Record
PauseStatusResponse: {
- max_days_till_restore_disabled: number | null
+ max_days_till_restore_disabled: number
remaining_days_till_restore_disabled: number | null
- can_restore: boolean | null
+ can_restore: boolean
+ latest_downloadable_backup_id: number | null
}
ResizeBody: {
volume_size_gb: number
@@ -4015,16 +3883,20 @@ export interface components {
region: string
/** @enum {string} */
status:
- | 'INACTIVE'
| 'ACTIVE_HEALTHY'
| 'ACTIVE_UNHEALTHY'
| 'COMING_UP'
- | 'UNKNOWN'
| 'GOING_DOWN'
+ | 'INACTIVE'
| 'INIT_FAILED'
| 'REMOVED'
- | 'RESTORING'
+ | 'RESTARTING'
+ | 'UNKNOWN'
| 'UPGRADING'
+ | 'PAUSING'
+ | 'RESTORING'
+ | 'RESTORE_FAILED'
+ | 'PAUSE_FAILED'
subscription_id: string
connectionString: string
kpsVersion?: string
@@ -5676,6 +5548,7 @@ export interface components {
default?: Record | number | string | boolean
name?: string
names?: string[]
+ array?: boolean
}
AttributeMapping: {
keys: {
@@ -6904,7 +6777,7 @@ export interface operations {
}
}
responses: {
- 200: {
+ 204: {
content: never
}
403: {
@@ -6916,29 +6789,6 @@ export interface operations {
}
}
}
- /** Updates the Stripe customer */
- CustomerController_updateCustomer: {
- parameters: {
- path: {
- /** @description Organization slug */
- slug: string
- }
- }
- responses: {
- 200: {
- content: {
- 'application/json': components['schemas']['CustomerUpdateResponse']
- }
- }
- 403: {
- content: never
- }
- /** @description Failed to update the Stripe customer */
- 500: {
- content: never
- }
- }
- }
/** Gets the given organization's roles */
OrganizationRolesController_getAllRolesV2: {
parameters: {
@@ -7573,7 +7423,7 @@ export interface operations {
}
}
/** Gets Stripe payment methods for the given organization */
- PaymentsController_getPaymentMethods: {
+ getPaymentMethodsV2: {
parameters: {
path: {
/** @description Organization slug */