From 487f59ae938fe5f5181d41966f93ef54e3982adf Mon Sep 17 00:00:00 2001 From: shancheas Date: Mon, 28 Oct 2024 15:09:27 +0700 Subject: [PATCH] feat: add register queue --- .../managers/base-update-status.manager.ts | 10 +++-- src/core/strings/constants/base.constants.ts | 5 +++ .../queue/data/services/queue.service.ts | 11 +++++ .../queue/domain/queue-admin.orchestrator.ts | 13 +++++- .../queue/domain/queue.orchestrator.ts | 17 ++++++- .../domain/usecases/call-queue.manager.ts | 40 +++++++++++++++++ .../domain/usecases/register-queue.manager.ts | 44 +++++++++++++++++++ .../controllers/dto/register-queue.dto.ts | 19 ++++++++ .../controllers/queue-admin.controller.ts | 7 ++- .../controllers/queue.controller.ts | 9 +++- src/modules/queue/queue.module.ts | 7 ++- 11 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 src/modules/queue/domain/usecases/call-queue.manager.ts create mode 100644 src/modules/queue/domain/usecases/register-queue.manager.ts create mode 100644 src/modules/queue/infrastructure/controllers/dto/register-queue.dto.ts diff --git a/src/core/modules/domain/usecase/managers/base-update-status.manager.ts b/src/core/modules/domain/usecase/managers/base-update-status.manager.ts index 64516db..e585577 100644 --- a/src/core/modules/domain/usecase/managers/base-update-status.manager.ts +++ b/src/core/modules/domain/usecase/managers/base-update-status.manager.ts @@ -1,6 +1,10 @@ import { ValidateRelationHelper } from 'src/core/helpers/validation/validate-relation.helper'; import { BaseManager } from '../base.manager'; -import { OPERATION, STATUS } from 'src/core/strings/constants/base.constants'; +import { + OPERATION, + QUEUE_STATUS, + STATUS, +} from 'src/core/strings/constants/base.constants'; import * as _ from 'lodash'; import { RecordLog } from 'src/modules/configuration/log/domain/entities/log.event'; @@ -8,12 +12,12 @@ export abstract class BaseUpdateStatusManager extends BaseManager { protected dataId: string; protected result: Entity; protected oldData: Entity; - protected dataStatus: STATUS; + protected dataStatus: STATUS | QUEUE_STATUS; protected relations = []; protected duplicateColumn: string[]; abstract get entityTarget(): any; - setData(id: string, status: STATUS): void { + setData(id: string, status: STATUS | QUEUE_STATUS): void { /** * // TODO: Handle case confirm multiple tabs; * Pola id yang dikirim dirubah menjadi data_id___updated_at diff --git a/src/core/strings/constants/base.constants.ts b/src/core/strings/constants/base.constants.ts index 0e1f7d4..466d2dc 100644 --- a/src/core/strings/constants/base.constants.ts +++ b/src/core/strings/constants/base.constants.ts @@ -15,6 +15,11 @@ export enum STATUS { WAITING = 'waiting', } +export enum QUEUE_STATUS { + DONE = 'done', + CALLED = 'called', +} + export enum ORDER_TYPE { ASC = 'ASC', DESC = 'DESC', diff --git a/src/modules/queue/data/services/queue.service.ts b/src/modules/queue/data/services/queue.service.ts index 18ed187..128fa46 100644 --- a/src/modules/queue/data/services/queue.service.ts +++ b/src/modules/queue/data/services/queue.service.ts @@ -5,6 +5,7 @@ import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; import { Repository } from 'typeorm'; import { QueueModel } from '../models/queue.model'; import { BaseReadService } from 'src/core/modules/data/service/base-read.service'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; @Injectable() export class QueueDataService extends BaseReadService { @@ -15,3 +16,13 @@ export class QueueDataService extends BaseReadService { super(repo); } } + +@Injectable() +export class QueueService extends BaseDataService { + constructor( + @InjectRepository(QueueModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/queue/domain/queue-admin.orchestrator.ts b/src/modules/queue/domain/queue-admin.orchestrator.ts index ef9664a..b39480e 100644 --- a/src/modules/queue/domain/queue-admin.orchestrator.ts +++ b/src/modules/queue/domain/queue-admin.orchestrator.ts @@ -1,15 +1,19 @@ import { Injectable } from '@nestjs/common'; -import { QueueDataService } from '../data/services/queue.service'; +import { QueueDataService, QueueService } from '../data/services/queue.service'; import { IndexQueueManager } from './usecases/index-queue.manager'; import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; import { Queue } from './entities/queue.entity'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { CallQueueManager } from './usecases/call-queue.manager'; +import { QUEUE_STATUS } from 'src/core/strings/constants/base.constants'; @Injectable() export class QueueAdminOrchestrator { constructor( private readonly dataService: QueueDataService, + private readonly service: QueueService, private indexManager: IndexQueueManager, + private callManager: CallQueueManager, ) {} async index(params): Promise> { @@ -18,4 +22,11 @@ export class QueueAdminOrchestrator { await this.indexManager.execute(); return this.indexManager.getResult(); } + + async call(dataId): Promise { + this.callManager.setData(dataId, QUEUE_STATUS.CALLED); + this.callManager.setService(this.service, TABLE_NAME.QUEUE); + await this.callManager.execute(); + return this.callManager.getResult(); + } } diff --git a/src/modules/queue/domain/queue.orchestrator.ts b/src/modules/queue/domain/queue.orchestrator.ts index 2d40a93..eadaf3a 100644 --- a/src/modules/queue/domain/queue.orchestrator.ts +++ b/src/modules/queue/domain/queue.orchestrator.ts @@ -2,10 +2,18 @@ import { Injectable, UnauthorizedException } from '@nestjs/common'; import { TicketDataService } from '../data/services/ticket.service'; import { QueueOrder } from './entities/order.entity'; import { QueueItemModel } from '../data/models/queue.model'; +import { Queue } from './entities/queue.entity'; +import { QueueService } from '../data/services/queue.service'; +import { RegisterQueueManager } from './usecases/register-queue.manager'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; @Injectable() export class QueueOrchestrator { - constructor(private readonly dataService: TicketDataService) {} + constructor( + private readonly dataService: TicketDataService, + private readonly queueService: QueueService, + private readonly registerQueueManager: RegisterQueueManager, + ) {} async loginCustomer(id: string): Promise { try { @@ -18,6 +26,13 @@ export class QueueOrchestrator { } } + async create(data): Promise { + this.registerQueueManager.setData(data); + this.registerQueueManager.setService(this.queueService, TABLE_NAME.QUEUE); + await this.registerQueueManager.execute(); + return this.registerQueueManager.getResult(); + } + async queueTickets(order_id: string): Promise { const tickets = await this.dataService.queueTickets(order_id); return tickets.map((ticket) => { diff --git a/src/modules/queue/domain/usecases/call-queue.manager.ts b/src/modules/queue/domain/usecases/call-queue.manager.ts new file mode 100644 index 0000000..a49ca11 --- /dev/null +++ b/src/modules/queue/domain/usecases/call-queue.manager.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { Queue } from '../entities/queue.entity'; +import { QueueModel } from '../../data/models/queue.model'; + +@Injectable() +export class CallQueueManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success call Queue ${this.result.code}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + this.data.call_time = new Date().getTime(); + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return QueueModel; + } + + get eventTopics(): EventTopics[] { + return []; + } +} diff --git a/src/modules/queue/domain/usecases/register-queue.manager.ts b/src/modules/queue/domain/usecases/register-queue.manager.ts new file mode 100644 index 0000000..3a258b5 --- /dev/null +++ b/src/modules/queue/domain/usecases/register-queue.manager.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { Queue } from '../entities/queue.entity'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { QueueModel } from '../../data/models/queue.model'; +import { generateRandom } from 'src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper'; + +@Injectable() +export class RegisterQueueManager extends BaseCreateManager { + async beforeProcess(): Promise { + Object.assign(this.data, { + status: STATUS.WAITING, + time: new Date().getTime(), + vip: false, + code: `Q${generateRandom(4, true)}`, + }); + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return []; + } + + get eventTopics(): EventTopics[] { + return []; + } + + get entityTarget(): any { + return QueueModel; + } +} diff --git a/src/modules/queue/infrastructure/controllers/dto/register-queue.dto.ts b/src/modules/queue/infrastructure/controllers/dto/register-queue.dto.ts new file mode 100644 index 0000000..6ebc95e --- /dev/null +++ b/src/modules/queue/infrastructure/controllers/dto/register-queue.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator'; + +export class RegisterQueueDto { + @ApiProperty({ name: 'item_id', required: true }) + @IsString() + @IsNotEmpty() + item_id: string; + + @ApiProperty({ + type: Number, + required: true, + example: 1, + }) + @IsNumber() + @Min(1) + @IsNotEmpty() + qty: number; +} diff --git a/src/modules/queue/infrastructure/controllers/queue-admin.controller.ts b/src/modules/queue/infrastructure/controllers/queue-admin.controller.ts index 02d4b5b..eb5363e 100644 --- a/src/modules/queue/infrastructure/controllers/queue-admin.controller.ts +++ b/src/modules/queue/infrastructure/controllers/queue-admin.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Query } from '@nestjs/common'; +import { Controller, Get, Param, Post, Query } from '@nestjs/common'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; @@ -22,4 +22,9 @@ export class QueueAdminController { async index(@Query() params: QueueDto): Promise> { return await this.orchestrator.index(params); } + + @Post('queues/:id/call') + async call(@Param('id') id: string) { + return await this.orchestrator.call(id); + } } diff --git a/src/modules/queue/infrastructure/controllers/queue.controller.ts b/src/modules/queue/infrastructure/controllers/queue.controller.ts index 8eccd69..8019e1c 100644 --- a/src/modules/queue/infrastructure/controllers/queue.controller.ts +++ b/src/modules/queue/infrastructure/controllers/queue.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Param } from '@nestjs/common'; +import { Body, Controller, Get, Param, Post } from '@nestjs/common'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; @@ -6,6 +6,8 @@ import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Public } from 'src/core/guards'; import { QueueOrchestrator } from '../../domain/queue.orchestrator'; import { QueueOrder } from '../../domain/entities/order.entity'; +import { Queue } from '../../domain/entities/queue.entity'; +import { RegisterQueueDto } from './dto/register-queue.dto'; @ApiTags(`Queue`) @Controller(`v1/${MODULE_NAME.QUEUE}`) @@ -14,6 +16,11 @@ import { QueueOrder } from '../../domain/entities/order.entity'; export class QueueController { constructor(private orchestrator: QueueOrchestrator) {} + @Post('register') + async registerQueue(@Body() data: RegisterQueueDto): Promise { + return await this.orchestrator.create(data); + } + @Get('login/:id') async loginCustomer(@Param('id') id: string): Promise { return await this.orchestrator.loginCustomer(id); diff --git a/src/modules/queue/queue.module.ts b/src/modules/queue/queue.module.ts index 0f51e9e..ff62289 100644 --- a/src/modules/queue/queue.module.ts +++ b/src/modules/queue/queue.module.ts @@ -18,10 +18,12 @@ import { QueueTransactionHandler } from './infrastructure/handlers/transaction.h import { TransactionDataService } from '../transaction/transaction/data/services/transaction-data.service'; import { TransactionModel } from '../transaction/transaction/data/models/transaction.model'; import { TicketDataService } from './data/services/ticket.service'; -import { QueueDataService } from './data/services/queue.service'; +import { QueueDataService, QueueService } from './data/services/queue.service'; import { QueueAdminController } from './infrastructure/controllers/queue-admin.controller'; import { QueueAdminOrchestrator } from './domain/queue-admin.orchestrator'; import { IndexQueueManager } from './domain/usecases/index-queue.manager'; +import { CallQueueManager } from './domain/usecases/call-queue.manager'; +import { RegisterQueueManager } from './domain/usecases/register-queue.manager'; @Module({ imports: [ @@ -49,8 +51,11 @@ import { IndexQueueManager } from './domain/usecases/index-queue.manager'; TransactionDataService, TicketDataService, QueueDataService, + QueueService, IndexQueueManager, + CallQueueManager, + RegisterQueueManager, ], }) export class QueueModule {}