diff --git a/src/app.module.ts b/src/app.module.ts index 42e866c..01776e0 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -24,6 +24,8 @@ import { ItemCategoryModel } from './modules/item-related/item-category/data/mod import { ConstantModule } from './modules/configuration/constant/constant.module'; import { VipCategoryModule } from './modules/transaction/vip-category/vip-category.module'; import { VipCategoryModel } from './modules/transaction/vip-category/data/models/vip-category.model'; +import { VipCodeModule } from './modules/transaction/vip-code/vip-code.module'; +import { VipCodeModel } from './modules/transaction/vip-code/data/models/vip-code.model'; @Module({ imports: [ @@ -46,6 +48,7 @@ import { VipCategoryModel } from './modules/transaction/vip-category/data/models ErrorLogModel, ItemCategoryModel, VipCategoryModel, + VipCodeModel, ], synchronize: false, }), @@ -66,6 +69,7 @@ import { VipCategoryModel } from './modules/transaction/vip-category/data/models // transaction VipCategoryModule, + VipCodeModule, ], controllers: [], providers: [ diff --git a/src/core/modules/domain/usecase/managers/base-custom.manager.ts b/src/core/modules/domain/usecase/managers/base-custom.manager.ts index 20416df..2fd87d7 100644 --- a/src/core/modules/domain/usecase/managers/base-custom.manager.ts +++ b/src/core/modules/domain/usecase/managers/base-custom.manager.ts @@ -2,7 +2,7 @@ import { validateRelations } from 'src/core/strings/constants/interface.constant import { BaseManager } from '../base.manager'; export abstract class BaseCustomManager extends BaseManager { - protected result: Entity; + protected result: any; abstract get entityTarget(): any; setData(entity: Entity): void { diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index 1f0a277..6f9ffac 100644 --- a/src/core/strings/constants/module.constants.ts +++ b/src/core/strings/constants/module.constants.ts @@ -5,4 +5,5 @@ export enum MODULE_NAME { USER_PRIVILEGE = 'user-privileges', USER_PRIVILEGE_CONFIGURATION = 'user-privilege-configurations', VIP_CATEGORY = 'vip-categories', + VIP_CODE = 'vip-codes', } diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 537f970..87faba8 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -7,4 +7,5 @@ export enum TABLE_NAME { USER_PRIVILEGE = 'user_privileges', USER_PRIVILEGE_CONFIGURATION = 'user_privilege_configurations', VIP_CATEGORY = 'vip_categories', + VIP_CODE = 'vip_codes', } diff --git a/src/database/migrations/1718076296496-vip-code.ts b/src/database/migrations/1718076296496-vip-code.ts new file mode 100644 index 0000000..3262833 --- /dev/null +++ b/src/database/migrations/1718076296496-vip-code.ts @@ -0,0 +1,21 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class VipCode1718076296496 implements MigrationInterface { + name = 'VipCode1718076296496'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "vip_codes" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "creator_id" character varying(36), "creator_name" character varying(125), "editor_id" character varying(36), "editor_name" character varying(125), "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "code" character varying NOT NULL, "discount" integer NOT NULL, "vip_category_id" uuid NOT NULL, CONSTRAINT "PK_423f82dba17315d29f2c21e0fd6" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `ALTER TABLE "vip_codes" ADD CONSTRAINT "FK_67e2cd45678c3f7ea713e96ec5e" FOREIGN KEY ("vip_category_id") REFERENCES "vip_categories"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "vip_codes" DROP CONSTRAINT "FK_67e2cd45678c3f7ea713e96ec5e"`, + ); + await queryRunner.query(`DROP TABLE "vip_codes"`); + } +} diff --git a/src/modules/transaction/vip-category/data/models/vip-category.model.ts b/src/modules/transaction/vip-category/data/models/vip-category.model.ts index 3fbff59..2d9e5f5 100644 --- a/src/modules/transaction/vip-category/data/models/vip-category.model.ts +++ b/src/modules/transaction/vip-category/data/models/vip-category.model.ts @@ -1,7 +1,8 @@ import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { VipCategoryEntity } from '../../domain/entities/vip-category.entity'; -import { Column, Entity } from 'typeorm'; +import { Column, Entity, OneToMany } from 'typeorm'; import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; +import { VipCodeModel } from 'src/modules/transaction/vip-code/data/models/vip-code.model'; @Entity(TABLE_NAME.VIP_CATEGORY) export class VipCategoryModel @@ -10,4 +11,11 @@ export class VipCategoryModel { @Column('varchar', { name: 'name' }) name: string; + + @OneToMany(() => VipCodeModel, (model) => model.vip_category, { + cascade: true, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + vip_codes: VipCodeModel[]; } diff --git a/src/modules/transaction/vip-code/constants.ts b/src/modules/transaction/vip-code/constants.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/transaction/vip-code/data/models/vip-code.model.ts b/src/modules/transaction/vip-code/data/models/vip-code.model.ts new file mode 100644 index 0000000..1b22d91 --- /dev/null +++ b/src/modules/transaction/vip-code/data/models/vip-code.model.ts @@ -0,0 +1,26 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { VipCodeEntity } from '../../domain/entities/vip-code.entity'; +import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm'; +import { BaseModel } from 'src/core/modules/data/model/base.model'; +import { VipCategoryModel } from 'src/modules/transaction/vip-category/data/models/vip-category.model'; + +@Entity(TABLE_NAME.VIP_CODE) +export class VipCodeModel + extends BaseModel + implements VipCodeEntity +{ + @Column('varchar', { name: 'code' }) + code: string; + + @Column('integer', { name: 'discount' }) + discount: number; + + @Column('varchar', { name: 'vip_category_id' }) + vip_category_id: string; + @ManyToOne(() => VipCategoryModel, (model) => model.vip_codes, { + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + @JoinColumn({ name: 'vip_category_id' }) + vip_category: VipCategoryModel; +} diff --git a/src/modules/transaction/vip-code/data/services/vip-code-data.service.ts b/src/modules/transaction/vip-code/data/services/vip-code-data.service.ts new file mode 100644 index 0000000..c19f750 --- /dev/null +++ b/src/modules/transaction/vip-code/data/services/vip-code-data.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { VipCodeEntity } from '../../domain/entities/vip-code.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { VipCodeModel } from '../models/vip-code.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class VipCodeDataService extends BaseDataService { + constructor( + @InjectRepository(VipCodeModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/transaction/vip-code/data/services/vip-code-read.service.ts b/src/modules/transaction/vip-code/data/services/vip-code-read.service.ts new file mode 100644 index 0000000..961b26f --- /dev/null +++ b/src/modules/transaction/vip-code/data/services/vip-code-read.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { VipCodeEntity } from '../../domain/entities/vip-code.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { VipCodeModel } from '../models/vip-code.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; +import { BaseReadService } from 'src/core/modules/data/service/base-read.service'; + +@Injectable() +export class VipCodeReadService extends BaseReadService { + constructor( + @InjectRepository(VipCodeModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/transaction/vip-code/domain/entities/event/vip-code-created.event.ts b/src/modules/transaction/vip-code/domain/entities/event/vip-code-created.event.ts new file mode 100644 index 0000000..a72cdee --- /dev/null +++ b/src/modules/transaction/vip-code/domain/entities/event/vip-code-created.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class VipCodeCreatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/vip-code/domain/entities/event/vip-code-deleted.event.ts b/src/modules/transaction/vip-code/domain/entities/event/vip-code-deleted.event.ts new file mode 100644 index 0000000..89e1364 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/entities/event/vip-code-deleted.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class VipCodeDeletedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/vip-code/domain/entities/event/vip-code-updated.event.ts b/src/modules/transaction/vip-code/domain/entities/event/vip-code-updated.event.ts new file mode 100644 index 0000000..b3d08d6 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/entities/event/vip-code-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class VipCodeUpdatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/vip-code/domain/entities/filter-vip-code.entity.ts b/src/modules/transaction/vip-code/domain/entities/filter-vip-code.entity.ts new file mode 100644 index 0000000..e971665 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/entities/filter-vip-code.entity.ts @@ -0,0 +1,3 @@ +import { BaseFilterEntity } from 'src/core/modules/domain/entities/base-filter.entity'; + +export interface FilterVipCodeEntity extends BaseFilterEntity {} diff --git a/src/modules/transaction/vip-code/domain/entities/vip-code.entity.ts b/src/modules/transaction/vip-code/domain/entities/vip-code.entity.ts new file mode 100644 index 0000000..a713c58 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/entities/vip-code.entity.ts @@ -0,0 +1,6 @@ +import { BaseEntity } from 'src/core/modules/domain/entities/base.entity'; + +export interface VipCodeEntity extends BaseEntity { + code: string; + discount: number; +} diff --git a/src/modules/transaction/vip-code/domain/usecases/managers/create-vip-code.manager.ts b/src/modules/transaction/vip-code/domain/usecases/managers/create-vip-code.manager.ts new file mode 100644 index 0000000..947e65c --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/managers/create-vip-code.manager.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { VipCodeEntity } from '../../entities/vip-code.entity'; +import { VipCodeModel } from '../../../data/models/vip-code.model'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { VipCodeCreatedEvent } from '../../entities/event/vip-code-created.event'; + +@Injectable() +export class CreateVipCodeManager extends BaseCreateManager { + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [ + { + column: 'code', + }, + ]; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: VipCodeCreatedEvent, + data: this.data, + }, + ]; + } + + get entityTarget(): any { + return VipCodeModel; + } +} diff --git a/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts b/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts new file mode 100644 index 0000000..071ae18 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts @@ -0,0 +1,62 @@ +import { BaseCustomManager } from 'src/core/modules/domain/usecase/managers/base-custom.manager'; +import { Injectable } from '@nestjs/common'; +import { VipCodeEntity } from '../../entities/vip-code.entity'; +import { EventTopics } from 'src/core/strings/constants/interface.constants'; + +@Injectable() +export class GenerateVipCodeManager extends BaseCustomManager { + validateProcess(): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + process(): Promise { + const date = new Date(); + + // get month dan year (dua digit) + const month = + date.getMonth() < 10 + ? `0${date.getMonth() + 1}` + : (date.getMonth() + 1).toString(); + const year = date.getFullYear().toString().slice(-2); + + const char = this.generateRandom(1); + const number = this.generateRandom(2, true); + + this.result = `${month}${year}${char}${number}`; + return; + } + + afterProcess(): Promise { + return; + } + + get entityTarget(): any { + return; + } + + getResult() { + return this.result; + } + + get eventTopics(): EventTopics[] { + return []; + } + + generateRandom(length: number, is_number?: boolean): string { + let result = ''; + let base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + if (is_number) base = '123456789'; + + let counter = 0; + while (counter < length) { + result += base.charAt(Math.floor(Math.random() * base.length)); + counter += 1; + } + + return result; + } +} diff --git a/src/modules/transaction/vip-code/domain/usecases/managers/index-vip-code.manager.ts b/src/modules/transaction/vip-code/domain/usecases/managers/index-vip-code.manager.ts new file mode 100644 index 0000000..14fb3d2 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/managers/index-vip-code.manager.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@nestjs/common'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { VipCodeEntity } from '../../entities/vip-code.entity'; +import { SelectQueryBuilder } from 'typeorm'; +import { + Param, + RelationParam, +} from 'src/core/modules/domain/entities/base-filter.entity'; + +@Injectable() +export class IndexVipCodeManager extends BaseIndexManager { + async prepareData(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get relations(): RelationParam { + return { + // relation only join (for query purpose) + joinRelations: [], + + // relation join and select (relasi yang ingin ditampilkan), + selectRelations: [], + + // relation yang hanya ingin dihitung (akan return number) + countRelations: [], + }; + } + + get selects(): string[] { + return []; + } + + get specificFilter(): Param[] { + return [ + { + cols: `${this.tableName}.name`, + data: this.filterParam.names, + }, + ]; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + return queryBuilder; + } +} diff --git a/src/modules/transaction/vip-code/domain/usecases/vip-code-data.orchestrator.ts b/src/modules/transaction/vip-code/domain/usecases/vip-code-data.orchestrator.ts new file mode 100644 index 0000000..c04977e --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/vip-code-data.orchestrator.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { CreateVipCodeManager } from './managers/create-vip-code.manager'; +import { VipCodeDataService } from '../../data/services/vip-code-data.service'; +import { VipCodeEntity } from '../entities/vip-code.entity'; +import { BaseDataOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data.orchestrator'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { GenerateVipCodeManager } from './managers/geneate-vip-code.manager'; +import { VipCodeModel } from '../../data/models/vip-code.model'; + +@Injectable() +export class VipCodeDataOrchestrator extends BaseDataOrchestrator { + constructor( + private createManager: CreateVipCodeManager, + private generateCodeManager: GenerateVipCodeManager, + private serviceData: VipCodeDataService, + ) { + super(); + } + + update(dataId: string, data: VipCodeEntity): Promise { + throw new Error('Method not implemented.'); + } + delete(dataId: string): Promise { + throw new Error('Method not implemented.'); + } + batchDelete(dataIds: string[]): Promise { + throw new Error('Method not implemented.'); + } + + async create(data): Promise { + this.createManager.setData(data); + this.createManager.setService(this.serviceData, TABLE_NAME.VIP_CODE); + await this.createManager.execute(); + return this.createManager.getResult(); + } + + async generateCode(): Promise { + const data = new VipCodeModel(); + this.generateCodeManager.setData(data); + this.generateCodeManager.setService(this.serviceData, TABLE_NAME.VIP_CODE); + await this.generateCodeManager.execute(); + return this.generateCodeManager.getResult(); + } +} diff --git a/src/modules/transaction/vip-code/domain/usecases/vip-code-read.orchestrator.ts b/src/modules/transaction/vip-code/domain/usecases/vip-code-read.orchestrator.ts new file mode 100644 index 0000000..257e17a --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/vip-code-read.orchestrator.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@nestjs/common'; +import { IndexVipCodeManager } from './managers/index-vip-code.manager'; +import { VipCodeReadService } from '../../data/services/vip-code-read.service'; +import { VipCodeEntity } from '../entities/vip-code.entity'; +import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; +import { BaseReadOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-read.orchestrator'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class VipCodeReadOrchestrator extends BaseReadOrchestrator { + constructor( + private indexManager: IndexVipCodeManager, + private serviceData: VipCodeReadService, + ) { + super(); + } + + async index(params): Promise> { + this.indexManager.setFilterParam(params); + this.indexManager.setService(this.serviceData, TABLE_NAME.VIP_CODE); + await this.indexManager.execute(); + return this.indexManager.getResult(); + } + + async detail(dataId: string): Promise { + return; + } +} diff --git a/src/modules/transaction/vip-code/index.ts b/src/modules/transaction/vip-code/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/transaction/vip-code/infrastructure/dto/filter-vip-code.dto.ts b/src/modules/transaction/vip-code/infrastructure/dto/filter-vip-code.dto.ts new file mode 100644 index 0000000..0d19dcf --- /dev/null +++ b/src/modules/transaction/vip-code/infrastructure/dto/filter-vip-code.dto.ts @@ -0,0 +1,6 @@ +import { BaseFilterDto } from 'src/core/modules/infrastructure/dto/base-filter.dto'; +import { FilterVipCodeEntity } from '../../domain/entities/filter-vip-code.entity'; + +export class FilterVipCodeDto + extends BaseFilterDto + implements FilterVipCodeEntity {} diff --git a/src/modules/transaction/vip-code/infrastructure/dto/vip-code.dto.ts b/src/modules/transaction/vip-code/infrastructure/dto/vip-code.dto.ts new file mode 100644 index 0000000..3b1f0fe --- /dev/null +++ b/src/modules/transaction/vip-code/infrastructure/dto/vip-code.dto.ts @@ -0,0 +1,35 @@ +import { BaseDto } from 'src/core/modules/infrastructure/dto/base.dto'; +import { VipCodeEntity } from '../../domain/entities/vip-code.entity'; +import { IsNumber, IsObject, IsString } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; + +export class VipCodeDto extends BaseDto implements VipCodeEntity { + @ApiProperty({ + name: 'code', + type: String, + required: true, + example: '0824A12', + }) + @IsString() + code: string; + + @ApiProperty({ + name: 'discount', + type: Number, + required: true, + example: 85, + }) + @IsNumber() + discount: number; + + @ApiProperty({ + name: 'vip_category', + type: String, + required: true, + example: { + id: 'uuid', + }, + }) + @IsObject() + vip_category: VipCodeEntity; +} diff --git a/src/modules/transaction/vip-code/infrastructure/vip-code-data.controller.ts b/src/modules/transaction/vip-code/infrastructure/vip-code-data.controller.ts new file mode 100644 index 0000000..4a282fe --- /dev/null +++ b/src/modules/transaction/vip-code/infrastructure/vip-code-data.controller.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { VipCodeDataOrchestrator } from '../domain/usecases/vip-code-data.orchestrator'; +import { VipCodeDto } from './dto/vip-code.dto'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { VipCodeEntity } from '../domain/entities/vip-code.entity'; +import { Public } from 'src/core/guards'; + +@ApiTags(`${MODULE_NAME.VIP_CODE.split('-').join(' ')} - data`) +@Controller(MODULE_NAME.VIP_CODE) +@Public(false) +@ApiBearerAuth('JWT') +export class VipCodeDataController { + constructor(private orchestrator: VipCodeDataOrchestrator) {} + + @Post() + async create(@Body() data: VipCodeDto): Promise { + return await this.orchestrator.create(data); + } + + @Post('generate-code') + async generateCOde(): Promise { + return await this.orchestrator.generateCode(); + } + + // @Put('/batch-delete') + // async batchDeleted(@Body() body: BatchIdsDto): Promise { + // return await this.orchestrator.batchDelete(body.ids); + // } + + // @Delete(':id') + // async delete(@Param('id') dataId: string): Promise { + // return await this.orchestrator.delete(dataId); + // } +} diff --git a/src/modules/transaction/vip-code/infrastructure/vip-code-read.controller.ts b/src/modules/transaction/vip-code/infrastructure/vip-code-read.controller.ts new file mode 100644 index 0000000..ab78e82 --- /dev/null +++ b/src/modules/transaction/vip-code/infrastructure/vip-code-read.controller.ts @@ -0,0 +1,25 @@ +import { Controller, Get, Query } from '@nestjs/common'; +import { FilterVipCodeDto } from './dto/filter-vip-code.dto'; +import { Pagination } from 'src/core/response'; +import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; +import { VipCodeEntity } from '../domain/entities/vip-code.entity'; +import { VipCodeReadOrchestrator } from '../domain/usecases/vip-code-read.orchestrator'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { Public } from 'src/core/guards'; + +@ApiTags(`${MODULE_NAME.VIP_CODE.split('-').join(' ')} - read`) +@Controller(MODULE_NAME.VIP_CODE) +@Public(false) +@ApiBearerAuth('JWT') +export class VipCodeReadController { + constructor(private orchestrator: VipCodeReadOrchestrator) {} + + @Get() + @Pagination() + async index( + @Query() params: FilterVipCodeDto, + ): Promise> { + return await this.orchestrator.index(params); + } +} diff --git a/src/modules/transaction/vip-code/vip-code.module.ts b/src/modules/transaction/vip-code/vip-code.module.ts new file mode 100644 index 0000000..68f7dd1 --- /dev/null +++ b/src/modules/transaction/vip-code/vip-code.module.ts @@ -0,0 +1,36 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { VipCodeDataService } from './data/services/vip-code-data.service'; +import { VipCodeReadService } from './data/services/vip-code-read.service'; +import { VipCodeReadController } from './infrastructure/vip-code-read.controller'; +import { VipCodeReadOrchestrator } from './domain/usecases/vip-code-read.orchestrator'; +import { VipCodeDataController } from './infrastructure/vip-code-data.controller'; +import { VipCodeDataOrchestrator } from './domain/usecases/vip-code-data.orchestrator'; +import { CreateVipCodeManager } from './domain/usecases/managers/create-vip-code.manager'; +import { CqrsModule } from '@nestjs/cqrs'; +import { IndexVipCodeManager } from './domain/usecases/managers/index-vip-code.manager'; +import { VipCodeModel } from './data/models/vip-code.model'; +import { GenerateVipCodeManager } from './domain/usecases/managers/geneate-vip-code.manager'; + +@Module({ + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature([VipCodeModel], CONNECTION_NAME.DEFAULT), + CqrsModule, + ], + controllers: [VipCodeDataController, VipCodeReadController], + providers: [ + IndexVipCodeManager, + CreateVipCodeManager, + GenerateVipCodeManager, + + VipCodeDataService, + VipCodeReadService, + + VipCodeDataOrchestrator, + VipCodeReadOrchestrator, + ], +}) +export class VipCodeModule {}