fix(core): Fix DropRoleMapping migration (#8521)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2024-02-02 12:22:09 +01:00 committed by GitHub
parent 5832d3ca46
commit 4fed68ee34
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,6 +8,12 @@ const idColumns: Record<Table, string> = {
shared_workflow: 'workflowId', shared_workflow: 'workflowId',
}; };
const uidColumns: Record<Table, string> = {
user: 'id',
shared_credentials: 'userId',
shared_workflow: 'userId',
};
const roleScopes: Record<Table, string> = { const roleScopes: Record<Table, string> = {
user: 'global', user: 'global',
shared_credentials: 'credential', shared_credentials: 'credential',
@ -48,24 +54,30 @@ export class DropRoleMapping1705429061930 implements ReversibleMigration {
const roleTable = escape.tableName('role'); const roleTable = escape.tableName('role');
const tableName = escape.tableName(table); const tableName = escape.tableName(table);
const idColumn = escape.columnName(idColumns[table]); const idColumn = escape.columnName(idColumns[table]);
const uidColumn = escape.columnName(uidColumns[table]);
const roleColumnName = table === 'user' ? 'globalRoleId' : 'roleId'; const roleColumnName = table === 'user' ? 'globalRoleId' : 'roleId';
const roleColumn = escape.columnName(roleColumnName); const roleColumn = escape.columnName(roleColumnName);
const scope = roleScopes[table]; const scope = roleScopes[table];
const isMySQL = ['mariadb', 'mysqldb'].includes(dbType); const isMySQL = ['mariadb', 'mysqldb'].includes(dbType);
const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`; const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`;
const subQuery = ` 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 FROM ${tableName} T
LEFT JOIN ${roleTable} R LEFT JOIN ${roleTable} R
ON T.${roleColumn} = R.id and R.scope = '${scope}'`; 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 const swQuery = isMySQL
? `UPDATE ${tableName}, (${subQuery}) as mapping ? `UPDATE ${tableName}, (${subQuery}) as mapping
SET ${tableName}.role = mapping.role SET ${tableName}.role = mapping.role
WHERE ${tableName}.${idColumn} = mapping.id` ${where}`
: `UPDATE ${tableName} : `UPDATE ${tableName}
SET role = mapping.role SET role = mapping.role
FROM (${subQuery}) as mapping FROM (${subQuery}) as mapping
WHERE ${tableName}.${idColumn} = mapping.id`; ${where}`;
await runQuery(swQuery); await runQuery(swQuery);
await addNotNull(table, 'role'); await addNotNull(table, 'role');
@ -95,23 +107,27 @@ export class DropRoleMapping1705429061930 implements ReversibleMigration {
const roleTable = escape.tableName('role'); const roleTable = escape.tableName('role');
const tableName = escape.tableName(table); const tableName = escape.tableName(table);
const idColumn = escape.columnName(idColumns[table]); const idColumn = escape.columnName(idColumns[table]);
const uidColumn = escape.columnName(uidColumns[table]);
const roleColumn = escape.columnName(roleColumnName); const roleColumn = escape.columnName(roleColumnName);
const scope = roleScopes[table]; const scope = roleScopes[table];
const isMySQL = ['mariadb', 'mysqldb'].includes(dbType); const isMySQL = ['mariadb', 'mysqldb'].includes(dbType);
const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`; const roleField = isMySQL ? `CONCAT('${scope}:', R.name)` : `'${scope}:' || R.name`;
const subQuery = ` 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 FROM ${tableName} T
LEFT JOIN ${roleTable} R LEFT JOIN ${roleTable} R
ON T.role = ${roleField} and R.scope = '${scope}'`; 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 const query = isMySQL
? `UPDATE ${tableName}, (${subQuery}) as mapping ? `UPDATE ${tableName}, (${subQuery}) as mapping
SET ${tableName}.${roleColumn} = mapping.role_id SET ${tableName}.${roleColumn} = mapping.role_id
WHERE ${tableName}.${idColumn} = mapping.id` ${where}`
: `UPDATE ${tableName} : `UPDATE ${tableName}
SET ${roleColumn} = mapping.role_id SET ${roleColumn} = mapping.role_id
FROM (${subQuery}) as mapping FROM (${subQuery}) as mapping
WHERE ${tableName}.${idColumn} = mapping.id`; ${where}`;
await runQuery(query); await runQuery(query);
await addNotNull(table, roleColumnName); await addNotNull(table, roleColumnName);