ToolJet/server/data-migrations/1720365772516-AddingUsersToRespectiveRolesBuilderAndEndUsers.ts

134 lines
5.3 KiB
TypeScript
Raw Normal View History

2025-02-25 06:52:50 +00:00
import { MigrationProgress } from '@helpers/migration.helper';
import { GroupPermissions } from '@entities/group_permissions.entity';
import { Organization } from '@entities/organization.entity';
import { OrganizationUser } from '@entities/organization_user.entity';
import { User } from '@entities/user.entity';
import { UserGroupPermission } from '@entities/user_group_permission.entity';
2024-07-10 08:18:26 +00:00
import { Brackets, EntityManager, MigrationInterface, QueryRunner } from 'typeorm';
2025-02-25 06:52:50 +00:00
import { GROUP_PERMISSIONS_TYPE, USER_ROLE } from '@modules/group-permissions/constants';
2024-07-10 08:18:26 +00:00
export class AddingUsersToRespectiveRolesBuilderAndEndUsers1720365772516 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
const manager = queryRunner.manager;
const organizationIds = (
await manager.find(Organization, {
select: ['id'],
})
).map((organization) => organization.id);
await this.getAndConvertEditorBuilderUsers(manager, organizationIds);
}
async getAndConvertEditorBuilderUsers(manager: EntityManager, organizationIds: string[]) {
2024-09-23 11:34:20 +00:00
const migrationProgress = new MigrationProgress(
'AddingUsersToRespectiveRolesBuilderAndEndUsers1720365772516',
organizationIds.length
);
2024-07-10 08:18:26 +00:00
for (const organizationId of organizationIds) {
const userIdsWithEditPermissions = (
await manager
.createQueryBuilder(User, 'users')
.innerJoin(
'users.organizationUsers',
'organization_users',
'organization_users.organizationId = :organizationId ',
{
organizationId,
}
)
.innerJoin(
'users.groupPermissions',
'group_permissions',
'organization_users.organizationId = group_permissions.organizationId'
)
.leftJoin('group_permissions.appGroupPermission', 'app_group_permissions')
2025-02-25 06:52:50 +00:00
.leftJoin('group_permissions.dataSourceGroupPermission', 'dataSourceGroupPermission')
2024-07-10 08:18:26 +00:00
.andWhere(
new Brackets((qb) => {
2024-09-23 11:34:20 +00:00
qb.orWhere('app_group_permissions.read = true AND app_group_permissions.update = true')
2025-02-25 06:52:50 +00:00
.orWhere('dataSourceGroupPermission.update = true')
2024-09-23 11:34:20 +00:00
.orWhere('group_permissions.appCreate = true')
.orWhere('group_permissions.appDelete = true')
2025-02-25 06:52:50 +00:00
.orWhere('group_permissions.dataSourceCreate = true')
.orWhere('group_permissions.dataSourceDelete = true')
2024-09-23 11:34:20 +00:00
.orWhere('group_permissions.folderCreate = true')
.orWhere('group_permissions.orgEnvironmentConstantCreate = true');
2024-07-10 08:18:26 +00:00
})
)
.select('users.id')
.distinct()
.getMany()
).map((record) => record.id);
const userIdsOfAppOwners = (
await manager
.createQueryBuilder(User, 'users')
.innerJoin(
'users.organizationUsers',
'organization_users',
'organization_users.organizationId = :organizationId',
{
organizationId,
}
)
2024-11-08 10:46:06 +00:00
.innerJoin('users.apps', 'apps', 'apps.organizationId = :organizationId', {
organizationId,
})
2024-07-10 08:18:26 +00:00
.select('users.id')
.distinct()
.getMany()
).map((record) => record.id);
const adminsUsers = (
await manager
.createQueryBuilder(UserGroupPermission, 'usersGroup')
.innerJoin(
'usersGroup.groupPermission',
'groupPermission',
'groupPermission.organizationId = :organizationId',
{
organizationId,
}
)
.where('groupPermission.group = :admin', {
admin: 'admin',
})
.getMany()
).map((record) => record.userId);
2024-09-23 11:34:20 +00:00
2024-07-10 08:18:26 +00:00
const builderUsersWithAdmin = [...new Set([...userIdsWithEditPermissions, ...userIdsOfAppOwners])];
const builderUsersWoAdmin = builderUsersWithAdmin.filter((id) => !adminsUsers.includes(id));
const builderGroup = await manager.findOne(GroupPermissions, {
where: { name: USER_ROLE.BUILDER, type: GROUP_PERMISSIONS_TYPE.DEFAULT, organizationId: organizationId },
});
const endUserGroup = await manager.findOne(GroupPermissions, {
where: { name: USER_ROLE.END_USER, type: GROUP_PERMISSIONS_TYPE.DEFAULT, organizationId: organizationId },
});
await this.migrateUserGroup(manager, builderUsersWoAdmin, builderGroup.id);
const organizationUser = (
await manager.find(OrganizationUser, {
where: {
organizationId,
},
})
).map((record) => record.userId);
const builderAdminUsers = [...new Set([...builderUsersWoAdmin, ...adminsUsers])];
const endUsers = organizationUser.filter((userId) => !builderAdminUsers.includes(userId));
await this.migrateUserGroup(manager, endUsers, endUserGroup.id);
2024-09-23 11:34:20 +00:00
migrationProgress.show();
2024-07-10 08:18:26 +00:00
}
}
async migrateUserGroup(manager: EntityManager, userIds: string[], groupId: string) {
if (userIds.length === 0) return;
const valuesString = userIds.map((id) => `('${id}', '${groupId}')`).join(',');
const query = `
INSERT INTO group_users (user_id, group_id)
VALUES ${valuesString};
`;
return await manager.query(query);
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}