From c0f8d5ad9de628116656eed6b2989f95cd38b9c8 Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:52:12 +0700 Subject: [PATCH 1/3] feat: setup argument function module report --- .../report-bookmark.controller.ts | 27 +++++--- .../report-bookmark.service.ts | 3 +- .../report-export/report-export.controller.ts | 27 ++++++-- .../report-export/report-export.service.ts | 3 +- .../reports/report/report.controller.ts | 14 ++-- src/modules/reports/report/report.service.ts | 13 +++- src/modules/reports/shared/configs/index.ts | 0 .../shared/dto/report-bookmark.create.dto.ts | 33 +++++++++ .../shared/dto/report-bookmark.get.dto.ts | 22 ++++++ .../shared/dto/report-config.get.dto.ts | 16 +++++ .../reports/shared/dto/report-data.get.dto.ts | 22 ++++++ .../shared/dto/report-export.create.dto.ts | 23 +++++++ .../shared/dto/report-export.get.dto.ts | 69 +++++++++++++++++++ .../shared/entities/query-model.entity.ts | 32 +++++++++ .../shared/services/base-report.service.ts | 17 +++++ 15 files changed, 299 insertions(+), 22 deletions(-) create mode 100644 src/modules/reports/shared/configs/index.ts create mode 100644 src/modules/reports/shared/dto/report-bookmark.create.dto.ts create mode 100644 src/modules/reports/shared/dto/report-bookmark.get.dto.ts create mode 100644 src/modules/reports/shared/dto/report-config.get.dto.ts create mode 100644 src/modules/reports/shared/dto/report-data.get.dto.ts create mode 100644 src/modules/reports/shared/dto/report-export.create.dto.ts create mode 100644 src/modules/reports/shared/dto/report-export.get.dto.ts create mode 100644 src/modules/reports/shared/entities/query-model.entity.ts create mode 100644 src/modules/reports/shared/services/base-report.service.ts diff --git a/src/modules/reports/report-bookmark/report-bookmark.controller.ts b/src/modules/reports/report-bookmark/report-bookmark.controller.ts index 7f30778..20e8111 100644 --- a/src/modules/reports/report-bookmark/report-bookmark.controller.ts +++ b/src/modules/reports/report-bookmark/report-bookmark.controller.ts @@ -1,7 +1,18 @@ -import { Controller, Delete, Get, Post, Put } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Put, + Query, +} from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Public } from 'src/core/guards'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { GetReportBookmarkDto } from '../shared/dto/report-bookmark.get.dto'; +import { CreateReportBookmarkDto } from '../shared/dto/report-bookmark.create.dto'; @ApiTags(`${MODULE_NAME.REPORT_BOOKMARK.split('-').join(' ')}`) @Controller(`v1/${MODULE_NAME.REPORT_BOOKMARK}`) @@ -9,27 +20,27 @@ import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; @ApiBearerAuth('JWT') export class ReportBookmarkController { @Post() - async create() { + async create(@Body() body: CreateReportBookmarkDto) { return; } @Get() - async getAll() { + async getAll(@Query() query: GetReportBookmarkDto) { return; } - @Put('applied') - async applied() { + @Put('applied/:id') + async applied(@Param('id') id: string) { return; } - @Put('unapplied') - async unapplied() { + @Put('unapplied/:id') + async unapplied(@Param('id') id: string) { return; } @Delete(':id') - async delete() { + async delete(@Param('id') id: string) { return; } } diff --git a/src/modules/reports/report-bookmark/report-bookmark.service.ts b/src/modules/reports/report-bookmark/report-bookmark.service.ts index 54923f2..8dc3e05 100644 --- a/src/modules/reports/report-bookmark/report-bookmark.service.ts +++ b/src/modules/reports/report-bookmark/report-bookmark.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common'; +import { BaseReportService } from '../shared/services/base-report.service'; @Injectable() -export class ReportBookmarkService {} +export class ReportBookmarkService extends BaseReportService {} diff --git a/src/modules/reports/report-export/report-export.controller.ts b/src/modules/reports/report-export/report-export.controller.ts index ab7b428..f3bf3f7 100644 --- a/src/modules/reports/report-export/report-export.controller.ts +++ b/src/modules/reports/report-export/report-export.controller.ts @@ -1,7 +1,22 @@ -import { Controller, Delete, Get, Post, Put } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Put, + Query, +} from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Public } from 'src/core/guards'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { CreateReportExportDto } from '../shared/dto/report-export.create.dto'; +import { + GetReportExportDto, + GetReportExportFileNameDto, + GetReportExportProcessingDto, +} from '../shared/dto/report-export.get.dto'; @ApiTags(`${MODULE_NAME.REPORT_EXPORT.split('-').join(' ')}`) @Controller(`v1/${MODULE_NAME.REPORT_EXPORT}`) @@ -9,27 +24,27 @@ import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; @ApiBearerAuth('JWT') export class ReportExportController { @Post() - async create() { + async create(@Body() body: CreateReportExportDto) { return; } @Get() - async getAll() { + async getAll(@Query() query: GetReportExportDto) { return; } @Delete(':id') - async delete() { + async delete(@Param('id') id: string) { return; } @Get('processing') - async getAllProcessing() { + async getAllProcessing(@Query() query: GetReportExportProcessingDto) { return; } @Get('filename-history') - async getListHistoryFileName() { + async getListHistoryFileName(@Query() query: GetReportExportFileNameDto) { return; } } diff --git a/src/modules/reports/report-export/report-export.service.ts b/src/modules/reports/report-export/report-export.service.ts index 7af3f29..223f1c4 100644 --- a/src/modules/reports/report-export/report-export.service.ts +++ b/src/modules/reports/report-export/report-export.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common'; +import { BaseReportService } from '../shared/services/base-report.service'; @Injectable() -export class ReportExportService {} +export class ReportExportService extends BaseReportService {} diff --git a/src/modules/reports/report/report.controller.ts b/src/modules/reports/report/report.controller.ts index c420a09..5ccbb55 100644 --- a/src/modules/reports/report/report.controller.ts +++ b/src/modules/reports/report/report.controller.ts @@ -1,20 +1,24 @@ -import { Controller, Get, Post } from '@nestjs/common'; +import { Body, Controller, Get, Post, Query } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Public } from 'src/core/guards'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ReportService } from './report.service'; +import { GetReportConfigDto } from '../shared/dto/report-config.get.dto'; +import { GetReportDataDto } from '../shared/dto/report-data.get.dto'; @ApiTags(`${MODULE_NAME.REPORT.split('-').join(' ')}`) @Controller(`v1/${MODULE_NAME.REPORT}`) @Public(false) @ApiBearerAuth('JWT') export class ReportController { + constructor(private service: ReportService) {} @Get('config') - async getReportConfig() { - return; + async getReportConfig(@Query() query: GetReportConfigDto) { + return await this.service.getReportConfig(query); } @Post('data') - async getReportData() { - return; + async getReportData(@Body() body: GetReportDataDto) { + return await this.service.getReportData(body); } } diff --git a/src/modules/reports/report/report.service.ts b/src/modules/reports/report/report.service.ts index 989bd98..a251f38 100644 --- a/src/modules/reports/report/report.service.ts +++ b/src/modules/reports/report/report.service.ts @@ -1,4 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { BaseReportService } from '../shared/services/base-report.service'; +import { GetReportConfigDto } from '../shared/dto/report-config.get.dto'; +import { GetReportDataDto } from '../shared/dto/report-data.get.dto'; @Injectable() -export class ReportService {} +export class ReportService extends BaseReportService { + async getReportConfig(query: GetReportConfigDto) { + return this.getUser(); + } + + async getReportData(body: GetReportDataDto) { + return this.getUser(); + } +} diff --git a/src/modules/reports/shared/configs/index.ts b/src/modules/reports/shared/configs/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/reports/shared/dto/report-bookmark.create.dto.ts b/src/modules/reports/shared/dto/report-bookmark.create.dto.ts new file mode 100644 index 0000000..14d80cf --- /dev/null +++ b/src/modules/reports/shared/dto/report-bookmark.create.dto.ts @@ -0,0 +1,33 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsBoolean, IsObject, IsString, ValidateIf } from 'class-validator'; + +export class CreateReportBookmarkDto { + @ApiProperty({ name: 'group_name', required: true }) + @IsString() + group_name: string; + + @ApiProperty({ name: 'unique_name', required: true }) + @IsString() + unique_name: string; + + @ApiProperty({ name: 'label', required: true }) + @IsString() + label: string; + + @ApiProperty({ name: 'applied', required: true }) + @IsBoolean() + applied: boolean; + + @ApiProperty({ name: 'type', required: true }) + @IsBoolean() + type: 'table_config' | 'filter'; + + @ApiProperty({ + name: 'configuration', + type: Object, + required: true, + }) + @IsObject() + @ValidateIf((body) => body.configuration) + configuration: any; +} diff --git a/src/modules/reports/shared/dto/report-bookmark.get.dto.ts b/src/modules/reports/shared/dto/report-bookmark.get.dto.ts new file mode 100644 index 0000000..88374f2 --- /dev/null +++ b/src/modules/reports/shared/dto/report-bookmark.get.dto.ts @@ -0,0 +1,22 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class GetReportBookmarkDto { + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + group_names?: string; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + unique_names?: string[]; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + types?: string[]; +} diff --git a/src/modules/reports/shared/dto/report-config.get.dto.ts b/src/modules/reports/shared/dto/report-config.get.dto.ts new file mode 100644 index 0000000..2eab64e --- /dev/null +++ b/src/modules/reports/shared/dto/report-config.get.dto.ts @@ -0,0 +1,16 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class GetReportConfigDto { + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + group_names?: string; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + unique_names?: string[]; +} diff --git a/src/modules/reports/shared/dto/report-data.get.dto.ts b/src/modules/reports/shared/dto/report-data.get.dto.ts new file mode 100644 index 0000000..a66b84b --- /dev/null +++ b/src/modules/reports/shared/dto/report-data.get.dto.ts @@ -0,0 +1,22 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsObject, IsString, ValidateIf } from 'class-validator'; +import { QueryModelEntity } from '../entities/query-model.entity'; + +export class GetReportDataDto { + @ApiProperty({ name: 'group_name', required: true }) + @IsString() + group_name: string; + + @ApiProperty({ name: 'unique_name', required: true }) + @IsString() + unique_name: string; + + @ApiProperty({ + name: 'query_model', + type: Object, + required: true, + }) + @IsObject() + @ValidateIf((body) => body.query_model) + query_model: QueryModelEntity; +} diff --git a/src/modules/reports/shared/dto/report-export.create.dto.ts b/src/modules/reports/shared/dto/report-export.create.dto.ts new file mode 100644 index 0000000..fd66fa4 --- /dev/null +++ b/src/modules/reports/shared/dto/report-export.create.dto.ts @@ -0,0 +1,23 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { GetReportDataDto } from './report-data.get.dto'; +import { IsString, IsNumber, IsOptional, IsArray } from 'class-validator'; +import { ColumnStateEntity } from '../entities/query-model.entity'; + +export class CreateReportExportDto extends GetReportDataDto { + @ApiProperty({ name: 'time_zone', required: true }) + @IsString() + time_zone: string; + + @ApiProperty({ name: 'file_name', required: true }) + @IsString() + file_name?: string; + + @ApiProperty({ + name: 'column_state', + type: [Object], + required: true, + }) + @IsOptional() + @IsArray() + column_state: ColumnStateEntity[]; +} diff --git a/src/modules/reports/shared/dto/report-export.get.dto.ts b/src/modules/reports/shared/dto/report-export.get.dto.ts new file mode 100644 index 0000000..264582e --- /dev/null +++ b/src/modules/reports/shared/dto/report-export.get.dto.ts @@ -0,0 +1,69 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; +import { IsNumber, ValidateIf } from 'class-validator'; + +export class GetReportExportDto { + @ApiProperty({ type: Number, required: false, default: 1 }) + @Transform((body) => Number(body.value)) + @ValidateIf((body) => body.page) + @IsNumber() + page = 1; + + @ApiProperty({ type: Number, required: false, default: 10 }) + @Transform((body) => Number(body.value)) + @ValidateIf((body) => body.limit) + @IsNumber() + limit = 10; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + group_names?: string; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + unique_names?: string[]; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + statuses?: string; +} + +export class GetReportExportProcessingDto { + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + group_names?: string; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + unique_names?: string[]; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + statuses?: string; +} + +export class GetReportExportFileNameDto { + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + group_names?: string; + + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + unique_names?: string[]; +} diff --git a/src/modules/reports/shared/entities/query-model.entity.ts b/src/modules/reports/shared/entities/query-model.entity.ts new file mode 100644 index 0000000..88ff53c --- /dev/null +++ b/src/modules/reports/shared/entities/query-model.entity.ts @@ -0,0 +1,32 @@ +export interface QueryModelEntity { + startRow: number; + endRow: number; + rowGroupCols: RowGroupCol[]; + valueCols: any[]; + pivotCols: any[]; + pivotMode: boolean; + groupKeys: any[]; + filterModel: any; + sortModel: any[]; +} + +interface RowGroupCol { + id: string; + displayName: string; + field: string; +} + +export interface ColumnStateEntity { + colId: string; + width: number; + hide: boolean; + pinned: any; + sort: any; + sortIndex: any; + aggFunc: any; + rowGroup: boolean; + rowGroupIndex: any; + pivot: boolean; + pivotIndex: any; + flex: number; +} diff --git a/src/modules/reports/shared/services/base-report.service.ts b/src/modules/reports/shared/services/base-report.service.ts new file mode 100644 index 0000000..dbaefd8 --- /dev/null +++ b/src/modules/reports/shared/services/base-report.service.ts @@ -0,0 +1,17 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { UserProvider } from 'src/core/sessions'; +import { BLANK_USER } from 'src/core/strings/constants/base.constants'; + +@Injectable() +export class BaseReportService { + @Inject() + protected userProvider: UserProvider; + + getUser() { + try { + return this.userProvider?.user; + } catch (error) { + return BLANK_USER; + } + } +} From e586a7bad133a4eab3e4fdbacb2d6d82c7e872ac Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:56:00 +0700 Subject: [PATCH 2/3] feat: config dto type on bookmark report --- src/modules/reports/shared/constant/index.ts | 1 + .../reports/shared/constant/report-bookmark-type.constant.ts | 4 ++++ src/modules/reports/shared/dto/report-bookmark.create.dto.ts | 3 ++- src/modules/reports/shared/dto/report-bookmark.get.dto.ts | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/modules/reports/shared/constant/report-bookmark-type.constant.ts diff --git a/src/modules/reports/shared/constant/index.ts b/src/modules/reports/shared/constant/index.ts index 3b44934..ad8e1a6 100644 --- a/src/modules/reports/shared/constant/index.ts +++ b/src/modules/reports/shared/constant/index.ts @@ -1,3 +1,4 @@ export * from './report-config.constant'; export * from './report-group.constant'; export * from './report-status.constant'; +export * from './report-bookmark-type.constant'; diff --git a/src/modules/reports/shared/constant/report-bookmark-type.constant.ts b/src/modules/reports/shared/constant/report-bookmark-type.constant.ts new file mode 100644 index 0000000..65bb411 --- /dev/null +++ b/src/modules/reports/shared/constant/report-bookmark-type.constant.ts @@ -0,0 +1,4 @@ +export enum REPORT_BOOKMARK_TYPE { + table_config = 'table_config', + filter = 'filter', +} diff --git a/src/modules/reports/shared/dto/report-bookmark.create.dto.ts b/src/modules/reports/shared/dto/report-bookmark.create.dto.ts index 14d80cf..b4db379 100644 --- a/src/modules/reports/shared/dto/report-bookmark.create.dto.ts +++ b/src/modules/reports/shared/dto/report-bookmark.create.dto.ts @@ -1,5 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsBoolean, IsObject, IsString, ValidateIf } from 'class-validator'; +import { REPORT_BOOKMARK_TYPE } from '../constant'; export class CreateReportBookmarkDto { @ApiProperty({ name: 'group_name', required: true }) @@ -20,7 +21,7 @@ export class CreateReportBookmarkDto { @ApiProperty({ name: 'type', required: true }) @IsBoolean() - type: 'table_config' | 'filter'; + type: REPORT_BOOKMARK_TYPE; @ApiProperty({ name: 'configuration', diff --git a/src/modules/reports/shared/dto/report-bookmark.get.dto.ts b/src/modules/reports/shared/dto/report-bookmark.get.dto.ts index 88374f2..c325336 100644 --- a/src/modules/reports/shared/dto/report-bookmark.get.dto.ts +++ b/src/modules/reports/shared/dto/report-bookmark.get.dto.ts @@ -1,5 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; +import { REPORT_BOOKMARK_TYPE } from '../constant'; export class GetReportBookmarkDto { @ApiProperty({ type: ['string'], required: false }) @@ -18,5 +19,5 @@ export class GetReportBookmarkDto { @Transform((body) => { return Array.isArray(body.value) ? body.value : [body.value]; }) - types?: string[]; + types?: REPORT_BOOKMARK_TYPE[]; } From 241501815b83b2d4cc203086896e08e094aae2af Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:56:52 +0700 Subject: [PATCH 3/3] feat: update model report bookmark --- src/modules/reports/shared/models/report-bookmark.model.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/reports/shared/models/report-bookmark.model.ts b/src/modules/reports/shared/models/report-bookmark.model.ts index 38aa8dc..10ba726 100644 --- a/src/modules/reports/shared/models/report-bookmark.model.ts +++ b/src/modules/reports/shared/models/report-bookmark.model.ts @@ -2,6 +2,7 @@ import { BaseModel } from 'src/core/modules/data/model/base.model'; import { Entity, Column } from 'typeorm'; import { ReportBookmarkEntity } from '../entities/report-bookmark.entity'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { REPORT_BOOKMARK_TYPE } from '../constant'; @Entity(TABLE_NAME.REPORT_BOOKMARK) export class ReportBookmarkModel @@ -22,4 +23,7 @@ export class ReportBookmarkModel @Column('json', { nullable: true }) configuration: any; + + @Column('varchar') + type: REPORT_BOOKMARK_TYPE; }