From fc36997b912a3b3cc01b6a86dfa4c68323ce9922 Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:57:16 +0700 Subject: [PATCH] feat: create api get privilege menu --- ...nu-user-privilege-configuration.manager.ts | 125 ++++++++++++++++++ ...ivilege-configuration-data.orchestrator.ts | 19 +++ ...r-menu-user-privilege-configuration.dto.ts | 16 +++ ...user-privilege-configuration.controller.ts | 11 +- .../user-privilege/user-privilege.module.ts | 2 + 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/menu-user-privilege-configuration.manager.ts create mode 100644 src/modules/user-related/user-privilege/infrastructure/dto/filter-menu-user-privilege-configuration.dto.ts diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/menu-user-privilege-configuration.manager.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/menu-user-privilege-configuration.manager.ts new file mode 100644 index 0000000..84ef211 --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/menu-user-privilege-configuration.manager.ts @@ -0,0 +1,125 @@ +import { Injectable } from '@nestjs/common'; +import { UserPrivilegeConfigurationEntity } from '../../../entities/user-privilege-configuration.entity'; +import { + Param, + RelationParam, +} from 'src/core/modules/domain/entities/base-filter.entity'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { ORDER_TYPE } from 'src/core/strings/constants/base.constants'; +import { SelectQueryBuilder } from 'typeorm'; +import { FilterMenuUserPrivilegeConfigurationDto } from 'src/modules/user-related/user-privilege/infrastructure/dto/filter-menu-user-privilege-configuration.dto'; +import { mod } from 'mathjs'; +import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; +import { UserRole } from 'src/modules/user-related/user/constants'; +import { UserPrivilegeConfigurationHelper } from '../helpers/generate-user-privilege-configuration.helper'; + +@Injectable() +export class MenuUserPrivilegeConfigurationManager extends BaseIndexManager { + async prepareData(): Promise { + Object.assign(this.filterParam, { + order_by: `${this.tableName}.index`, + order_type: ORDER_TYPE.ASC, + limit: 100, + }); + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get relations(): RelationParam { + return { + joinRelations: [], + selectRelations: [], + countRelations: [], + }; + } + + get selects(): string[] { + return []; + } + + get specificFilter(): Param[] { + return []; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + if (this.filterParam.modules) { + queryBuilder.andWhere('module In (:...modules)', { + modules: this.filterParam.modules, + }); + } + + if (this.filterParam.menus) { + queryBuilder.andWhere('menu In (:...menus)', { + menus: this.filterParam.menus, + }); + } + + queryBuilder.andWhere('user_privilege_id = :user_privilege_id', { + user_privilege_id: this.userProvider.user.user_privilege_id, + }); + + queryBuilder.andWhere('view = :view', { + view: true, + }); + + return queryBuilder; + } + + getMenuSuperAdmin(params: FilterMenuUserPrivilegeConfigurationDto) { + const modules = params?.modules ?? []; + const menus = params?.menus ?? []; + let configs = UserPrivilegeConfigurationHelper.createConfigurations(); + + if (modules.length > 0) { + configs = configs.filter((item) => modules.includes(item.module)); + } + + if (menus.length > 0) { + configs = configs.filter((item) => menus.includes(item.menu)); + } + + const newResult = configs.map((item) => { + const newItem = item; + + item.actions?.forEach((element) => { + item[element] = true; + }); + + newItem.actions = undefined; + + const cleanData = Object.entries(newItem) + .filter(([key, value]) => value !== undefined) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {}); + + return cleanData; + }); + + return newResult as any; + } + + getResult(): PaginationResponse { + const role = this.userProvider.user.role; + const isSuperAdmin = role === UserRole.SUPERADMIN; + + if (isSuperAdmin) { + return { + data: this.getMenuSuperAdmin(this.filterParam), + total: 100, + }; + } + + return this.result; + } +} diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator.ts index 2e4488c..4dc4413 100644 --- a/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator.ts +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator.ts @@ -5,12 +5,14 @@ import { UserPrivilegeConfigurationService } from '../../../data/service/user-pr import { IndexUserPrivilegeConfigurationManager } from './managers/index-user-privilege-configuration.manager'; import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { MenuUserPrivilegeConfigurationManager } from './managers/menu-user-privilege-configuration.manager'; @Injectable() export class UserPrivilegeConfigurationDataOrchestrator { constructor( private updateManager: UpdateUserPrivilegeConfigurationManager, private indexManager: IndexUserPrivilegeConfigurationManager, + private privilegeMenuManager: MenuUserPrivilegeConfigurationManager, private serviceData: UserPrivilegeConfigurationService, ) {} @@ -35,4 +37,21 @@ export class UserPrivilegeConfigurationDataOrchestrator { await this.indexManager.execute(); return this.indexManager.getResult(); } + + async privilegeMenu( + params, + ): Promise> { + this.privilegeMenuManager.setFilterParam({ + page: 1, + limit: 100, + ...(params ?? {}), + }); + + this.privilegeMenuManager.setService( + this.serviceData, + TABLE_NAME.USER_PRIVILEGE_CONFIGURATION, + ); + await this.privilegeMenuManager.execute(); + return this.privilegeMenuManager.getResult(); + } } diff --git a/src/modules/user-related/user-privilege/infrastructure/dto/filter-menu-user-privilege-configuration.dto.ts b/src/modules/user-related/user-privilege/infrastructure/dto/filter-menu-user-privilege-configuration.dto.ts new file mode 100644 index 0000000..f99213f --- /dev/null +++ b/src/modules/user-related/user-privilege/infrastructure/dto/filter-menu-user-privilege-configuration.dto.ts @@ -0,0 +1,16 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class FilterMenuUserPrivilegeConfigurationDto { + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + modules: string[]; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + menus: string[]; +} diff --git a/src/modules/user-related/user-privilege/infrastructure/user-privilege-configuration.controller.ts b/src/modules/user-related/user-privilege/infrastructure/user-privilege-configuration.controller.ts index fcfde04..684d7b5 100644 --- a/src/modules/user-related/user-privilege/infrastructure/user-privilege-configuration.controller.ts +++ b/src/modules/user-related/user-privilege/infrastructure/user-privilege-configuration.controller.ts @@ -1,6 +1,6 @@ import { Body, Controller, Get, Param, Put, Query } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; -import { Public } from 'src/core/guards'; +import { ExcludePrivilege, Public } from 'src/core/guards'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; import { UserPrivilegeConfigurationDataOrchestrator } from '../domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator'; import { UserPrivilegeConfigurationDto } from './dto/user-privilege-configuration.dto'; @@ -8,6 +8,7 @@ import { UserPrivilegeConfigurationEntity } from '../domain/entities/user-privil import { FilterUserPrivilegeConfigurationDto } from './dto/filter-user-privilege-configuration.dto'; import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; import { Pagination } from 'src/core/response'; +import { FilterMenuUserPrivilegeConfigurationDto } from './dto/filter-menu-user-privilege-configuration.dto'; @ApiTags( `${MODULE_NAME.USER_PRIVILEGE_CONFIGURATION.split('-').join(' ')} - data`, @@ -34,4 +35,12 @@ export class UserPrivilegeConfigurationController { ): Promise> { return await this.orchestrator.index(params); } + + @Get('/menu') + @ExcludePrivilege() + async privilegeMenu( + @Query() params: FilterMenuUserPrivilegeConfigurationDto, + ): Promise { + return (await this.orchestrator.privilegeMenu(params)).data ?? []; + } } diff --git a/src/modules/user-related/user-privilege/user-privilege.module.ts b/src/modules/user-related/user-privilege/user-privilege.module.ts index 5b82d7c..d8a52c5 100644 --- a/src/modules/user-related/user-privilege/user-privilege.module.ts +++ b/src/modules/user-related/user-privilege/user-privilege.module.ts @@ -27,6 +27,7 @@ import { UserPrivilegeConfigurationController } from './infrastructure/user-priv import { UserPrivilegeConfigurationDataOrchestrator } from './domain/usecases/user-privilege-configuration/user-privilege-configuration-data.orchestrator'; import { IndexUserPrivilegeConfigurationManager } from './domain/usecases/user-privilege-configuration/managers/index-user-privilege-configuration.manager'; import { UserPrivilegeModels } from './constants'; +import { MenuUserPrivilegeConfigurationManager } from './domain/usecases/user-privilege-configuration/managers/menu-user-privilege-configuration.manager'; @Module({ imports: [ @@ -55,6 +56,7 @@ import { UserPrivilegeModels } from './constants'; IndexUserPrivilegeConfigurationManager, UpdateUserPrivilegeConfigurationManager, + MenuUserPrivilegeConfigurationManager, UserPrivilegeDataService, UserPrivilegeReadService,