Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(core): Fix DropRoleMapping migration #8521

Merged
merged 1 commit into from
Feb 2, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ const idColumns: Record<Table, string> = {
shared_workflow: 'workflowId',
};

const uidColumns: Record<Table, string> = {
user: 'id',
shared_credentials: 'userId',
shared_workflow: 'userId',
};

const roleScopes: Record<Table, string> = {
user: 'global',
shared_credentials: 'credential',
Expand Down Expand Up @@ -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');
Expand Down Expand Up @@ -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);
Expand Down
Loading