From f3fa111ad4abd74f6d5bf55f048f44823af58552 Mon Sep 17 00:00:00 2001 From: devanshu052000 Date: Wed, 21 May 2025 21:21:19 +0530 Subject: [PATCH] Implemented business logic for Query Permissions API --- server/ee | 2 +- .../interfaces/IUtilService.ts | 4 ++ server/src/modules/app-permissions/module.ts | 10 +++- .../query-permissions.repository.ts | 58 +++++++++++++++++++ .../repositories/query-users.repository.ts | 45 ++++++++++++++ .../modules/app-permissions/util.service.ts | 8 +++ 6 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 server/src/modules/app-permissions/repositories/query-permissions.repository.ts create mode 100644 server/src/modules/app-permissions/repositories/query-users.repository.ts diff --git a/server/ee b/server/ee index f61295c5f8..c4ffed54bc 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit f61295c5f85c354048f15275d4b3af52019d95b3 +Subproject commit c4ffed54bc928820c832c831aab5d2a42cfba154 diff --git a/server/src/modules/app-permissions/interfaces/IUtilService.ts b/server/src/modules/app-permissions/interfaces/IUtilService.ts index ea86fc05fe..dbd390982a 100644 --- a/server/src/modules/app-permissions/interfaces/IUtilService.ts +++ b/server/src/modules/app-permissions/interfaces/IUtilService.ts @@ -10,4 +10,8 @@ export interface IUtilService { createPagePermission(pageId: string, body: CreatePermissionDto): Promise; updatePagePermission(pageId: string, body: CreatePermissionDto): Promise; + + createQueryPermission(queryId: string, body: CreatePermissionDto): Promise; + + updateQueryPermission(queryId: string, body: CreatePermissionDto): Promise; } diff --git a/server/src/modules/app-permissions/module.ts b/server/src/modules/app-permissions/module.ts index 704c6c1374..5e3e3db107 100644 --- a/server/src/modules/app-permissions/module.ts +++ b/server/src/modules/app-permissions/module.ts @@ -7,8 +7,12 @@ import { User } from '@entities/user.entity'; import { RolesRepository } from '@modules/roles/repository'; 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 { 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'; export class AppPermissionsModule { static async register(configs: { IS_GET_CONTEXT: boolean }): Promise { @@ -19,7 +23,9 @@ export class AppPermissionsModule { return { module: AppPermissionsModule, - imports: [TypeOrmModule.forFeature([GroupPermissions, User, PageUser, PagePermission])], + imports: [ + TypeOrmModule.forFeature([GroupPermissions, User, PageUser, PagePermission, QueryUser, QueryPermission]), + ], controllers: [AppPermissionsController], providers: [ AppPermissionsService, @@ -27,6 +33,8 @@ export class AppPermissionsModule { RolesRepository, PageUsersRepository, PagePermissionsRepository, + QueryUsersRepository, + QueryPermissionsRepository, FeatureAbilityFactory, ], exports: [AppPermissionsUtilService, AppPermissionsService], diff --git a/server/src/modules/app-permissions/repositories/query-permissions.repository.ts b/server/src/modules/app-permissions/repositories/query-permissions.repository.ts new file mode 100644 index 0000000000..d83976ca68 --- /dev/null +++ b/server/src/modules/app-permissions/repositories/query-permissions.repository.ts @@ -0,0 +1,58 @@ +import { QueryPermission } from '@entities/query_permissions.entity'; +import { Injectable } from '@nestjs/common'; +import { DataSource, EntityManager, Repository } from 'typeorm'; +import { QueryUsersRepository } from './query-users.repository'; +import { dbTransactionWrap } from '@helpers/database.helper'; +import { PAGE_PERMISSION_TYPE } from '../constants'; + +@Injectable() +export class QueryPermissionsRepository extends Repository { + constructor(private dataSource: DataSource, private readonly queryUsersRepository: QueryUsersRepository) { + super(QueryPermission, dataSource.createEntityManager()); + } + + async getQueryPermissions(queryId: string, manager?: EntityManager): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const queryPermissions = await manager.find(QueryPermission, { + where: { queryId }, + relations: ['users', 'users.user', 'users.permissionGroup'], + }); + + return queryPermissions.map((permission) => { + if (permission.type === PAGE_PERMISSION_TYPE.GROUP) { + return { + ...permission, + groups: permission.users, + users: undefined, + }; + } + return permission; + }); + }, manager || this.manager); + } + + async createQueryPermissions( + queryId: string, + type: PAGE_PERMISSION_TYPE, + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const existingPermission = await manager.findOne(QueryPermission, { where: { queryId } }); + if (existingPermission) { + throw new Error(`Query permission already exists for Query id: ${queryId}`); + } + + const queryPermission = manager.create(QueryPermission, { + queryId, + type, + }); + return manager.save(queryPermission); + }, manager || this.manager); + } + + async deleteQueryPermissions(queryId: string, manager?: EntityManager): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + await manager.delete(QueryPermission, { queryId }); + }, manager || this.manager); + } +} diff --git a/server/src/modules/app-permissions/repositories/query-users.repository.ts b/server/src/modules/app-permissions/repositories/query-users.repository.ts new file mode 100644 index 0000000000..bd1521afae --- /dev/null +++ b/server/src/modules/app-permissions/repositories/query-users.repository.ts @@ -0,0 +1,45 @@ +import { QueryUser } from '@entities/query_users.entity'; +import { Injectable } from '@nestjs/common'; +import { DataSource, EntityManager, Repository } from 'typeorm'; +import { dbTransactionWrap } from '@helpers/database.helper'; + +@Injectable() +export class QueryUsersRepository extends Repository { + constructor(private dataSource: DataSource) { + super(QueryUser, dataSource.createEntityManager()); + } + + async createQueryUsersWithSingle( + queryPermissionsId: string, + users: string[], + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const queryUsers = users.map((userId) => { + return manager.create(QueryUser, { + queryPermissionsId, + userId, + permissionGroupsId: null, + }); + }); + return manager.save(queryUsers); + }, manager || this.manager); + } + + async createQueryUsersWithGroup( + queryPermissionsId: string, + groups: string[], + manager?: EntityManager + ): Promise { + return dbTransactionWrap(async (manager: EntityManager) => { + const queryUsers = groups.map((permissionGroupsId) => { + return manager.create(QueryUser, { + queryPermissionsId, + permissionGroupsId, + userId: null, + }); + }); + return manager.save(queryUsers); + }, manager || this.manager); + } +} diff --git a/server/src/modules/app-permissions/util.service.ts b/server/src/modules/app-permissions/util.service.ts index 327410e304..7ff894a058 100644 --- a/server/src/modules/app-permissions/util.service.ts +++ b/server/src/modules/app-permissions/util.service.ts @@ -23,4 +23,12 @@ export class AppPermissionsUtilService implements IUtilService { async updatePagePermission(pageId: string, body: CreatePermissionDto): Promise { throw new Error('Method not implemented.'); } + + async createQueryPermission(queryId: string, body: CreatePermissionDto): Promise { + throw new Error('Method not implemented.'); + } + + async updateQueryPermission(queryId: string, body: CreatePermissionDto): Promise { + throw new Error('Method not implemented.'); + } }