fix: delete backup crash if no file.

This commit is contained in:
charlesgauthereau
2026-01-11 13:36:11 +01:00
parent 2d6be20b30
commit 4ed5f9872d
3 changed files with 39 additions and 105 deletions
@@ -7,12 +7,9 @@ import * as drizzleDb from "@/db";
import {db} from "@/db"; import {db} from "@/db";
import {and, eq} from "drizzle-orm"; import {and, eq} from "drizzle-orm";
import {Backup, Restoration} from "@/db/schema/07_database"; import {Backup, Restoration} from "@/db/schema/07_database";
import {NextResponse} from "next/server";
import { import {
deleteFileS3Private, deleteFileS3Private,
deleteLocalPrivate, deleteLocalPrivate,
uploadLocalPrivate,
uploadS3Private
} from "@/features/upload/private/upload.action"; } from "@/features/upload/private/upload.action";
import {env} from "@/env.mjs"; import {env} from "@/env.mjs";
import {withUpdatedAt} from "@/db/utils"; import {withUpdatedAt} from "@/db/utils";
@@ -89,98 +86,32 @@ export const deleteBackupAction = userAction
let success: boolean, message: string; let success: boolean, message: string;
const result = if (parsedInput.file) {
settings.storage === "local" const result =
? await deleteLocalPrivate(parsedInput.file) settings.storage === "local"
: await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!); ? await deleteLocalPrivate(parsedInput.file)
: await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!);
({success, message} = result); ({success, message} = result);
if (!success) { if (!success) {
return { return {
success: false, success: false,
actionError: { actionError: {
message: message, message: message,
status: 404, status: 404,
cause: "Unable to delete backup from storage", cause: "Unable to delete backup from storage",
messageParams: {message: "Error deleting the backup"}, messageParams: {message: "Error deleting the backup"},
}, },
}; };
}
} }
return { return {
success: true, success: true,
actionSuccess: { actionSuccess: {
message: `Backup deleted successfully (ref: ${parsedInput.backupId}).`, 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) { } catch (error) {
return { return {
success: false, success: false,
@@ -246,7 +177,6 @@ export const rerunRestorationAction = userAction
}); });
// Create Restoration Action (Drizzle version)
export const createRestorationAction = userAction export const createRestorationAction = userAction
.schema( .schema(
z.object({ z.object({
@@ -256,7 +186,6 @@ export const createRestorationAction = userAction
) )
.action(async ({parsedInput}): Promise<ServerActionResult<Restoration>> => { .action(async ({parsedInput}): Promise<ServerActionResult<Restoration>> => {
try { try {
// Insert new restoration into the database
const restorationData = await db const restorationData = await db
.insert(drizzleDb.schemas.restoration) .insert(drizzleDb.schemas.restoration)
.values({ .values({
+2 -1
View File
@@ -75,8 +75,9 @@ export async function deleteFileS3Private(fileName: string, bucketName: string)
*/ */
export async function deleteLocalPrivate(fileName: string) { export async function deleteLocalPrivate(fileName: string) {
try { try {
console.log(fileName);
const filePath = path.join(process.cwd(), privateLocalDir, fileName); const filePath = path.join(process.cwd(), privateLocalDir, fileName);
console.log(`Deleted ${filePath}`);
// Delete locally // Delete locally
await unlink(filePath); await unlink(filePath);
+20 -16
View File
@@ -43,27 +43,31 @@ export const deleteBackupCronAction = action
})) }))
.where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId))) .where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId)))
let success: boolean, message: string;
const result = if (parsedInput.file) {
settings.storage === "local" let success: boolean, message: string;
? await deleteLocalPrivate(parsedInput.file)
: await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!);
({success, message} = result); const result =
settings.storage === "local"
? await deleteLocalPrivate(parsedInput.file)
: await deleteFileS3Private(`${parsedInput.projectSlug}/${parsedInput.file}`, env.S3_BUCKET_NAME!);
if (!success) { ({success, message} = result);
return {
success: false, if (!success) {
actionError: { return {
message: message, success: false,
status: 404, actionError: {
cause: "Unable to delete backup from storage", message: message,
messageParams: {message: "Error deleting the backup"}, status: 404,
}, cause: "Unable to delete backup from storage",
}; messageParams: {message: "Error deleting the backup"},
},
};
}
} }
return { return {
success: true, success: true,
actionSuccess: { actionSuccess: {