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> {}
|
|
|
|
|
}
|