From 0368f3452b97540d91368cc372a4929e5cd35f95 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah <98192542+Asharaswin@users.noreply.github.com> Date: Mon, 24 Jun 2024 20:04:14 +0700 Subject: [PATCH] fix(SPG-552) BE - Update Item Rate pada module season period --- .../item-rate/item-rate.module.ts | 9 ++- .../season-period-price-updated.event.ts | 5 ++ .../season-period-price-updated.handler.ts | 62 +++++++++++++++++++ .../update-season-period-price.manager.ts | 59 ++++++++++++++++++ .../season-period-data.orchestrator.ts | 9 +++ .../dto/update-season-period.dto.ts | 4 +- .../dto/update-season-price.dto.ts | 31 ++++++++++ .../season-period-data.controller.ts | 7 +++ .../season-period/season-period.module.ts | 4 ++ 9 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 src/modules/season-related/season-period/domain/entities/event/season-period-price-updated.event.ts create mode 100644 src/modules/season-related/season-period/domain/usecases/handlers/season-period-price-updated.handler.ts create mode 100644 src/modules/season-related/season-period/domain/usecases/managers/update-season-period-price.manager.ts create mode 100644 src/modules/season-related/season-period/infrastructure/dto/update-season-price.dto.ts diff --git a/src/modules/item-related/item-rate/item-rate.module.ts b/src/modules/item-related/item-rate/item-rate.module.ts index 17e224f..238378e 100644 --- a/src/modules/item-related/item-rate/item-rate.module.ts +++ b/src/modules/item-related/item-rate/item-rate.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { Global, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; @@ -17,6 +17,7 @@ import { DetailItemRateManager } from './domain/usecases/managers/detail-item-ra import { BatchDeleteItemRateManager } from './domain/usecases/managers/batch-delete-item-rate.manager'; import { ItemRateModel } from './data/models/item-rate.model'; +@Global() @Module({ imports: [ ConfigModule.forRoot(), @@ -38,5 +39,9 @@ import { ItemRateModel } from './data/models/item-rate.model'; ItemRateDataOrchestrator, ItemRateReadOrchestrator, ], + exports: [ + ItemRateDataService, + ItemRateReadService, + ] }) -export class ItemRateModule {} +export class ItemRateModule { } diff --git a/src/modules/season-related/season-period/domain/entities/event/season-period-price-updated.event.ts b/src/modules/season-related/season-period/domain/entities/event/season-period-price-updated.event.ts new file mode 100644 index 0000000..9b97504 --- /dev/null +++ b/src/modules/season-related/season-period/domain/entities/event/season-period-price-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class SeasonPeriodPriceUpdatedEvent { + constructor(public readonly data: IEvent) { } +} diff --git a/src/modules/season-related/season-period/domain/usecases/handlers/season-period-price-updated.handler.ts b/src/modules/season-related/season-period/domain/usecases/handlers/season-period-price-updated.handler.ts new file mode 100644 index 0000000..ed9c535 --- /dev/null +++ b/src/modules/season-related/season-period/domain/usecases/handlers/season-period-price-updated.handler.ts @@ -0,0 +1,62 @@ +import { EventsHandler, IEventHandler } from "@nestjs/cqrs"; +import { SeasonPeriodPriceUpdatedEvent } from "../../entities/event/season-period-price-updated.event"; +import { SeasonPeriodReadService } from "../../../data/services/season-period-read.service"; +import { SeasonPeriodDataService } from "../../../data/services/season-period-data.service"; +import { SeasonPeriodModel } from "../../../data/models/season-period.model"; +import { ItemRateDataService } from "src/modules/item-related/item-rate/data/services/item-rate-data.service"; +import { ItemRateModel } from "src/modules/item-related/item-rate/data/models/item-rate.model"; +import { IsNull } from "typeorm"; + +@EventsHandler(SeasonPeriodPriceUpdatedEvent) +export class SeasonPeriodPriceUpdatedHandler implements IEventHandler { + + constructor( + private readService: SeasonPeriodReadService, + private dataService: SeasonPeriodDataService, + private rateDataService: ItemRateDataService, + ) { } + + async handle(event: SeasonPeriodPriceUpdatedEvent) { + const datas = await this.readService.getManyByOptions({ + where: { + season_type_id: event.data.data.season_period?.id + } + }).then(data => { + return data.map(item => { + return { + ...item, + item_rates: event.data.data.item_rates, + } + }) + }) + + const queryRunner = this.dataService + .getRepository() + .manager.connection.createQueryRunner(); + + await this.dataService.createBatch( + queryRunner, + SeasonPeriodModel, + datas + ) + + await this.deleteUnusedItem() + } + + async deleteUnusedItem() { + const queryRunnerItem = this.rateDataService + .getRepository() + .manager.connection.createQueryRunner(); + + await this.rateDataService.deleteByOptions( + queryRunnerItem, + ItemRateModel, + { + where: { + season_period_id: IsNull() + } + } + ) + + } +} \ No newline at end of file diff --git a/src/modules/season-related/season-period/domain/usecases/managers/update-season-period-price.manager.ts b/src/modules/season-related/season-period/domain/usecases/managers/update-season-period-price.manager.ts new file mode 100644 index 0000000..df723ce --- /dev/null +++ b/src/modules/season-related/season-period/domain/usecases/managers/update-season-period-price.manager.ts @@ -0,0 +1,59 @@ +import { Injectable } from "@nestjs/common"; +import { BaseCustomManager } from "src/core/modules/domain/usecase/managers/base-custom.manager"; +import { SeasonPeriodEntity } from "../../entities/season-period.entity"; +import { EventTopics } from "src/core/strings/constants/interface.constants"; +import { SeasonPeriodModel } from "../../../data/models/season-period.model"; +import { SeasonPeriodPriceUpdatedHandler } from "../handlers/season-period-price-updated.handler"; +import { SeasonPeriodPriceUpdatedEvent } from "../../entities/event/season-period-price-updated.event"; +import { OPERATION } from "src/core/strings/constants/base.constants"; + +@Injectable() +export class UpdateSeasonPeriodPriceManager extends BaseCustomManager { + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async process(): Promise { + // this.publishEvents(); + + this.eventBus.publish( + new SeasonPeriodPriceUpdatedEvent({ + id: '', + old: null, + data: this.data, + user: this.user, + description: '', + module: this.tableName, + op: OPERATION.CREATE, + }) + ) + return; + } + + async afterProcess(): Promise { + return; + } + + get entityTarget(): any { + return SeasonPeriodModel;; + } + + getResult() { + return; + } + + get eventTopics(): EventTopics[] { + return [ + // { + // topic: SeasonPeriodPriceUpdatedEvent, + // data: this.data, + // } + ]; + } + +} \ No newline at end of file diff --git a/src/modules/season-related/season-period/domain/usecases/season-period-data.orchestrator.ts b/src/modules/season-related/season-period/domain/usecases/season-period-data.orchestrator.ts index 804ddaf..35c06f5 100644 --- a/src/modules/season-related/season-period/domain/usecases/season-period-data.orchestrator.ts +++ b/src/modules/season-related/season-period/domain/usecases/season-period-data.orchestrator.ts @@ -15,6 +15,7 @@ import { BatchInactiveSeasonPeriodManager } from './managers/batch-inactive-seas import { BatchActiveSeasonPeriodManager } from './managers/batch-active-season-period.manager'; import { BatchDeleteSeasonPeriodManager } from './managers/batch-delete-season-period.manager'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { UpdateSeasonPeriodPriceManager } from './managers/update-season-period-price.manager'; @Injectable() export class SeasonPeriodDataOrchestrator extends BaseDataTransactionOrchestrator { @@ -29,6 +30,7 @@ export class SeasonPeriodDataOrchestrator extends BaseDataTransactionOrchestrato private batchActiveManager: BatchActiveSeasonPeriodManager, private batchConfirmManager: BatchConfirmSeasonPeriodManager, private batchInactiveManager: BatchInactiveSeasonPeriodManager, + private updatePriceManager: UpdateSeasonPeriodPriceManager, private serviceData: SeasonPeriodDataService, ) { super(); @@ -48,6 +50,13 @@ export class SeasonPeriodDataOrchestrator extends BaseDataTransactionOrchestrato return this.updateManager.getResult(); } + async updatePrice(data): Promise { + this.updatePriceManager.setData(data); + this.updatePriceManager.setService(this.serviceData, TABLE_NAME.SEASON_PERIOD); + await this.updatePriceManager.execute(); + return this.updatePriceManager.getResult(); + } + async delete(dataId): Promise { this.deleteManager.setData(dataId); this.deleteManager.setService(this.serviceData, TABLE_NAME.SEASON_PERIOD); diff --git a/src/modules/season-related/season-period/infrastructure/dto/update-season-period.dto.ts b/src/modules/season-related/season-period/infrastructure/dto/update-season-period.dto.ts index e383b62..3ba25e0 100644 --- a/src/modules/season-related/season-period/infrastructure/dto/update-season-period.dto.ts +++ b/src/modules/season-related/season-period/infrastructure/dto/update-season-period.dto.ts @@ -5,13 +5,11 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsObject, ValidateIf } from 'class-validator'; import { SeasonTypeModel } from 'src/modules/season-related/season-type/data/models/season-type.model'; import { Exclude } from 'class-transformer'; -import { ItemRateModel } from 'src/modules/item-related/item-rate/data/models/item-rate.model'; import { SeasonPeriodHolidayDto } from './season-period-holiday.dto'; export class UpdateSeasonPeriodDto extends BaseStatusDto - implements SeasonPeriodEntity -{ + implements SeasonPeriodEntity { @ApiProperty({ type: Object, required: true, diff --git a/src/modules/season-related/season-period/infrastructure/dto/update-season-price.dto.ts b/src/modules/season-related/season-period/infrastructure/dto/update-season-price.dto.ts new file mode 100644 index 0000000..6c632d0 --- /dev/null +++ b/src/modules/season-related/season-period/infrastructure/dto/update-season-price.dto.ts @@ -0,0 +1,31 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsObject } from "class-validator"; +import { ItemRateModel } from "src/modules/item-related/item-rate/data/models/item-rate.model"; +import { SeasonTypeModel } from "src/modules/season-related/season-type/data/models/season-type.model"; + +export class UpdateSeasonPriceDto { + @ApiProperty({ + type: Object, + required: true, + example: { + id: 'uuid', + name: 'High Season', + }, + }) + @IsObject() + season_period: SeasonTypeModel; + + @ApiProperty({ + type: [Object], + example: [ + { + item: { + id: 'uuid', + name: 'Entrance Ticket', + }, + price: 10000, + }, + ], + }) + item_rates: ItemRateModel[]; +} \ No newline at end of file diff --git a/src/modules/season-related/season-period/infrastructure/season-period-data.controller.ts b/src/modules/season-related/season-period/infrastructure/season-period-data.controller.ts index c6f4f05..0b91b7d 100644 --- a/src/modules/season-related/season-period/infrastructure/season-period-data.controller.ts +++ b/src/modules/season-related/season-period/infrastructure/season-period-data.controller.ts @@ -18,6 +18,7 @@ import { BatchIdsDto } from 'src/core/modules/infrastructure/dto/base-batch.dto' import { Public } from 'src/core/guards'; import { UpdateSeasonPeriodDto } from './dto/update-season-period.dto'; import { UpdateSeasonPeriodItemDto } from './dto/update-season-period-item.dto'; +import { UpdateSeasonPriceDto } from './dto/update-season-price.dto'; @ApiTags(`${ MODULE_NAME.SEASON_PERIOD.split('-').join(' ') } - data`) @Controller(MODULE_NAME.SEASON_PERIOD) @@ -31,6 +32,12 @@ export class SeasonPeriodDataController { return await this.orchestrator.create(data); } + @Post('/update-price') + async updatePrice(@Body() body: UpdateSeasonPriceDto): Promise { + console.log('here') + return await this.orchestrator.updatePrice(body); + } + @Put('/batch-delete') async batchDeleted(@Body() body: BatchIdsDto): Promise { return await this.orchestrator.batchDelete(body.ids); diff --git a/src/modules/season-related/season-period/season-period.module.ts b/src/modules/season-related/season-period/season-period.module.ts index ee0f64a..7dd7f83 100644 --- a/src/modules/season-related/season-period/season-period.module.ts +++ b/src/modules/season-related/season-period/season-period.module.ts @@ -26,6 +26,8 @@ import { SeasonPeriodHolidayHandler } from './domain/usecases/handlers/season-pe import { IndexSeasonPeriodeItemManager } from './domain/usecases/managers/index-season-period-item.manager'; import { ItemRateModel } from 'src/modules/item-related/item-rate/data/models/item-rate.model'; import { ItemRateReadService } from 'src/modules/item-related/item-rate/data/services/item-rate-read.service'; +import { SeasonPeriodPriceUpdatedHandler } from './domain/usecases/handlers/season-period-price-updated.handler'; +import { UpdateSeasonPeriodPriceManager } from './domain/usecases/managers/update-season-period-price.manager'; @Module({ imports: [ @@ -36,6 +38,7 @@ import { ItemRateReadService } from 'src/modules/item-related/item-rate/data/ser controllers: [SeasonPeriodDataController, SeasonPeriodReadController], providers: [ SeasonPeriodHolidayHandler, + SeasonPeriodPriceUpdatedHandler, IndexSeasonPeriodManager, IndexSeasonPeriodeItemManager, @@ -43,6 +46,7 @@ import { ItemRateReadService } from 'src/modules/item-related/item-rate/data/ser CreateSeasonPeriodManager, DeleteSeasonPeriodManager, UpdateSeasonPeriodManager, + UpdateSeasonPeriodPriceManager, ActiveSeasonPeriodManager, ConfirmSeasonPeriodManager, InactiveSeasonPeriodManager,