From 4ed5f9872d52229b5f344f6dddec2de67be31a01 Mon Sep 17 00:00:00 2001 From: charlesgauthereau Date: Sun, 11 Jan 2026 13:36:11 +0100 Subject: [PATCH] fix: delete backup crash if no file. --- .../dashboard/restore/restore.action.ts | 105 +++--------------- src/features/upload/private/upload.action.ts | 3 +- src/lib/tasks/database/utils/delete.ts | 36 +++--- 3 files changed, 39 insertions(+), 105 deletions(-) diff --git a/src/features/dashboard/restore/restore.action.ts b/src/features/dashboard/restore/restore.action.ts index c28784f3..6ae72a74 100644 --- a/src/features/dashboard/restore/restore.action.ts +++ b/src/features/dashboard/restore/restore.action.ts @@ -7,12 +7,9 @@ import * as drizzleDb from "@/db"; import {db} from "@/db"; import {and, eq} from "drizzle-orm"; import {Backup, Restoration} from "@/db/schema/07_database"; -import {NextResponse} from "next/server"; import { deleteFileS3Private, deleteLocalPrivate, - uploadLocalPrivate, - uploadS3Private } from "@/features/upload/private/upload.action"; import {env} from "@/env.mjs"; import {withUpdatedAt} from "@/db/utils"; @@ -89,98 +86,32 @@ export const deleteBackupAction = userAction let success: boolean, message: string; - const result = - settings.storage === "local" - ? await deleteLocalPrivate(parsedInput.file) - : await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); + if (parsedInput.file) { + const result = + settings.storage === "local" + ? await deleteLocalPrivate(parsedInput.file) + : await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); - ({success, message} = result); + ({success, message} = result); - if (!success) { - return { - success: false, - actionError: { - message: message, - status: 404, - cause: "Unable to delete backup from storage", - messageParams: {message: "Error deleting the backup"}, - }, - }; + if (!success) { + return { + success: false, + actionError: { + message: message, + status: 404, + cause: "Unable to delete backup from storage", + messageParams: {message: "Error deleting the backup"}, + }, + }; + } } - return { success: true, actionSuccess: { message: `Backup deleted successfully (ref: ${parsedInput.backupId}).`, }, }; - - - // const [settings] = await db.select().from(drizzleDb.schemas.setting).where(eq(drizzleDb.schemas.setting.name, "system")).limit(1); - // if (!settings) { - // return { - // success: false, - // actionError: { - // message: "No settings found.", - // status: 404, - // cause: "No settings found.", - // messageParams: {message: "Error deleting the backup"}, - // }, - // }; - // } - // - // - // let success: boolean, message: string; - // - // const result = - // settings.storage === "local" - // ? await deleteLocalPrivate(parsedInput.file) - // : await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); - // - // ({success, message} = result); - // - // if (!success) { - // return { - // success: false, - // actionError: { - // message: message, - // status: 404, - // cause: "Unable to delete backup from storage", - // messageParams: {message: "Error deleting the backup"}, - // }, - // }; - // } - // - // await db - // .delete(drizzleDb.schemas.backup) - // .where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId))) - // .execute(); - // - // const backupExists = await db - // .select() - // .from(drizzleDb.schemas.backup) - // .where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId))) - // .execute(); - // - // - // if (backupExists.length === 0) { - // return { - // success: true, - // actionSuccess: { - // message: "Backup deleted successfully.", - // }, - // }; - // } else { - // return { - // success: false, - // actionError: { - // message: "Backup not found or already deleted.", - // status: 404, - // cause: "Backup could not be deleted (from database or remote storage).", - // messageParams: {message: "Error deleting the backup"}, - // }, - // }; - // } } catch (error) { return { success: false, @@ -246,7 +177,6 @@ export const rerunRestorationAction = userAction }); -// Create Restoration Action (Drizzle version) export const createRestorationAction = userAction .schema( z.object({ @@ -256,7 +186,6 @@ export const createRestorationAction = userAction ) .action(async ({parsedInput}): Promise> => { try { - // Insert new restoration into the database const restorationData = await db .insert(drizzleDb.schemas.restoration) .values({ diff --git a/src/features/upload/private/upload.action.ts b/src/features/upload/private/upload.action.ts index ea4322e3..6388262a 100644 --- a/src/features/upload/private/upload.action.ts +++ b/src/features/upload/private/upload.action.ts @@ -75,8 +75,9 @@ export async function deleteFileS3Private(fileName: string, bucketName: string) */ export async function deleteLocalPrivate(fileName: string) { try { + console.log(fileName); const filePath = path.join(process.cwd(), privateLocalDir, fileName); - + console.log(`Deleted ${filePath}`); // Delete locally await unlink(filePath); diff --git a/src/lib/tasks/database/utils/delete.ts b/src/lib/tasks/database/utils/delete.ts index 5075dac2..dec81f3e 100644 --- a/src/lib/tasks/database/utils/delete.ts +++ b/src/lib/tasks/database/utils/delete.ts @@ -43,27 +43,31 @@ export const deleteBackupCronAction = action })) .where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId))) - let success: boolean, message: string; - const result = - settings.storage === "local" - ? await deleteLocalPrivate(parsedInput.file) - : await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); + if (parsedInput.file) { + let success: boolean, message: string; - ({success, message} = result); + const result = + settings.storage === "local" + ? await deleteLocalPrivate(parsedInput.file) + : await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); - if (!success) { - return { - success: false, - actionError: { - message: message, - status: 404, - cause: "Unable to delete backup from storage", - messageParams: {message: "Error deleting the backup"}, - }, - }; + ({success, message} = result); + + if (!success) { + return { + success: false, + actionError: { + message: message, + status: 404, + cause: "Unable to delete backup from storage", + messageParams: {message: "Error deleting the backup"}, + }, + }; + } } + return { success: true, actionSuccess: {