From decfb3fb8cc235be005747213eb06e1f8a2c0075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Marolt?= Date: Mon, 10 Nov 2025 13:34:32 +0100 Subject: [PATCH 1/2] chore: automatic integrations table backups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uroš Marolt --- .../U1762773409__integrations-backup.sql | 0 .../V1762773409__integrations-backup.sql | 10 +++++++++ .../src/jobs/integrationsBackup.job.ts | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 backend/src/database/migrations/U1762773409__integrations-backup.sql create mode 100644 backend/src/database/migrations/V1762773409__integrations-backup.sql create mode 100644 services/apps/cron_service/src/jobs/integrationsBackup.job.ts diff --git a/backend/src/database/migrations/U1762773409__integrations-backup.sql b/backend/src/database/migrations/U1762773409__integrations-backup.sql new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backend/src/database/migrations/V1762773409__integrations-backup.sql b/backend/src/database/migrations/V1762773409__integrations-backup.sql new file mode 100644 index 0000000000..c3a4ba4777 --- /dev/null +++ b/backend/src/database/migrations/V1762773409__integrations-backup.sql @@ -0,0 +1,10 @@ +create table "integrationsHistory" as +select * +from "integrations" +where 1 = 2; + +alter table "integrationsHistory" + add column "historyCreatedAt" timestamptz not null default now(); + +create index if not exists ix_integration_history_integration_id on "integrationsHistory" ("id"); +create index if not exists ix_integration_history_history_created_at on "integrationsHistory" ("historyCreatedAt"); \ No newline at end of file diff --git a/services/apps/cron_service/src/jobs/integrationsBackup.job.ts b/services/apps/cron_service/src/jobs/integrationsBackup.job.ts new file mode 100644 index 0000000000..7aa0d23f6c --- /dev/null +++ b/services/apps/cron_service/src/jobs/integrationsBackup.job.ts @@ -0,0 +1,21 @@ +import CronTime from 'cron-time-generator' + +import { IS_PROD_ENV } from '@crowd/common' +import { WRITE_DB_CONFIG, getDbConnection } from '@crowd/data-access-layer/src/database' + +import { IJobDefinition } from '../types' + +const job: IJobDefinition = { + name: 'integrations-backup', + cronTime: CronTime.every(1).minutes(), + timeout: 60 * 60, // 1 hour = 60 * 60 seconds + enabled: async () => true, + process: async (ctx) => { + ctx.log.info('Starting integrations backup job!') + const dbConnection = await getDbConnection(WRITE_DB_CONFIG(), 1, 0) + await dbConnection.query(`insert into "integrationsHistory" select * from "integrations";`) + ctx.log.info('Integrations backup job completed!') + }, +} + +export default job From 7105c102aced881afd49503d2ef58ed26f4c647e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Marolt?= Date: Tue, 11 Nov 2025 08:55:38 +0100 Subject: [PATCH 2/2] chore: rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uroš Marolt --- .../migrations/V1762773409__integrations-backup.sql | 10 +++++----- .../cron_service/src/jobs/integrationsBackup.job.ts | 9 ++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/database/migrations/V1762773409__integrations-backup.sql b/backend/src/database/migrations/V1762773409__integrations-backup.sql index c3a4ba4777..7125accdbf 100644 --- a/backend/src/database/migrations/V1762773409__integrations-backup.sql +++ b/backend/src/database/migrations/V1762773409__integrations-backup.sql @@ -1,10 +1,10 @@ -create table "integrationsHistory" as +create table "integrationsBackup" as select * from "integrations" where 1 = 2; -alter table "integrationsHistory" - add column "historyCreatedAt" timestamptz not null default now(); +alter table "integrationsBackup" + add column "backupCreatedAt" timestamptz not null default now(); -create index if not exists ix_integration_history_integration_id on "integrationsHistory" ("id"); -create index if not exists ix_integration_history_history_created_at on "integrationsHistory" ("historyCreatedAt"); \ No newline at end of file +create index if not exists ix_integration_history_integration_id on "integrationsBackup" ("id"); +create index if not exists ix_integration_history_history_created_at on "integrationsBackup" ("backupCreatedAt"); \ No newline at end of file diff --git a/services/apps/cron_service/src/jobs/integrationsBackup.job.ts b/services/apps/cron_service/src/jobs/integrationsBackup.job.ts index 7aa0d23f6c..e32c1bdf16 100644 --- a/services/apps/cron_service/src/jobs/integrationsBackup.job.ts +++ b/services/apps/cron_service/src/jobs/integrationsBackup.job.ts @@ -7,13 +7,16 @@ import { IJobDefinition } from '../types' const job: IJobDefinition = { name: 'integrations-backup', - cronTime: CronTime.every(1).minutes(), + cronTime: CronTime.every(1).days(), timeout: 60 * 60, // 1 hour = 60 * 60 seconds - enabled: async () => true, + enabled: async () => IS_PROD_ENV, process: async (ctx) => { ctx.log.info('Starting integrations backup job!') const dbConnection = await getDbConnection(WRITE_DB_CONFIG(), 1, 0) - await dbConnection.query(`insert into "integrationsHistory" select * from "integrations";`) + await dbConnection.query(`insert into "integrationsBackup" select * from "integrations";`) + await dbConnection.query( + `delete from "integrationsBackup" where "backupCreatedAt" < now() - interval '2 months'`, + ) ctx.log.info('Integrations backup job completed!') }, }