From 14559290cf65e22c62e3e6dfddf814bfc0708636 Mon Sep 17 00:00:00 2001 From: ashar Date: Mon, 10 Jun 2024 15:14:09 +0700 Subject: [PATCH] feat(SPG-335) REST API CRUD Item Category --- src/app.module.ts | 16 ++- .../strings/constants/module.constants.ts | 1 + src/core/strings/constants/table.constants.ts | 5 +- .../migrations/1718005501425-item-category.ts | 25 ++++ .../configuration/constant/constant.module.ts | 10 ++ .../infrastructure/constant.controller.ts | 22 ++++ .../item-related/item-category/constants.ts | 6 + .../data/models/item-category.model.ts | 21 ++++ .../services/item-category-data.service.ts | 17 +++ .../item-category-change-status.event.ts | 5 + .../event/item-category-created.event.ts | 5 + .../event/item-category-deleted.event.ts | 5 + .../event/item-category-updated.event.ts | 5 + .../domain/entities/item-category.entity.ts | 7 ++ .../item-category-data.orchestrator.ts | 119 ++++++++++++++++++ .../managers/active-item-category.manager.ts | 45 +++++++ .../batch-active-item-category.manager.ts | 45 +++++++ .../batch-confirm-item-category.manager.ts | 45 +++++++ .../batch-delete-item-category.manager.ts | 45 +++++++ .../batch-inactive-item-category.manager.ts | 45 +++++++ .../managers/confirm-item-category.manager.ts | 45 +++++++ .../managers/create-item-category.manager.ts | 47 +++++++ .../managers/delete-item-category.manager.ts | 45 +++++++ .../inactive-item-category.manager.ts | 45 +++++++ .../managers/update-item-category.manager.ts | 49 ++++++++ .../item-related/item-category/index.ts | 0 .../infrastructure/dto/item-category.dto.ts | 26 ++++ .../item-category-data.controller.ts | 78 ++++++++++++ .../item-category/item-category.module.ts | 54 ++++++++ 29 files changed, 879 insertions(+), 4 deletions(-) create mode 100644 src/database/migrations/1718005501425-item-category.ts create mode 100644 src/modules/configuration/constant/constant.module.ts create mode 100644 src/modules/configuration/constant/infrastructure/constant.controller.ts create mode 100644 src/modules/item-related/item-category/constants.ts create mode 100644 src/modules/item-related/item-category/data/models/item-category.model.ts create mode 100644 src/modules/item-related/item-category/data/services/item-category-data.service.ts create mode 100644 src/modules/item-related/item-category/domain/entities/event/item-category-change-status.event.ts create mode 100644 src/modules/item-related/item-category/domain/entities/event/item-category-created.event.ts create mode 100644 src/modules/item-related/item-category/domain/entities/event/item-category-deleted.event.ts create mode 100644 src/modules/item-related/item-category/domain/entities/event/item-category-updated.event.ts create mode 100644 src/modules/item-related/item-category/domain/entities/item-category.entity.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/item-category-data.orchestrator.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/active-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/batch-active-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/batch-confirm-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/batch-delete-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/batch-inactive-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/confirm-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/create-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/delete-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/inactive-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/domain/usecases/managers/update-item-category.manager.ts create mode 100644 src/modules/item-related/item-category/index.ts create mode 100644 src/modules/item-related/item-category/infrastructure/dto/item-category.dto.ts create mode 100644 src/modules/item-related/item-category/infrastructure/item-category-data.controller.ts create mode 100644 src/modules/item-related/item-category/item-category.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index bc9c409..3bd999d 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -19,6 +19,9 @@ import { LogModel } from './modules/configuration/log/data/models/log.model'; import { ErrorLogModel } from './modules/configuration/log/data/models/error-log.model'; import { LogModule } from './modules/configuration/log/log.module'; import { TenantModule } from './modules/user-related/tenant/tenant.module'; +import { ItemCategoryModule } from './modules/item-related/item-category/item-category.module'; +import { ItemCategoryModel } from './modules/item-related/item-category/data/models/item-category.model'; +import { ConstantModule } from './modules/configuration/constant/constant.module'; @Module({ imports: [ @@ -34,18 +37,27 @@ import { TenantModule } from './modules/user-related/tenant/tenant.module'; username: process.env.DEFAULT_DB_USER, password: process.env.DEFAULT_DB_PASS, database: process.env.DEFAULT_DB_NAME, - entities: [...UserPrivilegeModels, UserModel, LogModel, ErrorLogModel], + entities: [ + ...UserPrivilegeModels, + UserModel, + LogModel, + ErrorLogModel, + ItemCategoryModel, + ], synchronize: false, }), + ConstantModule, CqrsModule, SessionModule, AuthModule, CouchModule, LogModule, - UserModule, TenantModule, + UserModule, UserPrivilegeModule, + + ItemCategoryModule, ], controllers: [], providers: [ diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index ca50656..5a334a6 100644 --- a/src/core/strings/constants/module.constants.ts +++ b/src/core/strings/constants/module.constants.ts @@ -1,4 +1,5 @@ export enum MODULE_NAME { + ITEM_CATEGORY = 'item-categories', TENANT = 'tenants', USER = 'users', USER_PRIVILEGE = 'user-privileges', diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 93420e3..7d28542 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -1,8 +1,9 @@ export enum TABLE_NAME { - LOG = 'logs', ERROR_LOG = 'log_errors', - USER = 'users', + ITEM_CATEGORY = 'item_categories', + LOG = 'logs', TENANT = 'tenants', + USER = 'users', USER_PRIVILEGE = 'user_privileges', USER_PRIVILEGE_CONFIGURATION = 'user_privilege_configurations', } diff --git a/src/database/migrations/1718005501425-item-category.ts b/src/database/migrations/1718005501425-item-category.ts new file mode 100644 index 0000000..6538b11 --- /dev/null +++ b/src/database/migrations/1718005501425-item-category.ts @@ -0,0 +1,25 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class ItemCategory1718005501425 implements MigrationInterface { + name = 'ItemCategory1718005501425'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."item_categories_status_enum" AS ENUM('active', 'cancel', 'confirmed', 'draft', 'expired', 'inactive', 'pending', 'refunded', 'rejected', 'settled', 'waiting')`, + ); + await queryRunner.query( + `CREATE TYPE "public"."item_categories_item_type_enum" AS ENUM('tiket masuk', 'wahana', 'bundling', 'free gift')`, + ); + await queryRunner.query( + `CREATE TABLE "item_categories" ("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, "status" "public"."item_categories_status_enum" NOT NULL DEFAULT 'draft', "name" character varying NOT NULL, "item_type" "public"."item_categories_item_type_enum" NOT NULL DEFAULT 'tiket masuk', CONSTRAINT "PK_db3359595abacbe15cf2f89c07e" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "item_categories"`); + await queryRunner.query( + `DROP TYPE "public"."item_categories_item_type_enum"`, + ); + await queryRunner.query(`DROP TYPE "public"."item_categories_status_enum"`); + } +} diff --git a/src/modules/configuration/constant/constant.module.ts b/src/modules/configuration/constant/constant.module.ts new file mode 100644 index 0000000..06e2c03 --- /dev/null +++ b/src/modules/configuration/constant/constant.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { ConstantController } from './infrastructure/constant.controller'; + +@Module({ + imports: [ConfigModule.forRoot()], + controllers: [ConstantController], + providers: [], +}) +export class ConstantModule {} diff --git a/src/modules/configuration/constant/infrastructure/constant.controller.ts b/src/modules/configuration/constant/infrastructure/constant.controller.ts new file mode 100644 index 0000000..e52f477 --- /dev/null +++ b/src/modules/configuration/constant/infrastructure/constant.controller.ts @@ -0,0 +1,22 @@ +import { Controller, Get } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { Public } from 'src/core/guards'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { ItemType } from 'src/modules/item-related/item-category/constants'; + +@ApiTags('configuration - constant') +@Controller('constant') +@Public(true) +export class ConstantController { + constructor() {} + + @Get('master-data-status') + async masterDataStatus(): Promise { + return [STATUS.ACTIVE, STATUS.DRAFT, STATUS.INACTIVE]; + } + + @Get('category-item-type') + async categoryType(): Promise { + return Object.values(ItemType); + } +} diff --git a/src/modules/item-related/item-category/constants.ts b/src/modules/item-related/item-category/constants.ts new file mode 100644 index 0000000..11e272d --- /dev/null +++ b/src/modules/item-related/item-category/constants.ts @@ -0,0 +1,6 @@ +export enum ItemType { + TIKET_MASUK = 'tiket masuk', + WAHANA = 'wahana', + BUNDLING = 'bundling', + FREE_GIFT = 'free gift', +} diff --git a/src/modules/item-related/item-category/data/models/item-category.model.ts b/src/modules/item-related/item-category/data/models/item-category.model.ts new file mode 100644 index 0000000..ce838b2 --- /dev/null +++ b/src/modules/item-related/item-category/data/models/item-category.model.ts @@ -0,0 +1,21 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { ItemCategoryEntity } from '../../domain/entities/item-category.entity'; +import { Column, Entity } from 'typeorm'; +import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; +import { ItemType } from '../../constants'; + +@Entity(TABLE_NAME.ITEM_CATEGORY) +export class ItemCategoryModel + extends BaseStatusModel + implements ItemCategoryEntity +{ + @Column('varchar', { name: 'name' }) + name: string; + + @Column('enum', { + name: 'item_type', + enum: ItemType, + default: ItemType.TIKET_MASUK, + }) + item_type: ItemType; +} diff --git a/src/modules/item-related/item-category/data/services/item-category-data.service.ts b/src/modules/item-related/item-category/data/services/item-category-data.service.ts new file mode 100644 index 0000000..23e576f --- /dev/null +++ b/src/modules/item-related/item-category/data/services/item-category-data.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { ItemCategoryEntity } from '../../domain/entities/item-category.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { ItemCategoryModel } from '../models/item-category.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class ItemCategoryDataService extends BaseDataService { + constructor( + @InjectRepository(ItemCategoryModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/item-related/item-category/domain/entities/event/item-category-change-status.event.ts b/src/modules/item-related/item-category/domain/entities/event/item-category-change-status.event.ts new file mode 100644 index 0000000..44c6d31 --- /dev/null +++ b/src/modules/item-related/item-category/domain/entities/event/item-category-change-status.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class ItemCategoryChangeStatusEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/item-related/item-category/domain/entities/event/item-category-created.event.ts b/src/modules/item-related/item-category/domain/entities/event/item-category-created.event.ts new file mode 100644 index 0000000..caa37ef --- /dev/null +++ b/src/modules/item-related/item-category/domain/entities/event/item-category-created.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class ItemCategoryCreatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/item-related/item-category/domain/entities/event/item-category-deleted.event.ts b/src/modules/item-related/item-category/domain/entities/event/item-category-deleted.event.ts new file mode 100644 index 0000000..5f15c85 --- /dev/null +++ b/src/modules/item-related/item-category/domain/entities/event/item-category-deleted.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class ItemCategoryDeletedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/item-related/item-category/domain/entities/event/item-category-updated.event.ts b/src/modules/item-related/item-category/domain/entities/event/item-category-updated.event.ts new file mode 100644 index 0000000..d297bb4 --- /dev/null +++ b/src/modules/item-related/item-category/domain/entities/event/item-category-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class ItemCategoryUpdatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/item-related/item-category/domain/entities/item-category.entity.ts b/src/modules/item-related/item-category/domain/entities/item-category.entity.ts new file mode 100644 index 0000000..5e1f78e --- /dev/null +++ b/src/modules/item-related/item-category/domain/entities/item-category.entity.ts @@ -0,0 +1,7 @@ +import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity'; +import { ItemType } from '../../constants'; + +export interface ItemCategoryEntity extends BaseStatusEntity { + name: string; + item_type: ItemType; +} diff --git a/src/modules/item-related/item-category/domain/usecases/item-category-data.orchestrator.ts b/src/modules/item-related/item-category/domain/usecases/item-category-data.orchestrator.ts new file mode 100644 index 0000000..7d356c0 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/item-category-data.orchestrator.ts @@ -0,0 +1,119 @@ +import { Injectable } from '@nestjs/common'; +import { CreateItemCategoryManager } from './managers/create-item-category.manager'; +import { ItemCategoryDataService } from '../../data/services/item-category-data.service'; +import { ItemCategoryEntity } from '../entities/item-category.entity'; +import { DeleteItemCategoryManager } from './managers/delete-item-category.manager'; +import { UpdateItemCategoryManager } from './managers/update-item-category.manager'; +import { BaseDataTransactionOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data-transaction.orchestrator'; +import { ActiveItemCategoryManager } from './managers/active-item-category.manager'; +import { InactiveItemCategoryManager } from './managers/inactive-item-category.manager'; +import { ConfirmItemCategoryManager } from './managers/confirm-item-category.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchConfirmItemCategoryManager } from './managers/batch-confirm-item-category.manager'; +import { BatchInactiveItemCategoryManager } from './managers/batch-inactive-item-category.manager'; +import { BatchActiveItemCategoryManager } from './managers/batch-active-item-category.manager'; +import { BatchDeleteItemCategoryManager } from './managers/batch-delete-item-category.manager'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class ItemCategoryDataOrchestrator extends BaseDataTransactionOrchestrator { + constructor( + private createManager: CreateItemCategoryManager, + private updateManager: UpdateItemCategoryManager, + private deleteManager: DeleteItemCategoryManager, + private activeManager: ActiveItemCategoryManager, + private confirmManager: ConfirmItemCategoryManager, + private inactiveManager: InactiveItemCategoryManager, + private batchDeleteManager: BatchDeleteItemCategoryManager, + private batchActiveManager: BatchActiveItemCategoryManager, + private batchConfirmManager: BatchConfirmItemCategoryManager, + private batchInactiveManager: BatchInactiveItemCategoryManager, + private serviceData: ItemCategoryDataService, + ) { + super(); + } + + async create(data): Promise { + this.createManager.setData(data); + this.createManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.createManager.execute(); + await this.createManager.generateConfig(); + return this.createManager.getResult(); + } + + async update(dataId, data): Promise { + this.updateManager.setData(dataId, data); + this.updateManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.updateManager.execute(); + return this.updateManager.getResult(); + } + + async delete(dataId): Promise { + this.deleteManager.setData(dataId); + this.deleteManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.deleteManager.execute(); + return this.deleteManager.getResult(); + } + + async batchDelete(dataIds: string[]): Promise { + this.batchDeleteManager.setData(dataIds); + this.batchDeleteManager.setService( + this.serviceData, + TABLE_NAME.ITEM_CATEGORY, + ); + await this.batchDeleteManager.execute(); + return this.batchDeleteManager.getResult(); + } + + async active(dataId): Promise { + this.activeManager.setData(dataId, STATUS.ACTIVE); + this.activeManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.activeManager.execute(); + return this.activeManager.getResult(); + } + + async batchActive(dataIds: string[]): Promise { + this.batchActiveManager.setData(dataIds, STATUS.ACTIVE); + this.batchActiveManager.setService( + this.serviceData, + TABLE_NAME.ITEM_CATEGORY, + ); + await this.batchActiveManager.execute(); + return this.batchActiveManager.getResult(); + } + + async confirm(dataId): Promise { + this.confirmManager.setData(dataId, STATUS.ACTIVE); + this.confirmManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.confirmManager.execute(); + return this.confirmManager.getResult(); + } + + async batchConfirm(dataIds: string[]): Promise { + this.batchConfirmManager.setData(dataIds, STATUS.ACTIVE); + this.batchConfirmManager.setService( + this.serviceData, + TABLE_NAME.ITEM_CATEGORY, + ); + await this.batchConfirmManager.execute(); + return this.batchConfirmManager.getResult(); + } + + async inactive(dataId): Promise { + this.inactiveManager.setData(dataId, STATUS.INACTIVE); + this.inactiveManager.setService(this.serviceData, TABLE_NAME.ITEM_CATEGORY); + await this.inactiveManager.execute(); + return this.inactiveManager.getResult(); + } + + async batchInactive(dataIds: string[]): Promise { + this.batchInactiveManager.setData(dataIds, STATUS.INACTIVE); + this.batchInactiveManager.setService( + this.serviceData, + TABLE_NAME.ITEM_CATEGORY, + ); + await this.batchInactiveManager.execute(); + return this.batchInactiveManager.getResult(); + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/active-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/active-item-category.manager.ts new file mode 100644 index 0000000..419700d --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/active-item-category.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; + +@Injectable() +export class ActiveItemCategoryManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/batch-active-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/batch-active-item-category.manager.ts new file mode 100644 index 0000000..9345303 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/batch-active-item-category.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchActiveItemCategoryManager extends BaseBatchUpdateStatusManager { + validateData(data: ItemCategoryEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/batch-confirm-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/batch-confirm-item-category.manager.ts new file mode 100644 index 0000000..10bcad0 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/batch-confirm-item-category.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchConfirmItemCategoryManager extends BaseBatchUpdateStatusManager { + validateData(data: ItemCategoryEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/batch-delete-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/batch-delete-item-category.manager.ts new file mode 100644 index 0000000..16d3af3 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/batch-delete-item-category.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchDeleteManager } from 'src/core/modules/domain/usecase/managers/base-batch-delete.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryDeletedEvent } from '../../entities/event/item-category-deleted.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchDeleteItemCategoryManager extends BaseBatchDeleteManager { + async beforeProcess(): Promise { + return; + } + + async validateData(data: ItemCategoryEntity): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryDeletedEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/batch-inactive-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/batch-inactive-item-category.manager.ts new file mode 100644 index 0000000..567748f --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/batch-inactive-item-category.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchInactiveItemCategoryManager extends BaseBatchUpdateStatusManager { + validateData(data: ItemCategoryEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/confirm-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/confirm-item-category.manager.ts new file mode 100644 index 0000000..52d6d7a --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/confirm-item-category.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; + +@Injectable() +export class ConfirmItemCategoryManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/create-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/create-item-category.manager.ts new file mode 100644 index 0000000..9007f3d --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/create-item-category.manager.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { ItemCategoryCreatedEvent } from '../../entities/event/item-category-created.event'; + +@Injectable() +export class CreateItemCategoryManager extends BaseCreateManager { + async beforeProcess(): Promise { + Object.assign(this.data, { + item_type: this.data.item_type.toLowerCase(), + }); + return; + } + + async afterProcess(): Promise { + return; + } + + async generateConfig(): Promise {} + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'name' }]; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryCreatedEvent, + data: this.data, + }, + ]; + } + + get entityTarget(): any { + return ItemCategoryModel; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/delete-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/delete-item-category.manager.ts new file mode 100644 index 0000000..d5dd970 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/delete-item-category.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDeleteManager } from 'src/core/modules/domain/usecase/managers/base-delete.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryDeletedEvent } from '../../entities/event/item-category-deleted.event'; + +@Injectable() +export class DeleteItemCategoryManager extends BaseDeleteManager { + getResult(): string { + return `Success`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryDeletedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/inactive-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/inactive-item-category.manager.ts new file mode 100644 index 0000000..623fff3 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/inactive-item-category.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryChangeStatusEvent } from '../../entities/event/item-category-change-status.event'; + +@Injectable() +export class InactiveItemCategoryManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success inactive data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/item-related/item-category/domain/usecases/managers/update-item-category.manager.ts b/src/modules/item-related/item-category/domain/usecases/managers/update-item-category.manager.ts new file mode 100644 index 0000000..b7cec18 --- /dev/null +++ b/src/modules/item-related/item-category/domain/usecases/managers/update-item-category.manager.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateManager } from 'src/core/modules/domain/usecase/managers/base-update.manager'; +import { ItemCategoryEntity } from '../../entities/item-category.entity'; +import { ItemCategoryModel } from '../../../data/models/item-category.model'; +import { ItemCategoryUpdatedEvent } from '../../entities/event/item-category-updated.event'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; + +@Injectable() +export class UpdateItemCategoryManager extends BaseUpdateManager { + async validateProcess(): Promise { + Object.assign(this.data, { + item_type: this.data.item_type.toLowerCase(), + }); + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'name' }]; + } + + get entityTarget(): any { + return ItemCategoryModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: ItemCategoryUpdatedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/item-related/item-category/index.ts b/src/modules/item-related/item-category/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/item-related/item-category/infrastructure/dto/item-category.dto.ts b/src/modules/item-related/item-category/infrastructure/dto/item-category.dto.ts new file mode 100644 index 0000000..a4c43c7 --- /dev/null +++ b/src/modules/item-related/item-category/infrastructure/dto/item-category.dto.ts @@ -0,0 +1,26 @@ +import { BaseStatusDto } from 'src/core/modules/infrastructure/dto/base-status.dto'; +import { ItemCategoryEntity } from '../../domain/entities/item-category.entity'; +import { IsEnum, IsString, ValidateIf } from 'class-validator'; +import { ItemType } from '../../constants'; +import { ApiProperty } from '@nestjs/swagger'; + +export class ItemCategoryDto + extends BaseStatusDto + implements ItemCategoryEntity +{ + @ApiProperty({ name: 'name', required: true, example: 'Bundling w Entrance' }) + @IsString() + name: string; + + @ApiProperty({ + type: 'string', + required: false, + description: `Select (${JSON.stringify(Object.values(ItemType))})`, + example: ItemType.BUNDLING, + }) + @ValidateIf((body) => body.order_type) + @IsEnum(ItemType, { + message: `must be a valid enum ${JSON.stringify(Object.values(ItemType))}`, + }) + item_type: ItemType; +} diff --git a/src/modules/item-related/item-category/infrastructure/item-category-data.controller.ts b/src/modules/item-related/item-category/infrastructure/item-category-data.controller.ts new file mode 100644 index 0000000..8bdb671 --- /dev/null +++ b/src/modules/item-related/item-category/infrastructure/item-category-data.controller.ts @@ -0,0 +1,78 @@ +import { + Body, + Controller, + Delete, + Param, + Patch, + Post, + Put, +} from '@nestjs/common'; +import { ItemCategoryDataOrchestrator } from '../domain/usecases/item-category-data.orchestrator'; +import { ItemCategoryDto } from './dto/item-category.dto'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { ItemCategoryEntity } from '../domain/entities/item-category.entity'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchIdsDto } from 'src/core/modules/infrastructure/dto/base-batch.dto'; +import { Public } from 'src/core/guards'; + +@ApiTags(`${MODULE_NAME.ITEM_CATEGORY.split('-').join(' ')} - data`) +@Controller(MODULE_NAME.ITEM_CATEGORY) +@Public(false) +@ApiBearerAuth('JWT') +export class ItemCategoryDataController { + constructor(private orchestrator: ItemCategoryDataOrchestrator) {} + + @Post() + async create(@Body() data: ItemCategoryDto): Promise { + return await this.orchestrator.create(data); + } + + @Put('/batch-delete') + async batchDeleted(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchDelete(body.ids); + } + + @Patch(':id/active') + async active(@Param('id') dataId: string): Promise { + return await this.orchestrator.active(dataId); + } + + @Put('/batch-active') + async batchActive(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchActive(body.ids); + } + + @Patch(':id/confirm') + async confirm(@Param('id') dataId: string): Promise { + return await this.orchestrator.confirm(dataId); + } + + @Put('/batch-confirm') + async batchConfirm(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchConfirm(body.ids); + } + + @Patch(':id/inactive') + async inactive(@Param('id') dataId: string): Promise { + return await this.orchestrator.inactive(dataId); + } + + @Put('/batch-inactive') + async batchInactive(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchInactive(body.ids); + } + + @Put(':id') + async update( + @Param('id') dataId: string, + @Body() data: ItemCategoryDto, + ): Promise { + return await this.orchestrator.update(dataId, data); + } + + @Delete(':id') + async delete(@Param('id') dataId: string): Promise { + return await this.orchestrator.delete(dataId); + } +} diff --git a/src/modules/item-related/item-category/item-category.module.ts b/src/modules/item-related/item-category/item-category.module.ts new file mode 100644 index 0000000..73b2320 --- /dev/null +++ b/src/modules/item-related/item-category/item-category.module.ts @@ -0,0 +1,54 @@ +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 { ItemCategoryDataService } from './data/services/item-category-data.service'; +import { ItemCategoryReadService } from './data/services/item-category-read.service'; +import { ItemCategoryReadController } from './infrastructure/item-category-read.controller'; +import { ItemCategoryReadOrchestrator } from './domain/usecases/item-category-read.orchestrator'; +import { ItemCategoryDataController } from './infrastructure/item-category-data.controller'; +import { ItemCategoryDataOrchestrator } from './domain/usecases/item-category-data.orchestrator'; +import { CreateItemCategoryManager } from './domain/usecases/managers/create-item-category.manager'; +import { CqrsModule } from '@nestjs/cqrs'; +import { IndexItemCategoryManager } from './domain/usecases/managers/index-item-category.manager'; +import { DeleteItemCategoryManager } from './domain/usecases/managers/delete-item-category.manager'; +import { UpdateItemCategoryManager } from './domain/usecases/managers/update-item-category.manager'; +import { ActiveItemCategoryManager } from './domain/usecases/managers/active-item-category.manager'; +import { ConfirmItemCategoryManager } from './domain/usecases/managers/confirm-item-category.manager'; +import { InactiveItemCategoryManager } from './domain/usecases/managers/inactive-item-category.manager'; +import { DetailItemCategoryManager } from './domain/usecases/managers/detail-item-category.manager'; +import { BatchDeleteItemCategoryManager } from './domain/usecases/managers/batch-delete-item-category.manager'; +import { BatchActiveItemCategoryManager } from './domain/usecases/managers/batch-active-item-category.manager'; +import { BatchConfirmItemCategoryManager } from './domain/usecases/managers/batch-confirm-item-category.manager'; +import { BatchInactiveItemCategoryManager } from './domain/usecases/managers/batch-inactive-item-category.manager'; +import { ItemCategoryModel } from './data/models/item-category.model'; + +@Module({ + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature([ItemCategoryModel], CONNECTION_NAME.DEFAULT), + CqrsModule, + ], + controllers: [ItemCategoryDataController, ItemCategoryReadController], + providers: [ + IndexItemCategoryManager, + DetailItemCategoryManager, + CreateItemCategoryManager, + DeleteItemCategoryManager, + UpdateItemCategoryManager, + ActiveItemCategoryManager, + ConfirmItemCategoryManager, + InactiveItemCategoryManager, + BatchDeleteItemCategoryManager, + BatchActiveItemCategoryManager, + BatchConfirmItemCategoryManager, + BatchInactiveItemCategoryManager, + + ItemCategoryDataService, + ItemCategoryReadService, + + ItemCategoryDataOrchestrator, + ItemCategoryReadOrchestrator, + ], +}) +export class ItemCategoryModule {}