diff --git a/app/(customer)/dashboard/(organization)/projects/[projectId]/database/[databaseId]/page.tsx b/app/(customer)/dashboard/(organization)/projects/[projectId]/database/[databaseId]/page.tsx index 770d1542..f7dfe10b 100644 --- a/app/(customer)/dashboard/(organization)/projects/[projectId]/database/[databaseId]/page.tsx +++ b/app/(customer)/dashboard/(organization)/projects/[projectId]/database/[databaseId]/page.tsx @@ -39,7 +39,8 @@ export default async function RoutePage(props: PageParams<{ const dbItem = await db.query.database.findFirst({ where: and(inArray(drizzleDb.schemas.backup.id, databasesProject.ids ?? []), eq(drizzleDb.schemas.database.id, databaseId), eq(drizzleDb.schemas.database.projectId, projectId)), with: { - project: true + project: true, + retentionPolicy: true } }); diff --git a/src/components/wrappers/dashboard/database/retention-policy/backup-retention-settings-form.tsx b/src/components/wrappers/dashboard/database/retention-policy/backup-retention-settings-form.tsx new file mode 100644 index 00000000..99f52676 --- /dev/null +++ b/src/components/wrappers/dashboard/database/retention-policy/backup-retention-settings-form.tsx @@ -0,0 +1,306 @@ +"use client" +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, + useZodForm +} from "@/components/ui/form"; +import {DatabaseType} from "@/components/wrappers/dashboard/database/database-form/form-database.schema"; +import {RetentionSettings, RetentionSettingsSchema} from "./backup-retention-settings.schema"; +import {useMutation} from "@tanstack/react-query"; +import {updateOrCreateBackupRetentionPolicyAction} from "./backup-retention-settings.action"; +import {Database, DatabaseWith, RetentionPolicy} from "@/db/schema/07_database"; +import {toast} from "sonner"; +import {useRouter} from "next/navigation"; +import {RadioGroup, RadioGroupItem} from "@/components/ui/radio-group"; +import {Badge} from "@/components/ui/badge"; +import {Separator} from "@/components/ui/separator"; +import {Input} from "@/components/ui/input"; +import {Button} from "@/components/ui/button"; +import {Calendar, Save} from "lucide-react"; + + +export type BackupRetentionSettingsFormProps = { + defaultValues?: RetentionPolicy; + database: DatabaseWith; +}; + + +export const BackupRetentionSettingsForm = ({defaultValues, database}: BackupRetentionSettingsFormProps) => { + const router = useRouter(); + + const form = useZodForm({ + schema: RetentionSettingsSchema, + defaultValues: { + type: defaultValues?.type ?? "gfs", + count: defaultValues?.count ?? 7, + days: defaultValues?.days ?? 30, + gfs: { + daily: defaultValues?.gfsDaily ?? 7, + weekly: defaultValues?.gfsWeekly ?? 4, + monthly: defaultValues?.gfsMonthly ?? 12, + yearly: defaultValues?.gfsYearly ?? 3, + }, + }, + }); + + const mutation = useMutation({ + mutationFn: async (payload: RetentionSettings) => + await updateOrCreateBackupRetentionPolicyAction({ + databaseId: database.id, + settings: payload, + }), + onSuccess: () => { + toast.success("Retention policy updated successfully."); + router.refresh() + }, + onError: () => { + toast.error("An error occurred while updating retention policy."); + }, + }); + + const calculateTotalFiles = (values: RetentionSettings) => { + if (values.type === "gfs") { + return values.gfs.daily + values.gfs.weekly + values.gfs.monthly + values.gfs.yearly; + } + return values.type === "count" ? values.count : values.days; + }; + + const getStorageEstimate = (totalFiles: number) => { + if (totalFiles <= 10) return "Low"; + if (totalFiles <= 30) return "Medium"; + return "High"; + }; + + return ( +