mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
feat: backup delete/restore actions.
This commit is contained in:
@@ -93,139 +93,139 @@ export function backupColumns(
|
||||
return <StatusBadge status={row.getValue("status")}/>;
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "actions2",
|
||||
cell: ({row}) => <DatabaseActionsCell activeMember={activeMember} backup={row.original}/>,
|
||||
},
|
||||
{
|
||||
id: "actions",
|
||||
cell: ({row, table}) => {
|
||||
const status = row.getValue("status");
|
||||
const rowData: Backup = row.original;
|
||||
const fileName = rowData.file;
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
const mutationRestore = useMutation({
|
||||
mutationFn: async () => {
|
||||
const restoration = await createRestorationAction({
|
||||
backupId: rowData.id,
|
||||
databaseId: rowData.databaseId,
|
||||
});
|
||||
// @ts-ignore
|
||||
if (restoration.data.success) {
|
||||
// @ts-ignore
|
||||
toast.success(restoration.data.actionSuccess?.message || "Restoration created successfully!");
|
||||
router.refresh();
|
||||
} else {
|
||||
// @ts-ignore
|
||||
toast.error(restoration.serverError || "Failed to create restoration.");
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const mutationDeleteBackup = useMutation({
|
||||
mutationFn: async () => {
|
||||
const deletion = await deleteBackupAction({
|
||||
backupId: rowData.id,
|
||||
databaseId: rowData.databaseId,
|
||||
status: rowData.status,
|
||||
file: rowData.file ?? "",
|
||||
projectSlug: database.project?.slug!
|
||||
});
|
||||
// @ts-ignore
|
||||
if (deletion.data.success) {
|
||||
// @ts-ignore
|
||||
toast.success(deletion.data.actionSuccess.message);
|
||||
router.refresh();
|
||||
} else {
|
||||
// @ts-ignore
|
||||
toast.error(deletion.data.actionError.message);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const handleRestore = async () => {
|
||||
await mutationRestore.mutateAsync();
|
||||
};
|
||||
|
||||
const handleDelete = async () => {
|
||||
await mutationDeleteBackup.mutateAsync();
|
||||
};
|
||||
|
||||
const handleDownload = async (fileName: string) => {
|
||||
|
||||
let url: string = "";
|
||||
let data: SafeActionResult<string, ZodString, readonly [], {
|
||||
_errors?: string[] | undefined;
|
||||
}, readonly [], ServerActionResult<string>, object> | undefined
|
||||
|
||||
if (settings.storage == "local") {
|
||||
data = await getFileUrlPresignedLocal({fileName: fileName!})
|
||||
} else if (settings.storage == "s3") {
|
||||
data = await getFileUrlPreSignedS3Action(`backups/${database.project?.slug}/${fileName}`);
|
||||
}
|
||||
if (data?.data?.success) {
|
||||
url = data.data.value ?? "";
|
||||
} else {
|
||||
// @ts-ignore
|
||||
const errorMessage = data?.data?.actionError?.message || "Failed to get file!";
|
||||
toast.error(errorMessage);
|
||||
}
|
||||
|
||||
window.open(url, "_self");
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{(rowData.deletedAt == null && activeMember.role != "member") && (
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="ghost" className="h-8 w-8 p-0">
|
||||
<span className="sr-only">Open menu</span>
|
||||
<MoreHorizontal className="h-4 w-4"/>
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align="end">
|
||||
<DropdownMenuLabel>Actions</DropdownMenuLabel>
|
||||
{status == "success" ? (
|
||||
<>
|
||||
<TooltipCustom disabled={isAlreadyRestore}
|
||||
text="Already a restoration waiting">
|
||||
<DropdownMenuItem
|
||||
disabled={mutationRestore.isPending || isAlreadyRestore}
|
||||
onClick={async () => {
|
||||
await handleRestore();
|
||||
}}
|
||||
>
|
||||
<ReloadIcon/> Restore
|
||||
</DropdownMenuItem>
|
||||
</TooltipCustom>
|
||||
<DropdownMenuItem
|
||||
onClick={async () => {
|
||||
await handleDownload(fileName ?? "");
|
||||
}}
|
||||
>
|
||||
<Download/> Download
|
||||
</DropdownMenuItem>
|
||||
</>
|
||||
) : null}
|
||||
<DropdownMenuSeparator/>
|
||||
<DropdownMenuItem
|
||||
className="text-red-600"
|
||||
onClick={async () => {
|
||||
await handleDelete();
|
||||
}}
|
||||
>
|
||||
<Trash2/> Delete
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
)}
|
||||
</>
|
||||
|
||||
);
|
||||
},
|
||||
cell: ({row}) => <DatabaseActionsCell isAlreadyRestore={isAlreadyRestore} activeMember={activeMember} backup={row.original}/>,
|
||||
},
|
||||
// {
|
||||
// id: "actions",
|
||||
// cell: ({row, table}) => {
|
||||
// const status = row.getValue("status");
|
||||
// const rowData: Backup = row.original;
|
||||
// const fileName = rowData.file;
|
||||
//
|
||||
// const router = useRouter();
|
||||
//
|
||||
// const mutationRestore = useMutation({
|
||||
// mutationFn: async () => {
|
||||
// const restoration = await createRestorationAction({
|
||||
// backupId: rowData.id,
|
||||
// databaseId: rowData.databaseId,
|
||||
// });
|
||||
// // @ts-ignore
|
||||
// if (restoration.data.success) {
|
||||
// // @ts-ignore
|
||||
// toast.success(restoration.data.actionSuccess?.message || "Restoration created successfully!");
|
||||
// router.refresh();
|
||||
// } else {
|
||||
// // @ts-ignore
|
||||
// toast.error(restoration.serverError || "Failed to create restoration.");
|
||||
// }
|
||||
// },
|
||||
// });
|
||||
//
|
||||
// const mutationDeleteBackup = useMutation({
|
||||
// mutationFn: async () => {
|
||||
// const deletion = await deleteBackupAction({
|
||||
// backupId: rowData.id,
|
||||
// databaseId: rowData.databaseId,
|
||||
// status: rowData.status,
|
||||
// file: rowData.file ?? "",
|
||||
// projectSlug: database.project?.slug!
|
||||
// });
|
||||
// // @ts-ignore
|
||||
// if (deletion.data.success) {
|
||||
// // @ts-ignore
|
||||
// toast.success(deletion.data.actionSuccess.message);
|
||||
// router.refresh();
|
||||
// } else {
|
||||
// // @ts-ignore
|
||||
// toast.error(deletion.data.actionError.message);
|
||||
// }
|
||||
// },
|
||||
// });
|
||||
//
|
||||
// const handleRestore = async () => {
|
||||
// await mutationRestore.mutateAsync();
|
||||
// };
|
||||
//
|
||||
// const handleDelete = async () => {
|
||||
// await mutationDeleteBackup.mutateAsync();
|
||||
// };
|
||||
//
|
||||
// const handleDownload = async (fileName: string) => {
|
||||
//
|
||||
// let url: string = "";
|
||||
// let data: SafeActionResult<string, ZodString, readonly [], {
|
||||
// _errors?: string[] | undefined;
|
||||
// }, readonly [], ServerActionResult<string>, object> | undefined
|
||||
//
|
||||
// if (settings.storage == "local") {
|
||||
// data = await getFileUrlPresignedLocal({fileName: fileName!})
|
||||
// } else if (settings.storage == "s3") {
|
||||
// data = await getFileUrlPreSignedS3Action(`backups/${database.project?.slug}/${fileName}`);
|
||||
// }
|
||||
// if (data?.data?.success) {
|
||||
// url = data.data.value ?? "";
|
||||
// } else {
|
||||
// // @ts-ignore
|
||||
// const errorMessage = data?.data?.actionError?.message || "Failed to get file!";
|
||||
// toast.error(errorMessage);
|
||||
// }
|
||||
//
|
||||
// window.open(url, "_self");
|
||||
// };
|
||||
//
|
||||
// return (
|
||||
// <>
|
||||
// {(rowData.deletedAt == null && activeMember.role != "member") && (
|
||||
// <DropdownMenu>
|
||||
// <DropdownMenuTrigger asChild>
|
||||
// <Button variant="ghost" className="h-8 w-8 p-0">
|
||||
// <span className="sr-only">Open menu</span>
|
||||
// <MoreHorizontal className="h-4 w-4"/>
|
||||
// </Button>
|
||||
// </DropdownMenuTrigger>
|
||||
// <DropdownMenuContent align="end">
|
||||
// <DropdownMenuLabel>Actions</DropdownMenuLabel>
|
||||
// {status == "success" ? (
|
||||
// <>
|
||||
// <TooltipCustom disabled={isAlreadyRestore}
|
||||
// text="Already a restoration waiting">
|
||||
// <DropdownMenuItem
|
||||
// disabled={mutationRestore.isPending || isAlreadyRestore}
|
||||
// onClick={async () => {
|
||||
// await handleRestore();
|
||||
// }}
|
||||
// >
|
||||
// <ReloadIcon/> Restore
|
||||
// </DropdownMenuItem>
|
||||
// </TooltipCustom>
|
||||
// <DropdownMenuItem
|
||||
// onClick={async () => {
|
||||
// await handleDownload(fileName ?? "");
|
||||
// }}
|
||||
// >
|
||||
// <Download/> Download
|
||||
// </DropdownMenuItem>
|
||||
// </>
|
||||
// ) : null}
|
||||
// <DropdownMenuSeparator/>
|
||||
// <DropdownMenuItem
|
||||
// className="text-red-600"
|
||||
// onClick={async () => {
|
||||
// await handleDelete();
|
||||
// }}
|
||||
// >
|
||||
// <Trash2/> Delete
|
||||
// </DropdownMenuItem>
|
||||
// </DropdownMenuContent>
|
||||
// </DropdownMenu>
|
||||
// )}
|
||||
// </>
|
||||
//
|
||||
// );
|
||||
// },
|
||||
// },
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user