diff --git a/studio/components/interfaces/Database/Backups/PITRBackupSelection/index.tsx b/studio/components/interfaces/Database/Backups/PITRBackupSelection/index.tsx index 9f4e59121e8..ff0c3c3a59e 100644 --- a/studio/components/interfaces/Database/Backups/PITRBackupSelection/index.tsx +++ b/studio/components/interfaces/Database/Backups/PITRBackupSelection/index.tsx @@ -1,5 +1,6 @@ import dayjs from 'dayjs' import { FC, FormEvent, useState } from 'react' +import { useRouter } from 'next/router' import { IconSearch, Input, Listbox, Popover, Button, Modal } from '@supabase/ui' import { useStore, useFlag } from 'hooks' @@ -15,13 +16,24 @@ import { getTimezoneOffsetText, convertTimeStringtoUnixMs, } from './PITRBackupSelection.utils' +import { post } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' interface Props {} const PITRBackupSelection: FC = () => { + const router = useRouter() const { ui, backups } = useStore() const isAvailable = useFlag('pitrBackups') + if (!isAvailable) { + return ( +
+

Coming soon

+
+ ) + } + const [searchString, setSearchString] = useState('') const [selectedTimezone, setSelectedTimezone] = useState(getClientTimezone()) const [showConfirmation, setShowConfirmation] = useState(false) @@ -29,26 +41,20 @@ const PITRBackupSelection: FC = () => { const [errors, setErrors] = useState() const [recoveryPoint, setRecoveryPoint] = useState() - // Mock new properties, to delete after BE is fully ready const { configuration } = backups - console.log('Configuration', configuration) - const projectRef = ui.selectedProject?.ref ?? 'default' - const hasPhysicalBackups = - configuration.physicalBackupData.earliestPhysicalBackupDateUnix !== null && - configuration.physicalBackupData.latestPhysicalBackupDateUnix !== null if (backups.isLoading) { return } else if (backups.error) { return - } else if (!isAvailable) { - return ( -
-

Coming soon

-
- ) - } else if (!configuration.walg_enabled) { + } + + const hasPhysicalBackups = + configuration.physicalBackupData.earliestPhysicalBackupDateUnix !== null && + configuration.physicalBackupData.latestPhysicalBackupDateUnix !== null + + if (!configuration.walg_enabled) { // Using this check as opposed to checking price tier to allow enabling PITR for our own internal projects return ( = () => { const recoveryTimeTargetUnix = convertTimeStringtoUnixMs(recoveryPoint, selectedTimezone) const { earliestPhysicalBackupDateUnix, latestPhysicalBackupDateUnix } = configuration.physicalBackupData + const isOutOfRange = recoveryTimeTargetUnix < earliestPhysicalBackupDateUnix || recoveryTimeTargetUnix > latestPhysicalBackupDateUnix @@ -108,7 +115,31 @@ const PITRBackupSelection: FC = () => { // To unix milliseconds const recoveryTimeTargetUnix = convertTimeStringtoUnixMs(recoveryPoint, selectedTimezone) - console.log('Confirm restore', { recoveryTimeTargetUnix, region: configuration.region }) + + try { + post(`${API_URL}/database/${projectRef}/backups/pitr`, { + recovery_time_target_unix: recoveryTimeTargetUnix, + region: configuration.region, + }).then(() => { + setTimeout(() => { + setShowConfirmation(false) + ui.setNotification({ + category: 'success', + message: `Restoring database back to ${dayjs(recoveryPoint).format( + 'DD MMM YYYY, HH:mm:ss' + )} ( + ${getTimezoneOffsetText(selectedTimezone)})`, + }) + router.push('/project/[id]', `/project/${projectRef}`) + }, 3000) + }) + } catch (error) { + ui.setNotification({ + error, + category: 'error', + message: `Point in time recovery for project failed`, + }) + } } return ( diff --git a/studio/components/layouts/ProjectLayout/ConnectingState.tsx b/studio/components/layouts/ProjectLayout/ConnectingState.tsx index 88b670c7a85..9c1908e8d18 100644 --- a/studio/components/layouts/ProjectLayout/ConnectingState.tsx +++ b/studio/components/layouts/ProjectLayout/ConnectingState.tsx @@ -12,7 +12,7 @@ interface Props { project: Project } -const ProjectRestartingState: FC = ({ project }) => { +const ConnectingState: FC = ({ project }) => { const { app } = useStore() const checkProjectConnectionIntervalRef = useRef() @@ -146,4 +146,4 @@ const ProjectRestartingState: FC = ({ project }) => { ) } -export default observer(ProjectRestartingState) +export default observer(ConnectingState)