From 5423bbe687abbad3f3186beb01c8e74ddd0e68ec Mon Sep 17 00:00:00 2001 From: devanshu052000 Date: Fri, 30 May 2025 02:27:53 +0530 Subject: [PATCH] Implemented business logic for Component Permissions API --- server/ee | 2 +- .../interfaces/IUtilService.ts | 4 + server/src/modules/app-permissions/module.ts | 17 +++- .../component-permissions.repository.ts | 58 +++++++++++++ .../component-users.repository.ts | 83 +++++++++++++++++++ .../modules/app-permissions/util.service.ts | 8 ++ 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 server/src/modules/app-permissions/repositories/component-permissions.repository.ts create mode 100644 server/src/modules/app-permissions/repositories/component-users.repository.ts diff --git a/server/ee b/server/ee index dd0462d3c3..5865a18fe8 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit dd0462d3c3acf4b8e6856209eee52bc3cc78a02e +Subproject commit 5865a18fe87e545b9b6a8f40f998117edc403c3f diff --git a/server/src/modules/app-permissions/interfaces/IUtilService.ts b/server/src/modules/app-permissions/interfaces/IUtilService.ts index dbd390982a..a38d845076 100644 --- a/server/src/modules/app-permissions/interfaces/IUtilService.ts +++ b/server/src/modules/app-permissions/interfaces/IUtilService.ts @@ -14,4 +14,8 @@ export interface IUtilService { createQueryPermission(queryId: string, body: CreatePermissionDto): Promise; updateQueryPermission(queryId: string, body: CreatePermissionDto): Promise; + + createComponentPermission(componentId: string, body: CreatePermissionDto): Promise; + + updateComponentPermission(componentId: string, body: CreatePermissionDto): Promise; } diff --git a/server/src/modules/app-permissions/module.ts b/server/src/modules/app-permissions/module.ts index 5e3e3db107..b290bd5dbc 100644 --- a/server/src/modules/app-permissions/module.ts +++ b/server/src/modules/app-permissions/module.ts @@ -9,10 +9,14 @@ import { PageUsersRepository } from './repositories/page-users.repository'; import { PagePermissionsRepository } from './repositories/page-permissions.repository'; import { QueryUsersRepository } from './repositories/query-users.repository'; import { QueryPermissionsRepository } from './repositories/query-permissions.repository'; +import { ComponentUsersRepository } from './repositories/component-users.repository'; +import { ComponentPermissionsRepository } from './repositories/component-permissions.repository'; import { PageUser } from '@entities/page_users.entity'; import { PagePermission } from '@entities/page_permissions.entity'; import { QueryUser } from '@entities/query_users.entity'; import { QueryPermission } from '@entities/query_permissions.entity'; +import { ComponentUser } from '@entities/component_users.entity'; +import { ComponentPermission } from '@entities/component_permissions.entity'; export class AppPermissionsModule { static async register(configs: { IS_GET_CONTEXT: boolean }): Promise { @@ -24,7 +28,16 @@ export class AppPermissionsModule { return { module: AppPermissionsModule, imports: [ - TypeOrmModule.forFeature([GroupPermissions, User, PageUser, PagePermission, QueryUser, QueryPermission]), + TypeOrmModule.forFeature([ + GroupPermissions, + User, + PageUser, + PagePermission, + QueryUser, + QueryPermission, + ComponentUser, + ComponentPermission, + ]), ], controllers: [AppPermissionsController], providers: [ @@ -35,6 +48,8 @@ export class AppPermissionsModule { PagePermissionsRepository, QueryUsersRepository, QueryPermissionsRepository, + ComponentUsersRepository, + ComponentPermissionsRepository, FeatureAbilityFactory, ], exports: [AppPermissionsUtilService, AppPermissionsService], diff --git a/server/src/modules/app-permissions/repositories/component-permissions.repository.ts b/server/src/modules/app-permissions/repositories/component-permissions.repository.ts new file mode 100644 index 0000000000..802dd12868 --- /dev/null +++ b/server/src/modules/app-permissions/repositories/component-permissions.repository.ts @@ -0,0 +1,58 @@ +import { ComponentPermission } from '@entities/component_permissions.entity'; +import { Injectable } from '@nestjs/common'; +import { DataSource, EntityManager, Repository } from 'typeorm'; +import { ComponentUsersRepository } from './component-users.repository'; +import { dbTransactionWrap } from '@helpers/database.helper'; +import { PAGE_PERMISSION_TYPE } from '../constants'; + +@Injectable() +export class ComponentPermissionsRepository extends Repository { + constructor(private dataSource: DataSource, private readonly componentUsersRepository: ComponentUsersRepository) { + super(ComponentPermission, dataSource.createEntityManager()); + } + + async getComponentPermissions(componentId: string, manager?: EntityManager): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const componentPermissions = await manager.find(ComponentPermission, { + where: { componentId }, + relations: ['users', 'users.user', 'users.permissionGroup'], + }); + + return componentPermissions.map((permission) => { + if (permission.type === PAGE_PERMISSION_TYPE.GROUP) { + return { + ...permission, + groups: permission.users, + users: undefined, + }; + } + return permission; + }); + }, manager || this.manager); + } + + async createComponentPermissions( + componentId: string, + type: PAGE_PERMISSION_TYPE, + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const existingPermission = await manager.findOne(ComponentPermission, { where: { componentId } }); + if (existingPermission) { + throw new Error(`Component permission already exists for Component id: ${componentId}`); + } + + const componentPermission = manager.create(ComponentPermission, { + componentId, + type, + }); + return manager.save(componentPermission); + }, manager || this.manager); + } + + async deleteComponentPermissions(componentId: string, manager?: EntityManager): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + await manager.delete(ComponentPermission, { componentId }); + }, manager || this.manager); + } +} diff --git a/server/src/modules/app-permissions/repositories/component-users.repository.ts b/server/src/modules/app-permissions/repositories/component-users.repository.ts new file mode 100644 index 0000000000..98478b4334 --- /dev/null +++ b/server/src/modules/app-permissions/repositories/component-users.repository.ts @@ -0,0 +1,83 @@ +import { ComponentUser } from '@entities/component_users.entity'; +import { Injectable } from '@nestjs/common'; +import { DataSource, EntityManager, Repository } from 'typeorm'; +import { dbTransactionWrap } from '@helpers/database.helper'; +import { ComponentPermission } from '@entities/component_permissions.entity'; + +@Injectable() +export class ComponentUsersRepository extends Repository { + constructor(private dataSource: DataSource) { + super(ComponentUser, dataSource.createEntityManager()); + } + + async createComponentUsersWithSingle( + componentPermissionsId: string, + users: string[], + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const componentUsers = users.map((userId) => { + return manager.create(ComponentUser, { + componentPermissionsId, + userId, + permissionGroupsId: null, + }); + }); + return manager.save(componentUsers); + }, manager || this.manager); + } + + async createComponentUsersWithGroup( + componentPermissionsId: string, + groups: string[], + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const componentUsers = groups.map((permissionGroupsId) => { + return manager.create(ComponentUser, { + componentPermissionsId, + permissionGroupsId, + userId: null, + }); + }); + return manager.save(componentUsers); + }, manager || this.manager); + } + + async checkComponentUserWithGroup( + componentPermission: ComponentPermission, + userId: string, + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const result = await manager + .createQueryBuilder(ComponentUser, 'component_users') + .innerJoin('component_users.permissionGroup', 'group') + .innerJoin('group.groupUsers', 'groupUser') + .where('component_users.componentPermission = :permissionId', { + permissionId: componentPermission.id, + }) + .andWhere('groupUser.userId = :userId', { userId }) + .getOne(); + + return !!result; + }, manager || this.manager); + } + + async checkComponentUserWithSingle( + componentPermission: ComponentPermission, + userId: string, + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const componentUser = await manager.findOne(ComponentUser, { + where: { + componentPermission: { id: componentPermission.id }, + userId, + }, + }); + + return !!componentUser; + }, manager || this.manager); + } +} diff --git a/server/src/modules/app-permissions/util.service.ts b/server/src/modules/app-permissions/util.service.ts index 7ff894a058..55d927eebb 100644 --- a/server/src/modules/app-permissions/util.service.ts +++ b/server/src/modules/app-permissions/util.service.ts @@ -31,4 +31,12 @@ export class AppPermissionsUtilService implements IUtilService { async updateQueryPermission(queryId: string, body: CreatePermissionDto): Promise { throw new Error('Method not implemented.'); } + + async createComponentPermission(componentId: string, body: CreatePermissionDto): Promise { + throw new Error('Method not implemented.'); + } + + async updateComponentPermission(componentId: string, body: CreatePermissionDto): Promise { + throw new Error('Method not implemented.'); + } }