From 5560c18a098a60f52c118e43b0b51e0ba5e0a39c Mon Sep 17 00:00:00 2001 From: = Date: Wed, 29 May 2024 18:46:11 +0530 Subject: [PATCH] feat: made migration script idempotent --- .../20240529111503_secret-replication.ts | 73 +++++++++++++++---- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/backend/src/db/migrations/20240529111503_secret-replication.ts b/backend/src/db/migrations/20240529111503_secret-replication.ts index 3cf555007..a51d557a7 100644 --- a/backend/src/db/migrations/20240529111503_secret-replication.ts +++ b/backend/src/db/migrations/20240529111503_secret-replication.ts @@ -3,71 +3,112 @@ import { Knex } from "knex"; import { TableName } from "../schemas"; export async function up(knex: Knex): Promise { + const doesSecretImportIsReplicationExist = await knex.schema.hasColumn(TableName.SecretImport, "isReplication"); + const doesSecretImportIsReplicationSuccessExist = await knex.schema.hasColumn( + TableName.SecretImport, + "isReplicationSuccess" + ); + const doesSecretImportReplicationStatusExist = await knex.schema.hasColumn( + TableName.SecretImport, + "replicationStatus" + ); + const doesSecretImportLastReplicatedExist = await knex.schema.hasColumn(TableName.SecretImport, "lastReplicated"); + if (await knex.schema.hasTable(TableName.SecretImport)) { await knex.schema.alterTable(TableName.SecretImport, (t) => { - t.boolean("isReplication").defaultTo(false); - t.boolean("isReplicationSuccess").nullable(); - t.text("replicationStatus").nullable(); - t.datetime("lastReplicated").nullable(); + if (!doesSecretImportIsReplicationExist) t.boolean("isReplication").defaultTo(false); + if (!doesSecretImportIsReplicationSuccessExist) t.boolean("isReplicationSuccess").nullable(); + if (!doesSecretImportReplicationStatusExist) t.text("replicationStatus").nullable(); + if (!doesSecretImportLastReplicatedExist) t.datetime("lastReplicated").nullable(); }); } + const doesSecretIsReplicatedExist = await knex.schema.hasColumn(TableName.Secret, "isReplicated"); if (await knex.schema.hasTable(TableName.Secret)) { await knex.schema.alterTable(TableName.Secret, (t) => { - t.boolean("isReplicated"); + if (!doesSecretIsReplicatedExist) t.boolean("isReplicated"); }); } + const doesSecretVersionIsReplicatedExist = await knex.schema.hasColumn(TableName.SecretVersion, "isReplicated"); if (await knex.schema.hasTable(TableName.SecretVersion)) { await knex.schema.alterTable(TableName.SecretVersion, (t) => { - t.boolean("isReplicated"); + if (!doesSecretVersionIsReplicatedExist) t.boolean("isReplicated"); }); } + const doesSecretApprovalRequestSecretIsReplicatedExist = await knex.schema.hasColumn( + TableName.SecretApprovalRequestSecret, + "isReplicated" + ); if (await knex.schema.hasTable(TableName.SecretApprovalRequestSecret)) { await knex.schema.alterTable(TableName.SecretApprovalRequestSecret, (t) => { - t.boolean("isReplicated"); + if (!doesSecretApprovalRequestSecretIsReplicatedExist) t.boolean("isReplicated"); }); } + const doesSecretApprovalRequestIsReplicatedExist = await knex.schema.hasColumn( + TableName.SecretApprovalRequest, + "isReplicated" + ); if (await knex.schema.hasTable(TableName.SecretApprovalRequest)) { await knex.schema.alterTable(TableName.SecretApprovalRequest, (t) => { - t.boolean("isReplicated"); + if (!doesSecretApprovalRequestIsReplicatedExist) t.boolean("isReplicated"); }); } } export async function down(knex: Knex): Promise { + const doesSecretImportIsReplicationExist = await knex.schema.hasColumn(TableName.SecretImport, "isReplication"); + const doesSecretImportIsReplicationSuccessExist = await knex.schema.hasColumn( + TableName.SecretImport, + "isReplicationSuccess" + ); + const doesSecretImportReplicationStatusExist = await knex.schema.hasColumn( + TableName.SecretImport, + "replicationStatus" + ); + const doesSecretImportLastReplicatedExist = await knex.schema.hasColumn(TableName.SecretImport, "lastReplicated"); if (await knex.schema.hasTable(TableName.SecretImport)) { await knex.schema.alterTable(TableName.SecretImport, (t) => { - t.dropColumns("isReplication"); - t.dropColumns("isReplicationSuccess"); - t.dropColumns("replicationStatus"); - t.dropColumns("lastReplicated"); + if (doesSecretImportIsReplicationExist) t.dropColumn("isReplication"); + if (doesSecretImportIsReplicationSuccessExist) t.dropColumn("isReplicationSuccess"); + if (doesSecretImportReplicationStatusExist) t.dropColumn("replicationStatus"); + if (doesSecretImportLastReplicatedExist) t.dropColumn("lastReplicated"); }); } + const doesSecretIsReplicatedExist = await knex.schema.hasColumn(TableName.Secret, "isReplicated"); if (await knex.schema.hasTable(TableName.Secret)) { await knex.schema.alterTable(TableName.Secret, (t) => { - t.dropColumns("isReplicated"); + if (doesSecretIsReplicatedExist) t.dropColumns("isReplicated"); }); } + const doesSecretVersionIsReplicatedExist = await knex.schema.hasColumn(TableName.SecretVersion, "isReplicated"); if (await knex.schema.hasTable(TableName.SecretVersion)) { await knex.schema.alterTable(TableName.SecretVersion, (t) => { - t.dropColumns("isReplicated"); + if (doesSecretVersionIsReplicatedExist) t.dropColumns("isReplicated"); }); } + const doesSecretApprovalRequestSecretIsReplicatedExist = await knex.schema.hasColumn( + TableName.SecretApprovalRequestSecret, + "isReplicated" + ); if (await knex.schema.hasTable(TableName.SecretApprovalRequestSecret)) { await knex.schema.alterTable(TableName.SecretApprovalRequestSecret, (t) => { - t.dropColumns("isReplicated"); + if (doesSecretApprovalRequestSecretIsReplicatedExist) t.dropColumns("isReplicated"); }); } + const doesSecretApprovalRequestIsReplicatedExist = await knex.schema.hasColumn( + TableName.SecretApprovalRequest, + "isReplicated" + ); if (await knex.schema.hasTable(TableName.SecretApprovalRequest)) { await knex.schema.alterTable(TableName.SecretApprovalRequest, (t) => { - t.dropColumn("isReplicated"); + if (doesSecretApprovalRequestIsReplicatedExist) t.dropColumn("isReplicated"); }); } }