Finish working on backups side deletion feature, to be review, test and deply in RC for tests.

This commit is contained in:
charlesgauthereau
2025-09-22 20:31:29 +02:00
parent 34ff11f377
commit 654ff6b9a5
10 changed files with 426 additions and 185 deletions
+29 -9
View File
@@ -28,23 +28,43 @@ import {Setting} from "@/db/schema/01_setting";
import {SafeActionResult} from "next-safe-action";
import {ZodString} from "zod";
import {ServerActionResult} from "@/types/action-type";
import {cn} from "@/lib/utils";
import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip";
export function backupColumns(isAlreadyRestore: boolean, settings: Setting, database: DatabaseWith): ColumnDef<Backup>[] {
return [
{
id: "availability",
cell: ({row}) => {
const colorStatus = row.original.deletedAt != null ? "bg-red-400 border-red-600" : "bg-green-400 border-green-600";
return (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<div className={cn("w-5 h-5 rounded-full border-4", colorStatus)}/>
</TooltipTrigger>
{row.original.deletedAt != null && (
<TooltipContent>
<p>{formatFrenchDate(row.getValue("deletedAt"))}</p>
</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
)
},
},
{
accessorKey: "id",
header: "Reference",
},
{
accessorKey: "deletedAt",
header: "Deleted At",
cell: ({row}) => {
return row.original.deletedAt ? formatFrenchDate(row.getValue("deletedAt")) : ""
},
},
// {
// accessorKey: "deletedAt",
// header: "Deleted At",
// cell: ({row}) => {
// return row.original.deletedAt ? formatFrenchDate(row.getValue("deletedAt")) : "-"
// },
// },
{
accessorKey: "createdAt",
header: "Created At",
@@ -15,6 +15,7 @@ import {
uploadS3Private
} from "@/features/upload/private/upload.action";
import {env} from "@/env.mjs";
import {withUpdatedAt} from "@/db/utils";
export const deleteRestoreAction = userAction
.schema(
@@ -63,6 +64,7 @@ export const deleteBackupAction = userAction
.action(async ({parsedInput}): Promise<ServerActionResult<Backup>> => {
try {
const [settings] = await db.select().from(drizzleDb.schemas.setting).where(eq(drizzleDb.schemas.setting.name, "system")).limit(1);
if (!settings) {
return {
@@ -76,6 +78,12 @@ export const deleteBackupAction = userAction
};
}
await db
.update(drizzleDb.schemas.backup)
.set(withUpdatedAt({
deletedAt: new Date(),
}))
.where(and(eq(drizzleDb.schemas.backup.id, parsedInput.backupId), eq(drizzleDb.schemas.backup.databaseId, parsedInput.databaseId)))
let success: boolean, message: string;
@@ -98,36 +106,79 @@ export const deleteBackupAction = userAction
};
}
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();
return {
success: true,
actionSuccess: {
message: `Backup deleted successfully (ref: ${parsedInput.backupId}).`,
},
};
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"},
},
};
}
// 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,