Working on table data in detabase backups.

This commit is contained in:
charlesgauthereau
2025-09-19 13:28:40 +02:00
parent b95e145a8b
commit 34ff11f377
6 changed files with 63 additions and 63 deletions
@@ -21,9 +21,6 @@ export default async function RoutePage(props: PageParams<{
}>) { }>) {
const {projectId, databaseId} = await props.params; const {projectId, databaseId} = await props.params;
console.log("ici", projectId);
console.log("laa", databaseId);
const organization = await getOrganization({}); const organization = await getOrganization({});
if (!organization) { if (!organization) {
@@ -100,7 +97,9 @@ export default async function RoutePage(props: PageParams<{
<BackupButton disable={isAlreadyBackup} databaseId={databaseId}/> <BackupButton disable={isAlreadyBackup} databaseId={databaseId}/>
</PageActions> </PageActions>
</div> </div>
<PageDescription className="mt-5 sm:mt-0">{dbItem.description}</PageDescription> {dbItem.description && (
<PageDescription className="mt-5 sm:mt-0">{dbItem.description}</PageDescription>
)}
<PageContent className="flex flex-col w-full h-full"> <PageContent className="flex flex-col w-full h-full">
<DatabaseKpi successRate={successRate} database={dbItem} availableBackups={availableBackups} <DatabaseKpi successRate={successRate} database={dbItem} availableBackups={availableBackups}
totalBackups={totalBackups}/> totalBackups={totalBackups}/>
+1 -1
View File
@@ -54,7 +54,7 @@ services:
s3: s3:
container_name: s3-portabase-dev container_name: s3-portabase-dev
image: minio/minio:latest image: docker.io/bitnami/minio:latest
ports: ports:
- "9000:9000" - "9000:9000"
- "9001:9001" - "9001:9001"
+8 -9
View File
@@ -1,14 +1,13 @@
#!/bin/bash #!/bin/bash
echo " ____ __ __ " #echo " ____ __ __ "
echo " / __ \____ _____/ /_____ _/ /_ ____ _________ " #echo " / __ \____ _____/ /_____ _/ /_ ____ _________ "
echo " / /_/ / __ \/ ___/ __/ __ / __ \/ __ / ___/ _ \ " #echo " / /_/ / __ \/ ___/ __/ __ / __ \/ __ / ___/ _ \ "
echo " / ____/ /_/ / / / /_/ /_/ / /_/ / /_/ (__ ) __/ " #echo " / ____/ /_/ / / / /_/ /_/ / /_/ / /_/ (__ ) __/ "
echo " /_/ \____/_/ \__/\__,_/_.___/\__,_/____/\___/ " #echo " /_/ \____/_/ \__/\__,_/_.___/\__,_/____/\___/ "
echo " " #echo " "
echo " Community Edition v1.1.1 " #echo " Community Edition v1.1.1 "
echo " " #echo " "
node server.js node server.js
+43 -36
View File
@@ -141,47 +141,54 @@ export function backupColumns(isAlreadyRestore: boolean, settings: Setting, data
}; };
return ( return (
<DropdownMenu> <>
<DropdownMenuTrigger asChild> {rowData.deletedAt == null && (
<Button variant="ghost" className="h-8 w-8 p-0">
<span className="sr-only">Open menu</span> <DropdownMenu>
<MoreHorizontal className="h-4 w-4"/> <DropdownMenuTrigger asChild>
</Button> <Button variant="ghost" className="h-8 w-8 p-0">
</DropdownMenuTrigger> <span className="sr-only">Open menu</span>
<DropdownMenuContent align="end"> <MoreHorizontal className="h-4 w-4"/>
<DropdownMenuLabel>Actions</DropdownMenuLabel> </Button>
{status == "success" ? ( </DropdownMenuTrigger>
<> <DropdownMenuContent align="end">
<TooltipCustom disabled={isAlreadyRestore} text="Already a restoration waiting"> <DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuItem {status == "success" ? (
disabled={mutationRestore.isPending || isAlreadyRestore} <>
onClick={async () => { <TooltipCustom disabled={isAlreadyRestore}
await handleRestore(); text="Already a restoration waiting">
}} <DropdownMenuItem
> disabled={mutationRestore.isPending || isAlreadyRestore}
<ReloadIcon/> Restore onClick={async () => {
</DropdownMenuItem> await handleRestore();
</TooltipCustom> }}
>
<ReloadIcon/> Restore
</DropdownMenuItem>
</TooltipCustom>
<DropdownMenuItem
onClick={async () => {
await handleDownload(fileName ?? "");
}}
>
<Download/> Download
</DropdownMenuItem>
</>
) : null}
<DropdownMenuSeparator/>
<DropdownMenuItem <DropdownMenuItem
className="text-red-600"
onClick={async () => { onClick={async () => {
await handleDownload(fileName ?? ""); await handleDelete();
}} }}
> >
<Download/> Download <Trash2/> Delete
</DropdownMenuItem> </DropdownMenuItem>
</> </DropdownMenuContent>
) : null} </DropdownMenu>
<DropdownMenuSeparator/> )}
<DropdownMenuItem </>
className="text-red-600"
onClick={async () => {
await handleDelete();
}}
>
<Trash2/> Delete
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
); );
}, },
}, },
+3 -4
View File
@@ -1,13 +1,13 @@
import * as drizzleDb from "@/db"; import * as drizzleDb from "@/db";
import {db} from "@/db"; import {db} from "@/db";
import {desc, eq} from "drizzle-orm"; import {and, desc, eq, isNull} from "drizzle-orm";
import {deleteBackupCronAction} from "@/lib/tasks/database/utils/delete"; import {deleteBackupCronAction} from "@/lib/tasks/database/utils/delete";
export async function enforceRetentionCount(databaseId: string, count: number) { export async function enforceRetentionCount(databaseId: string, count: number) {
const backups = await db.query.backup.findMany({ const backups = await db.query.backup.findMany({
where: eq(drizzleDb.schemas.backup.databaseId, databaseId), where: and(eq(drizzleDb.schemas.backup.databaseId, databaseId), isNull(drizzleDb.schemas.backup.deletedAt)),
orderBy: desc(drizzleDb.schemas.backup.createdAt), orderBy: desc(drizzleDb.schemas.backup.createdAt),
with:{ with: {
database: { database: {
with: { with: {
project: true project: true
@@ -38,6 +38,5 @@ export async function enforceRetentionCount(databaseId: string, count: number) {
} }
} }
} }
+5 -9
View File
@@ -8,6 +8,7 @@ import * as drizzleDb from "@/db";
import {and, eq} from "drizzle-orm"; import {and, eq} from "drizzle-orm";
import {deleteFileS3Private, deleteLocalPrivate} from "@/features/upload/private/upload.action"; import {deleteFileS3Private, deleteLocalPrivate} from "@/features/upload/private/upload.action";
import {env} from "@/env.mjs"; import {env} from "@/env.mjs";
import {withUpdatedAt} from "@/db/utils";
export const deleteBackupCronAction = action export const deleteBackupCronAction = action
@@ -35,16 +36,13 @@ export const deleteBackupCronAction = action
}; };
} }
await db await db
.update(drizzleDb.schemas.backup) .update(drizzleDb.schemas.backup)
.set({ .set(withUpdatedAt({
deletedAt: new Date(), deletedAt: new Date(),
}) }))
.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; let success: boolean, message: string;
const result = const result =
@@ -71,12 +69,10 @@ 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)))
// .execute(); // .execute();
return { return {
success: true, success: true,
actionSuccess: { actionSuccess: {
message: "Backup deleted successfully.", message: `Backup deleted successfully (${parsedInput.backupId}).`,
}, },
}; };
@@ -85,7 +81,7 @@ export const deleteBackupCronAction = action
return { return {
success: false, success: false,
actionError: { actionError: {
message: "Failed to delete backup.", message: `Failed to delete backup(${parsedInput.backupId}).`,
status: 500, status: 500,
cause: error instanceof Error ? error.message : "Unknown error", cause: error instanceof Error ? error.message : "Unknown error",
messageParams: {message: "Error deleting the backup"}, messageParams: {message: "Error deleting the backup"},