From 8f905c81289343872f07b97095acebc8cb1c771c Mon Sep 17 00:00:00 2001 From: charlesgauthereau Date: Tue, 17 Feb 2026 08:47:57 +0100 Subject: [PATCH] fix: stuck backups with ongoing status but deleted, for legacy. --- .../updates/hooks/use-update-check.ts | 2 -- src/lib/tasks/cleaning/index.ts | 28 +++++++++++++++++++ src/lib/tasks/index.ts | 10 +++++++ src/utils/edge_key.ts | 1 - src/utils/init.ts | 9 +++++- 5 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/lib/tasks/cleaning/index.ts diff --git a/src/features/updates/hooks/use-update-check.ts b/src/features/updates/hooks/use-update-check.ts index 43adf34f..43fa2ad4 100644 --- a/src/features/updates/hooks/use-update-check.ts +++ b/src/features/updates/hooks/use-update-check.ts @@ -19,8 +19,6 @@ export const useUpdateCheck = () => { staleTime: 1000 * 60 * 60, }); - console.log("newRelease", newRelease); - useEffect(() => { if (!newRelease) return; diff --git a/src/lib/tasks/cleaning/index.ts b/src/lib/tasks/cleaning/index.ts new file mode 100644 index 00000000..192f6d4a --- /dev/null +++ b/src/lib/tasks/cleaning/index.ts @@ -0,0 +1,28 @@ +import {db} from "@/db"; +import {and, eq, isNotNull, isNull} from "drizzle-orm"; +import * as drizzleDb from "@/db"; +import {withUpdatedAt} from "@/db/utils"; + +export const backupCleanTask = async () => { + try { + const backups = await db.query.backup.findMany({ + where: and( + isNotNull(drizzleDb.schemas.backup.deletedAt), + eq(drizzleDb.schemas.backup.status, "ongoing") + ) + }); + + console.log(`Backups to clean: ${backups.length}`); + + for (const backup of backups) { + await db.update(drizzleDb.schemas.backup).set(withUpdatedAt({ + status: "failed", + })) + .where(eq(drizzleDb.schemas.backup.id, backup.id)); + } + + } catch (e: any) { + console.error("Backup cleanup failed:", e); + throw e; + } +}; \ No newline at end of file diff --git a/src/lib/tasks/index.ts b/src/lib/tasks/index.ts index a4d2566c..430bbaae 100644 --- a/src/lib/tasks/index.ts +++ b/src/lib/tasks/index.ts @@ -1,6 +1,7 @@ import cron from "node-cron"; import {retentionCleanTask} from "@/lib/tasks/database"; import {env} from "@/env.mjs"; +import {backupCleanTask} from "@/lib/tasks/cleaning"; export const retentionJob = cron.schedule(env.RETENTION_CRON, async () => { @@ -10,4 +11,13 @@ export const retentionJob = cron.schedule(env.RETENTION_CRON, async () => { } catch (err) { console.error(`[CRON] Error:`, err); } +}); + +export const cleaningJob = cron.schedule("* * * * *", async () => { + try { + console.log("Cleaning Job : Starting task"); + await backupCleanTask(); + } catch (err) { + console.error(`[CRON] Error:`, err); + } }); \ No newline at end of file diff --git a/src/utils/edge_key.ts b/src/utils/edge_key.ts index 7be159c6..fee5ef21 100644 --- a/src/utils/edge_key.ts +++ b/src/utils/edge_key.ts @@ -3,7 +3,6 @@ import {getMasterServerKeyContent} from "@/features/keys/keys.action"; export async function generateEdgeKey(serverUrl: string, agentId: string): Promise { const masterKey = getMasterServerKeyContent() - console.log("Master server key: ", masterKey) const edgeKeyData = { serverUrl, agentId, diff --git a/src/utils/init.ts b/src/utils/init.ts index 9344b763..75dbaf58 100644 --- a/src/utils/init.ts +++ b/src/utils/init.ts @@ -2,7 +2,7 @@ import {env} from "@/env.mjs"; import {db, makeMigration} from "@/db"; import {eq} from "drizzle-orm"; import * as drizzleDb from "@/db"; -import {retentionJob} from "@/lib/tasks"; +import {cleaningJob, retentionJob} from "@/lib/tasks"; import {generateRSAKeys, getOrCreateMasterKey} from "@/utils/rsa-keys"; import {StorageProviderKind} from "@/features/storages/types"; @@ -17,6 +17,7 @@ export async function init() { await createSettingsIfNotExist() console.log("====Initialization completed===="); await setupCronJobs() + await setupCleaningJobs() } async function setupCronJobs() { @@ -25,6 +26,12 @@ async function setupCronJobs() { console.log("==== Cron job started ===="); } +async function setupCleaningJobs() { + console.log("==== Setting up Cleaning Jobs ===="); + cleaningJob.start(); + console.log("==== Cleaning job started ===="); +} + async function createSettingsIfNotExist() { await db.transaction(async (tx) => { const systemSettingsValues = {