From 466f1375907cc45435a6cf8a1493acc1651f2841 Mon Sep 17 00:00:00 2001 From: Owen Date: Thu, 9 Apr 2026 10:29:51 -0400 Subject: [PATCH] Fix migration by testing for orphans --- server/setup/scriptsPg/1.17.0.ts | 9 +++++++-- server/setup/scriptsSqlite/1.17.0.ts | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/server/setup/scriptsPg/1.17.0.ts b/server/setup/scriptsPg/1.17.0.ts index 21dd3a224..c92152863 100644 --- a/server/setup/scriptsPg/1.17.0.ts +++ b/server/setup/scriptsPg/1.17.0.ts @@ -235,7 +235,9 @@ export default async function migration() { for (const row of existingUserInviteRoles) { await db.execute(sql` INSERT INTO "userInviteRoles" ("inviteId", "roleId") - VALUES (${row.inviteId}, ${row.roleId}) + SELECT ${row.inviteId}, ${row.roleId} + WHERE EXISTS (SELECT 1 FROM "userInvites" WHERE "inviteId" = ${row.inviteId}) + AND EXISTS (SELECT 1 FROM "roles" WHERE "roleId" = ${row.roleId}) ON CONFLICT DO NOTHING `); } @@ -258,7 +260,10 @@ export default async function migration() { for (const row of existingUserOrgRoles) { await db.execute(sql` INSERT INTO "userOrgRoles" ("userId", "orgId", "roleId") - VALUES (${row.userId}, ${row.orgId}, ${row.roleId}) + SELECT ${row.userId}, ${row.orgId}, ${row.roleId} + WHERE EXISTS (SELECT 1 FROM "user" WHERE "id" = ${row.userId}) + AND EXISTS (SELECT 1 FROM "orgs" WHERE "orgId" = ${row.orgId}) + AND EXISTS (SELECT 1 FROM "roles" WHERE "roleId" = ${row.roleId}) ON CONFLICT DO NOTHING `); } diff --git a/server/setup/scriptsSqlite/1.17.0.ts b/server/setup/scriptsSqlite/1.17.0.ts index 28929fc63..ecf40b7a8 100644 --- a/server/setup/scriptsSqlite/1.17.0.ts +++ b/server/setup/scriptsSqlite/1.17.0.ts @@ -145,7 +145,7 @@ export default async function migration() { ).run(); db.prepare( - `INSERT INTO '__new_userOrgs'("userId", "orgId", "isOwner", "autoProvisioned", "pamUsername") SELECT "userId", "orgId", "isOwner", "autoProvisioned", "pamUsername" FROM 'userOrgs';` + `INSERT INTO '__new_userOrgs'("userId", "orgId", "isOwner", "autoProvisioned", "pamUsername") SELECT "userId", "orgId", "isOwner", "autoProvisioned", "pamUsername" FROM 'userOrgs' WHERE EXISTS (SELECT 1 FROM 'user' WHERE id = userOrgs.userId) AND EXISTS (SELECT 1 FROM 'orgs' WHERE orgId = userOrgs.orgId);` ).run(); db.prepare(`DROP TABLE 'userOrgs';`).run(); db.prepare( @@ -246,12 +246,15 @@ export default async function migration() { // Re-insert the preserved invite role assignments into the new userInviteRoles table if (existingUserInviteRoles.length > 0) { const insertUserInviteRole = db.prepare( - `INSERT OR IGNORE INTO 'userInviteRoles' ("inviteId", "roleId") VALUES (?, ?)` + `INSERT OR IGNORE INTO 'userInviteRoles' ("inviteId", "roleId") + SELECT ?, ? + WHERE EXISTS (SELECT 1 FROM 'userInvites' WHERE inviteId = ?) + AND EXISTS (SELECT 1 FROM 'roles' WHERE roleId = ?)` ); const insertAll = db.transaction(() => { for (const row of existingUserInviteRoles) { - insertUserInviteRole.run(row.inviteId, row.roleId); + insertUserInviteRole.run(row.inviteId, row.roleId, row.inviteId, row.roleId); } }); @@ -265,12 +268,16 @@ export default async function migration() { // Re-insert the preserved role assignments into the new userOrgRoles table if (existingUserOrgRoles.length > 0) { const insertUserOrgRole = db.prepare( - `INSERT OR IGNORE INTO 'userOrgRoles' ("userId", "orgId", "roleId") VALUES (?, ?, ?)` + `INSERT OR IGNORE INTO 'userOrgRoles' ("userId", "orgId", "roleId") + SELECT ?, ?, ? + WHERE EXISTS (SELECT 1 FROM 'user' WHERE id = ?) + AND EXISTS (SELECT 1 FROM 'orgs' WHERE orgId = ?) + AND EXISTS (SELECT 1 FROM 'roles' WHERE roleId = ?)` ); const insertAll = db.transaction(() => { for (const row of existingUserOrgRoles) { - insertUserOrgRole.run(row.userId, row.orgId, row.roleId); + insertUserOrgRole.run(row.userId, row.orgId, row.roleId, row.userId, row.orgId, row.roleId); } });