From d4cfd0b6ede625a12033f2ebd71813b5e1bed3bb Mon Sep 17 00:00:00 2001 From: = Date: Sat, 16 Nov 2024 00:37:57 +0530 Subject: [PATCH] fix: migration in loop due to cornercase --- ...14084900_identity-multiple-auth-methods.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/backend/src/db/migrations/20241014084900_identity-multiple-auth-methods.ts b/backend/src/db/migrations/20241014084900_identity-multiple-auth-methods.ts index 821132e1e..dc83d231e 100644 --- a/backend/src/db/migrations/20241014084900_identity-multiple-auth-methods.ts +++ b/backend/src/db/migrations/20241014084900_identity-multiple-auth-methods.ts @@ -2,7 +2,7 @@ import { Knex } from "knex"; import { TableName } from "../schemas"; -const BATCH_SIZE = 30_000; +const BATCH_SIZE = 10_000; export async function up(knex: Knex): Promise { const hasAuthMethodColumnAccessToken = await knex.schema.hasColumn(TableName.IdentityAccessToken, "authMethod"); @@ -12,7 +12,25 @@ export async function up(knex: Knex): Promise { t.string("authMethod").nullable(); }); - let nullableAccessTokens = await knex(TableName.IdentityAccessToken).whereNull("authMethod").limit(BATCH_SIZE); + // first we remove identities without auth method that is unused + let nullableAuthMethodIdentities = []; + do { + const findNullableAuthMethodIdentities = knex(TableName.Identity) + .whereNull("authMethod") + .limit(BATCH_SIZE) + .select("id"); + + // eslint-disable-next-line no-await-in-loop + nullableAuthMethodIdentities = await knex(TableName.Identity) + .whereIn("id", findNullableAuthMethodIdentities) + .del() + .returning("id"); + } while (nullableAuthMethodIdentities.length > 0); + + let nullableAccessTokens = await knex(TableName.IdentityAccessToken) + .whereNull("authMethod") + .limit(BATCH_SIZE) + .select("id"); let totalUpdated = 0; do { @@ -33,7 +51,10 @@ export async function up(knex: Knex): Promise { }); // eslint-disable-next-line no-await-in-loop - nullableAccessTokens = await knex(TableName.IdentityAccessToken).whereNull("authMethod").limit(BATCH_SIZE); + nullableAccessTokens = await knex(TableName.IdentityAccessToken) + .whereNull("authMethod") + .limit(BATCH_SIZE) + .select("id"); totalUpdated += batchIds.length; console.log(`Updated ${batchIds.length} access tokens in batch <> Total updated: ${totalUpdated}`);