diff --git a/src/database/migrations/1729653046392-add-transaction-id-to-queue-order.ts b/src/database/migrations/1729653046392-add-transaction-id-to-queue-order.ts new file mode 100644 index 0000000..c80ff83 --- /dev/null +++ b/src/database/migrations/1729653046392-add-transaction-id-to-queue-order.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTransactionIdToQueueOrder1729653046392 + implements MigrationInterface +{ + name = 'AddTransactionIdToQueueOrder1729653046392'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "queue_orders" ADD "transaction_id" character varying NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "queue_orders" DROP COLUMN "transaction_id"`, + ); + } +} diff --git a/src/modules/queue/data/models/queue.model.ts b/src/modules/queue/data/models/queue.model.ts index 5e65c73..5fbbebe 100644 --- a/src/modules/queue/data/models/queue.model.ts +++ b/src/modules/queue/data/models/queue.model.ts @@ -22,6 +22,9 @@ export class QueueOrderModel @Column('varchar', { nullable: true }) phone: string; + @Column('varchar', { nullable: false }) + transaction_id: string; + @OneToMany(() => QueueTicketModel, (model) => model.order, { cascade: true, onDelete: 'CASCADE', diff --git a/src/modules/queue/data/services/ticket.service.ts b/src/modules/queue/data/services/ticket.service.ts index cd408d0..3dd6894 100644 --- a/src/modules/queue/data/services/ticket.service.ts +++ b/src/modules/queue/data/services/ticket.service.ts @@ -22,4 +22,13 @@ export class TicketDataService extends BaseDataService { async createQueueOrder(order: QueueOrder): Promise { return await this.order.save(order); } + + async loginQueue(id: string): Promise { + return this.order.findOneOrFail({ + relations: ['tickets'], + where: { + transaction_id: id, + }, + }); + } } diff --git a/src/modules/queue/domain/entities/order.entity.ts b/src/modules/queue/domain/entities/order.entity.ts index 0ce59f2..32f843b 100644 --- a/src/modules/queue/domain/entities/order.entity.ts +++ b/src/modules/queue/domain/entities/order.entity.ts @@ -6,5 +6,6 @@ export interface QueueOrder extends BaseCoreEntity { customer: string; phone: string; date: number; + transaction_id: string; tickets: QueueTicket[]; } diff --git a/src/modules/queue/domain/queue.orchestrator.ts b/src/modules/queue/domain/queue.orchestrator.ts index 1126b28..f5d1624 100644 --- a/src/modules/queue/domain/queue.orchestrator.ts +++ b/src/modules/queue/domain/queue.orchestrator.ts @@ -1,6 +1,19 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { TicketDataService } from '../data/services/ticket.service'; +import { QueueOrder } from './entities/order.entity'; @Injectable() export class QueueOrchestrator { - // constructor() {} + constructor(private readonly dataService: TicketDataService) {} + + async loginCustomer(id: string): Promise { + try { + return await this.dataService.loginQueue(id); + } catch (error) { + throw new UnauthorizedException({ + message: 'Invoice tidak ditemukan', + error: 'INVOICE_NOT_FOUND', + }); + } + } } diff --git a/src/modules/queue/infrastructure/controllers/queue.controller.ts b/src/modules/queue/infrastructure/controllers/queue.controller.ts index d5ab232..b1932e1 100644 --- a/src/modules/queue/infrastructure/controllers/queue.controller.ts +++ b/src/modules/queue/infrastructure/controllers/queue.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, - Delete, + Get, Param, Patch, Post, @@ -14,11 +14,17 @@ 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'; @ApiTags(`Queue`) @Controller(`v1/${MODULE_NAME.QUEUE}`) -@Public(false) +@Public(true) @ApiBearerAuth('JWT') export class QueueController { constructor(private orchestrator: QueueOrchestrator) {} + + @Get('login/:id') + async loginCustomer(@Param('id') id: string): Promise { + return await this.orchestrator.loginCustomer(id); + } } diff --git a/src/modules/queue/infrastructure/handlers/transaction.handler.ts b/src/modules/queue/infrastructure/handlers/transaction.handler.ts index 9d168e9..365a7ca 100644 --- a/src/modules/queue/infrastructure/handlers/transaction.handler.ts +++ b/src/modules/queue/infrastructure/handlers/transaction.handler.ts @@ -30,13 +30,14 @@ export class QueueTransactionHandler relations: ['items'], }); - const { customer_name, customer_phone, invoice_code } = transaction; + const { id, customer_name, customer_phone, invoice_code } = transaction; const current_date = new Date().valueOf(); const customerOrder = { code: invoice_code, customer: customer_name, phone: customer_phone, date: current_date, + transaction_id: id, }; const items = transaction.items.map((item) => {