From c97399ae8f85b46b7845f64062b39a745e567996 Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Thu, 5 Jun 2025 17:08:39 +0700 Subject: [PATCH] feat: add api get time group items public --- .../index-public-time-group.manager.ts | 65 +++++++++++++++++++ .../usecases/time-group-read.orchestrator.ts | 12 ++++ .../time-group-read.controller.ts | 15 +++++ .../time-group/time-group.module.ts | 13 +++- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/modules/item-related/time-group/domain/usecases/managers/index-public-time-group.manager.ts diff --git a/src/modules/item-related/time-group/domain/usecases/managers/index-public-time-group.manager.ts b/src/modules/item-related/time-group/domain/usecases/managers/index-public-time-group.manager.ts new file mode 100644 index 0000000..c626f1d --- /dev/null +++ b/src/modules/item-related/time-group/domain/usecases/managers/index-public-time-group.manager.ts @@ -0,0 +1,65 @@ +import { Injectable } from '@nestjs/common'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { TimeGroupEntity } from '../../entities/time-group.entity'; +import { SelectQueryBuilder } from 'typeorm'; +import { + Param, + RelationParam, +} from 'src/core/modules/domain/entities/base-filter.entity'; + +// TODO: +// Implementasikan filter by start_time, end_timen, dan max_usage_time + +@Injectable() +export class IndexPublicTimeGroupManager extends BaseIndexManager { + async prepareData(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get relations(): RelationParam { + return { + joinRelations: ['items'], + selectRelations: [], + countRelations: ['items'], + }; + } + + get selects(): string[] { + return [ + `${this.tableName}.id`, + `${this.tableName}.status`, + `${this.tableName}.name`, + `${this.tableName}.start_time`, + `${this.tableName}.end_time`, + `${this.tableName}.max_usage_time`, + `${this.tableName}.created_at`, + `${this.tableName}.creator_name`, + `${this.tableName}.updated_at`, + `${this.tableName}.editor_name`, + ]; + } + + get specificFilter(): Param[] { + return [ + { + cols: `${this.tableName}.name`, + data: this.filterParam.names, + }, + ]; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + queryBuilder.andWhere(`items.id is not null`); + return queryBuilder; + } +} diff --git a/src/modules/item-related/time-group/domain/usecases/time-group-read.orchestrator.ts b/src/modules/item-related/time-group/domain/usecases/time-group-read.orchestrator.ts index aa6b6e3..b0ef50f 100644 --- a/src/modules/item-related/time-group/domain/usecases/time-group-read.orchestrator.ts +++ b/src/modules/item-related/time-group/domain/usecases/time-group-read.orchestrator.ts @@ -6,11 +6,13 @@ import { PaginationResponse } from 'src/core/response/domain/ok-response.interfa import { BaseReadOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-read.orchestrator'; import { DetailTimeGroupManager } from './managers/detail-time-group.manager'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { IndexPublicTimeGroupManager } from './managers/index-public-time-group.manager'; @Injectable() export class TimeGroupReadOrchestrator extends BaseReadOrchestrator { constructor( private indexManager: IndexTimeGroupManager, + private indexPublicManager: IndexPublicTimeGroupManager, private detailManager: DetailTimeGroupManager, private serviceData: TimeGroupReadService, ) { @@ -24,6 +26,16 @@ export class TimeGroupReadOrchestrator extends BaseReadOrchestrator> { + this.indexPublicManager.setFilterParam(params); + this.indexPublicManager.setService( + this.serviceData, + TABLE_NAME.TIME_GROUPS, + ); + await this.indexPublicManager.execute(); + return this.indexPublicManager.getResult(); + } + async detail(dataId: string): Promise { this.detailManager.setData(dataId); this.detailManager.setService(this.serviceData, TABLE_NAME.TIME_GROUPS); diff --git a/src/modules/item-related/time-group/infrastructure/time-group-read.controller.ts b/src/modules/item-related/time-group/infrastructure/time-group-read.controller.ts index 212558d..860ff92 100644 --- a/src/modules/item-related/time-group/infrastructure/time-group-read.controller.ts +++ b/src/modules/item-related/time-group/infrastructure/time-group-read.controller.ts @@ -28,3 +28,18 @@ export class TimeGroupReadController { return await this.orchestrator.detail(id); } } + +@ApiTags(`${MODULE_NAME.TIME_GROUPS.split('-').join(' ')} List- read`) +@Controller(`v1/${MODULE_NAME.TIME_GROUPS}-list`) +@Public() +export class TimeGroupPublicReadController { + constructor(private orchestrator: TimeGroupReadOrchestrator) {} + + @Get('items') + @Pagination() + async indexPublic( + @Query() params: FilterTimeGroupDto, + ): Promise> { + return await this.orchestrator.indexPublic(params); + } +} diff --git a/src/modules/item-related/time-group/time-group.module.ts b/src/modules/item-related/time-group/time-group.module.ts index 45455c0..87009a2 100644 --- a/src/modules/item-related/time-group/time-group.module.ts +++ b/src/modules/item-related/time-group/time-group.module.ts @@ -4,7 +4,10 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; import { TimeGroupDataService } from './data/services/time-group-data.service'; import { TimeGroupReadService } from './data/services/time-group-read.service'; -import { TimeGroupReadController } from './infrastructure/time-group-read.controller'; +import { + TimeGroupPublicReadController, + TimeGroupReadController, +} from './infrastructure/time-group-read.controller'; import { TimeGroupReadOrchestrator } from './domain/usecases/time-group-read.orchestrator'; import { TimeGroupDataController } from './infrastructure/time-group-data.controller'; import { TimeGroupDataOrchestrator } from './domain/usecases/time-group-data.orchestrator'; @@ -22,6 +25,7 @@ import { BatchActiveTimeGroupManager } from './domain/usecases/managers/batch-ac import { BatchConfirmTimeGroupManager } from './domain/usecases/managers/batch-confirm-time-group.manager'; import { BatchInactiveTimeGroupManager } from './domain/usecases/managers/batch-inactive-time-group.manager'; import { TimeGroupModel } from './data/models/time-group.model'; +import { IndexPublicTimeGroupManager } from './domain/usecases/managers/index-public-time-group.manager'; @Module({ imports: [ @@ -29,8 +33,13 @@ import { TimeGroupModel } from './data/models/time-group.model'; TypeOrmModule.forFeature([TimeGroupModel], CONNECTION_NAME.DEFAULT), CqrsModule, ], - controllers: [TimeGroupDataController, TimeGroupReadController], + controllers: [ + TimeGroupDataController, + TimeGroupReadController, + TimeGroupPublicReadController, + ], providers: [ + IndexPublicTimeGroupManager, IndexTimeGroupManager, DetailTimeGroupManager, CreateTimeGroupManager,