diff --git a/packages/cli/src/databases/migrations/common/1705429061930-DropRoleMapping.ts b/packages/cli/src/databases/migrations/common/1705429061930-DropRoleMapping.ts index dd91e6f541..2fa897707a 100644 --- a/packages/cli/src/databases/migrations/common/1705429061930-DropRoleMapping.ts +++ b/packages/cli/src/databases/migrations/common/1705429061930-DropRoleMapping.ts @@ -8,6 +8,12 @@ const idColumns: Record = { shared_workflow: 'workflowId', }; +const uidColumns: Record = { + user: 'id', + shared_credentials: 'userId', + shared_workflow: 'userId', +}; + const roleScopes: Record = { user: 'global', shared_credentials: 'credential', @@ -48,24 +54,30 @@ export class DropRoleMapping1705429061930 implements ReversibleMigration { const roleTable = escape.tableName('role'); const tableName = escape.tableName(table); const idColumn = escape.columnName(idColumns[table]); + const uidColumn = escape.columnName(uidColumns[table]); const roleColumnName = table === 'user' ? 'globalRoleId' : 'roleId'; const roleColumn = escape.columnName(roleColumnName); const scope = roleScopes[table]; const isMySQL = ['mariadb', 'mysqldb'].includes(dbType); const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`; const subQuery = ` - SELECT ${roleField} as role, T.${idColumn} as id + SELECT ${roleField} as role, T.${idColumn} as id${ + table !== 'user' ? `, T.${uidColumn} as uid` : '' + } FROM ${tableName} T LEFT JOIN ${roleTable} R ON T.${roleColumn} = R.id and R.scope = '${scope}'`; + const where = `WHERE ${tableName}.${idColumn} = mapping.id${ + table !== 'user' ? ` AND ${tableName}.${uidColumn} = mapping.uid` : '' + }`; const swQuery = isMySQL ? `UPDATE ${tableName}, (${subQuery}) as mapping SET ${tableName}.role = mapping.role - WHERE ${tableName}.${idColumn} = mapping.id` + ${where}` : `UPDATE ${tableName} SET role = mapping.role FROM (${subQuery}) as mapping - WHERE ${tableName}.${idColumn} = mapping.id`; + ${where}`; await runQuery(swQuery); await addNotNull(table, 'role'); @@ -95,23 +107,27 @@ export class DropRoleMapping1705429061930 implements ReversibleMigration { const roleTable = escape.tableName('role'); const tableName = escape.tableName(table); const idColumn = escape.columnName(idColumns[table]); + const uidColumn = escape.columnName(uidColumns[table]); const roleColumn = escape.columnName(roleColumnName); const scope = roleScopes[table]; const isMySQL = ['mariadb', 'mysqldb'].includes(dbType); const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`; const subQuery = ` - SELECT R.id as role_id, T.${idColumn} as id + SELECT R.id as role_id, T.${idColumn} as id${table !== 'user' ? `, T.${uidColumn} as uid` : ''} FROM ${tableName} T LEFT JOIN ${roleTable} R ON T.role = ${roleField} and R.scope = '${scope}'`; + const where = `WHERE ${tableName}.${idColumn} = mapping.id${ + table !== 'user' ? ` AND ${tableName}.${uidColumn} = mapping.uid` : '' + }`; const query = isMySQL ? `UPDATE ${tableName}, (${subQuery}) as mapping SET ${tableName}.${roleColumn} = mapping.role_id - WHERE ${tableName}.${idColumn} = mapping.id` + ${where}` : `UPDATE ${tableName} SET ${roleColumn} = mapping.role_id FROM (${subQuery}) as mapping - WHERE ${tableName}.${idColumn} = mapping.id`; + ${where}`; await runQuery(query); await addNotNull(table, roleColumnName);