From 7a3d4b943202013359c0c709ce970c2f09a9f689 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah Date: Mon, 15 Jul 2024 15:02:17 +0700 Subject: [PATCH] feat(SPG-433) REST API CUD TnC --- src/app.module.ts | 5 +- .../strings/constants/module.constants.ts | 2 + src/core/strings/constants/table.constants.ts | 2 + .../1721029248635-term-condition.ts | 19 +++ .../term-condition/constants.ts | 0 .../data/models/term-condition.model.ts | 16 +++ .../services/term-condition-data.service.ts | 17 +++ .../term-condition-change-status.event.ts | 5 + .../event/term-condition-created.event.ts | 5 + .../event/term-condition-deleted.event.ts | 5 + .../event/term-condition-updated.event.ts | 5 + .../domain/entities/term-condition.entity.ts | 6 + .../managers/active-term-condition.manager.ts | 45 +++++++ .../batch-active-term-condition.manager.ts | 45 +++++++ .../batch-confirm-term-condition.manager.ts | 45 +++++++ .../batch-delete-term-condition.manager.ts | 45 +++++++ .../batch-inactive-term-condition.manager.ts | 45 +++++++ .../confirm-term-condition.manager.ts | 45 +++++++ .../managers/create-term-condition.manager.ts | 42 ++++++ .../managers/delete-term-condition.manager.ts | 45 +++++++ .../inactive-term-condition.manager.ts | 45 +++++++ .../managers/update-term-condition.manager.ts | 46 +++++++ .../term-condition-data.orchestrator.ts | 121 ++++++++++++++++++ .../web-information/term-condition/index.ts | 0 .../infrastructure/dto/term-condition.dto.ts | 24 ++++ .../term-condition-data.controller.ts | 78 +++++++++++ .../term-condition/term-condition.module.ts | 54 ++++++++ 27 files changed, 811 insertions(+), 1 deletion(-) create mode 100644 src/database/migrations/1721029248635-term-condition.ts create mode 100644 src/modules/web-information/term-condition/constants.ts create mode 100644 src/modules/web-information/term-condition/data/models/term-condition.model.ts create mode 100644 src/modules/web-information/term-condition/data/services/term-condition-data.service.ts create mode 100644 src/modules/web-information/term-condition/domain/entities/event/term-condition-change-status.event.ts create mode 100644 src/modules/web-information/term-condition/domain/entities/event/term-condition-created.event.ts create mode 100644 src/modules/web-information/term-condition/domain/entities/event/term-condition-deleted.event.ts create mode 100644 src/modules/web-information/term-condition/domain/entities/event/term-condition-updated.event.ts create mode 100644 src/modules/web-information/term-condition/domain/entities/term-condition.entity.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/active-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/batch-active-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/batch-confirm-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/batch-delete-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/batch-inactive-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/confirm-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/create-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/delete-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/inactive-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/managers/update-term-condition.manager.ts create mode 100644 src/modules/web-information/term-condition/domain/usecases/term-condition-data.orchestrator.ts create mode 100644 src/modules/web-information/term-condition/index.ts create mode 100644 src/modules/web-information/term-condition/infrastructure/dto/term-condition.dto.ts create mode 100644 src/modules/web-information/term-condition/infrastructure/term-condition-data.controller.ts create mode 100644 src/modules/web-information/term-condition/term-condition.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index 42040cb..bf7129b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -47,7 +47,6 @@ import { TransactionModel } from './modules/transaction/transaction/data/models/ import { TransactionItemModel } from './modules/transaction/transaction/data/models/transaction-item.model'; import { TransactionTaxModel } from './modules/transaction/transaction/data/models/transaction-tax.model'; import { ReconciliationModule } from './modules/transaction/reconciliation/reconciliation.module'; - import { ReportModule } from './modules/reports/report/report.module'; import { ReportBookmarkModule } from './modules/reports/report-bookmark/report-bookmark.module'; import { ReportExportModule } from './modules/reports/report-export/report-export.module'; @@ -60,6 +59,8 @@ import { RefundModel } from './modules/transaction/refund/data/models/refund.mod import { RefundItemModel } from './modules/transaction/refund/data/models/refund-item.model'; import { GateModule } from './modules/web-information/gate/gate.module'; import { GateModel } from './modules/web-information/gate/data/models/gate.model'; +import { TermConditionModule } from './modules/web-information/term-condition/term-condition.module'; +import { TermConditionModel } from './modules/web-information/term-condition/data/models/term-condition.model'; @Module({ imports: [ @@ -90,6 +91,7 @@ import { GateModel } from './modules/web-information/gate/data/models/gate.model SeasonPeriodModel, SeasonTypeModel, TaxModel, + TermConditionModel, TransactionModel, TransactionItemModel, TransactionTaxModel, @@ -140,6 +142,7 @@ import { GateModel } from './modules/web-information/gate/data/models/gate.model // web information GateModule, + TermConditionModule, // report ReportModule, diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index 9cfef7e..6549a5a 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 { + FAQ = 'faqs', GATE = 'gates', ITEM = 'items', ITEM_CATEGORY = 'item-categories', @@ -9,6 +10,7 @@ export enum MODULE_NAME { SEASON_TYPE = 'season-types', SEASON_PERIOD = 'season-periods', TAX = 'taxes', + TERM_CONDITION = 'term_conditions', TENANT = 'tenants', TRANSACTION = 'transactions', USER = 'users', diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 5a8679e..862d2d5 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -1,5 +1,6 @@ export enum TABLE_NAME { ERROR_LOG = 'log_errors', + FAQ = 'faqs', ITEM = 'items', ITEM_CATEGORY = 'item_categories', ITEM_RATE = 'item_rates', @@ -12,6 +13,7 @@ export enum TABLE_NAME { SEASON_TYPE = 'season_types', SEASON_PERIOD = 'season_periods', TAX = 'taxes', + TERM_CONDITION = 'term_conditions', TENANT = 'tenants', TRANSACTION = 'transactions', TRANSACTION_ITEM = 'transaction_items', diff --git a/src/database/migrations/1721029248635-term-condition.ts b/src/database/migrations/1721029248635-term-condition.ts new file mode 100644 index 0000000..2f4ebf4 --- /dev/null +++ b/src/database/migrations/1721029248635-term-condition.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class TermCondition1721029248635 implements MigrationInterface { + name = 'TermCondition1721029248635'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."term_conditions_status_enum" AS ENUM('active', 'cancel', 'confirmed', 'draft', 'expired', 'inactive', 'partial refund', 'pending', 'proses refund', 'refunded', 'rejected', 'settled', 'waiting')`, + ); + await queryRunner.query( + `CREATE TABLE "term_conditions" ("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"."term_conditions_status_enum" NOT NULL DEFAULT 'draft', "title" character varying, "description" text, CONSTRAINT "PK_fc92769e487820f24ed68337feb" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "term_conditions"`); + await queryRunner.query(`DROP TYPE "public"."term_conditions_status_enum"`); + } +} diff --git a/src/modules/web-information/term-condition/constants.ts b/src/modules/web-information/term-condition/constants.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/web-information/term-condition/data/models/term-condition.model.ts b/src/modules/web-information/term-condition/data/models/term-condition.model.ts new file mode 100644 index 0000000..08a3ade --- /dev/null +++ b/src/modules/web-information/term-condition/data/models/term-condition.model.ts @@ -0,0 +1,16 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { TermConditionEntity } from '../../domain/entities/term-condition.entity'; +import { Column, Entity } from 'typeorm'; +import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; + +@Entity(TABLE_NAME.TERM_CONDITION) +export class TermConditionModel + extends BaseStatusModel + implements TermConditionEntity +{ + @Column('varchar', { name: 'title', nullable: true }) + title: string; + + @Column('text', { name: 'description', nullable: true }) + description: string; +} diff --git a/src/modules/web-information/term-condition/data/services/term-condition-data.service.ts b/src/modules/web-information/term-condition/data/services/term-condition-data.service.ts new file mode 100644 index 0000000..832e472 --- /dev/null +++ b/src/modules/web-information/term-condition/data/services/term-condition-data.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { TermConditionEntity } from '../../domain/entities/term-condition.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TermConditionModel } from '../models/term-condition.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TermConditionDataService extends BaseDataService { + constructor( + @InjectRepository(TermConditionModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/web-information/term-condition/domain/entities/event/term-condition-change-status.event.ts b/src/modules/web-information/term-condition/domain/entities/event/term-condition-change-status.event.ts new file mode 100644 index 0000000..80e32e1 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/entities/event/term-condition-change-status.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TermConditionChangeStatusEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/web-information/term-condition/domain/entities/event/term-condition-created.event.ts b/src/modules/web-information/term-condition/domain/entities/event/term-condition-created.event.ts new file mode 100644 index 0000000..0defc89 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/entities/event/term-condition-created.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TermConditionCreatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/web-information/term-condition/domain/entities/event/term-condition-deleted.event.ts b/src/modules/web-information/term-condition/domain/entities/event/term-condition-deleted.event.ts new file mode 100644 index 0000000..d2a108a --- /dev/null +++ b/src/modules/web-information/term-condition/domain/entities/event/term-condition-deleted.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TermConditionDeletedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/web-information/term-condition/domain/entities/event/term-condition-updated.event.ts b/src/modules/web-information/term-condition/domain/entities/event/term-condition-updated.event.ts new file mode 100644 index 0000000..0bde406 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/entities/event/term-condition-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TermConditionUpdatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/web-information/term-condition/domain/entities/term-condition.entity.ts b/src/modules/web-information/term-condition/domain/entities/term-condition.entity.ts new file mode 100644 index 0000000..3e662e3 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/entities/term-condition.entity.ts @@ -0,0 +1,6 @@ +import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity'; + +export interface TermConditionEntity extends BaseStatusEntity { + title: string; + description: string; +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/active-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/active-term-condition.manager.ts new file mode 100644 index 0000000..9daee6f --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/active-term-condition.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 { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; + +@Injectable() +export class ActiveTermConditionManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.title}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/batch-active-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/batch-active-term-condition.manager.ts new file mode 100644 index 0000000..cb85f8f --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/batch-active-term-condition.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchActiveTermConditionManager extends BaseBatchUpdateStatusManager { + validateData(data: TermConditionEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/batch-confirm-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/batch-confirm-term-condition.manager.ts new file mode 100644 index 0000000..5403de8 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/batch-confirm-term-condition.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchConfirmTermConditionManager extends BaseBatchUpdateStatusManager { + validateData(data: TermConditionEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/batch-delete-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/batch-delete-term-condition.manager.ts new file mode 100644 index 0000000..7246193 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/batch-delete-term-condition.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchDeleteManager } from 'src/core/modules/domain/usecase/managers/base-batch-delete.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionDeletedEvent } from '../../entities/event/term-condition-deleted.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchDeleteTermConditionManager extends BaseBatchDeleteManager { + async beforeProcess(): Promise { + return; + } + + async validateData(data: TermConditionEntity): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionDeletedEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/batch-inactive-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/batch-inactive-term-condition.manager.ts new file mode 100644 index 0000000..b234d43 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/batch-inactive-term-condition.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchInactiveTermConditionManager extends BaseBatchUpdateStatusManager { + validateData(data: TermConditionEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/confirm-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/confirm-term-condition.manager.ts new file mode 100644 index 0000000..7a0adfc --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/confirm-term-condition.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 { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; + +@Injectable() +export class ConfirmTermConditionManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.title}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/create-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/create-term-condition.manager.ts new file mode 100644 index 0000000..ab08d99 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/create-term-condition.manager.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { TermConditionCreatedEvent } from '../../entities/event/term-condition-created.event'; + +@Injectable() +export class CreateTermConditionManager extends BaseCreateManager { + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return []; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionCreatedEvent, + data: this.data, + }, + ]; + } + + get entityTarget(): any { + return TermConditionModel; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/delete-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/delete-term-condition.manager.ts new file mode 100644 index 0000000..7732a48 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/delete-term-condition.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDeleteManager } from 'src/core/modules/domain/usecase/managers/base-delete.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionDeletedEvent } from '../../entities/event/term-condition-deleted.event'; + +@Injectable() +export class DeleteTermConditionManager 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 TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionDeletedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/inactive-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/inactive-term-condition.manager.ts new file mode 100644 index 0000000..5fa1432 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/inactive-term-condition.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 { TermConditionEntity } from '../../entities/term-condition.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionChangeStatusEvent } from '../../entities/event/term-condition-change-status.event'; + +@Injectable() +export class InactiveTermConditionManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success inactive data ${this.result.title}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/managers/update-term-condition.manager.ts b/src/modules/web-information/term-condition/domain/usecases/managers/update-term-condition.manager.ts new file mode 100644 index 0000000..8c08145 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/managers/update-term-condition.manager.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateManager } from 'src/core/modules/domain/usecase/managers/base-update.manager'; +import { TermConditionEntity } from '../../entities/term-condition.entity'; +import { TermConditionModel } from '../../../data/models/term-condition.model'; +import { TermConditionUpdatedEvent } from '../../entities/event/term-condition-updated.event'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; + +@Injectable() +export class UpdateTermConditionManager extends BaseUpdateManager { + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return []; + } + + get entityTarget(): any { + return TermConditionModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TermConditionUpdatedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/web-information/term-condition/domain/usecases/term-condition-data.orchestrator.ts b/src/modules/web-information/term-condition/domain/usecases/term-condition-data.orchestrator.ts new file mode 100644 index 0000000..c1b41f9 --- /dev/null +++ b/src/modules/web-information/term-condition/domain/usecases/term-condition-data.orchestrator.ts @@ -0,0 +1,121 @@ +import { Injectable } from '@nestjs/common'; +import { CreateTermConditionManager } from './managers/create-term-condition.manager'; +import { TermConditionDataService } from '../../data/services/term-condition-data.service'; +import { TermConditionEntity } from '../entities/term-condition.entity'; +import { DeleteTermConditionManager } from './managers/delete-term-condition.manager'; +import { UpdateTermConditionManager } from './managers/update-term-condition.manager'; +import { BaseDataTransactionOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data-transaction.orchestrator'; +import { ActiveTermConditionManager } from './managers/active-term-condition.manager'; +import { InactiveTermConditionManager } from './managers/inactive-term-condition.manager'; +import { ConfirmTermConditionManager } from './managers/confirm-term-condition.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchConfirmTermConditionManager } from './managers/batch-confirm-term-condition.manager'; +import { BatchInactiveTermConditionManager } from './managers/batch-inactive-term-condition.manager'; +import { BatchActiveTermConditionManager } from './managers/batch-active-term-condition.manager'; +import { BatchDeleteTermConditionManager } from './managers/batch-delete-term-condition.manager'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class TermConditionDataOrchestrator extends BaseDataTransactionOrchestrator { + constructor( + private createManager: CreateTermConditionManager, + private updateManager: UpdateTermConditionManager, + private deleteManager: DeleteTermConditionManager, + private activeManager: ActiveTermConditionManager, + private confirmManager: ConfirmTermConditionManager, + private inactiveManager: InactiveTermConditionManager, + private batchDeleteManager: BatchDeleteTermConditionManager, + private batchActiveManager: BatchActiveTermConditionManager, + private batchConfirmManager: BatchConfirmTermConditionManager, + private batchInactiveManager: BatchInactiveTermConditionManager, + private serviceData: TermConditionDataService, + ) { + super(); + } + + async create(data): Promise { + this.createManager.setData(data); + this.createManager.setService(this.serviceData, TABLE_NAME.TERM_CONDITION); + await this.createManager.execute(); + return this.createManager.getResult(); + } + + async update(dataId, data): Promise { + this.updateManager.setData(dataId, data); + this.updateManager.setService(this.serviceData, TABLE_NAME.TERM_CONDITION); + await this.updateManager.execute(); + return this.updateManager.getResult(); + } + + async delete(dataId): Promise { + this.deleteManager.setData(dataId); + this.deleteManager.setService(this.serviceData, TABLE_NAME.TERM_CONDITION); + await this.deleteManager.execute(); + return this.deleteManager.getResult(); + } + + async batchDelete(dataIds: string[]): Promise { + this.batchDeleteManager.setData(dataIds); + this.batchDeleteManager.setService( + this.serviceData, + TABLE_NAME.TERM_CONDITION, + ); + 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.TERM_CONDITION); + 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.TERM_CONDITION, + ); + 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.TERM_CONDITION); + 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.TERM_CONDITION, + ); + 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.TERM_CONDITION, + ); + 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.TERM_CONDITION, + ); + await this.batchInactiveManager.execute(); + return this.batchInactiveManager.getResult(); + } +} diff --git a/src/modules/web-information/term-condition/index.ts b/src/modules/web-information/term-condition/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/web-information/term-condition/infrastructure/dto/term-condition.dto.ts b/src/modules/web-information/term-condition/infrastructure/dto/term-condition.dto.ts new file mode 100644 index 0000000..b0eb01f --- /dev/null +++ b/src/modules/web-information/term-condition/infrastructure/dto/term-condition.dto.ts @@ -0,0 +1,24 @@ +import { BaseStatusDto } from 'src/core/modules/infrastructure/dto/base-status.dto'; +import { TermConditionEntity } from '../../domain/entities/term-condition.entity'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; + +export class TermConditionDto + extends BaseStatusDto + implements TermConditionEntity +{ + @ApiProperty({ + type: String, + required: true, + example: 'Booking', + }) + @IsString() + title: string; + + @ApiProperty({ + type: String, + required: false, + example: 'Booking descs', + }) + description: string; +} diff --git a/src/modules/web-information/term-condition/infrastructure/term-condition-data.controller.ts b/src/modules/web-information/term-condition/infrastructure/term-condition-data.controller.ts new file mode 100644 index 0000000..2f497c9 --- /dev/null +++ b/src/modules/web-information/term-condition/infrastructure/term-condition-data.controller.ts @@ -0,0 +1,78 @@ +import { + Body, + Controller, + Delete, + Param, + Patch, + Post, + Put, +} from '@nestjs/common'; +import { TermConditionDataOrchestrator } from '../domain/usecases/term-condition-data.orchestrator'; +import { TermConditionDto } from './dto/term-condition.dto'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { TermConditionEntity } from '../domain/entities/term-condition.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.TERM_CONDITION.split('-').join(' ')} - data`) +@Controller(`v1/${MODULE_NAME.TERM_CONDITION}`) +@Public(false) +@ApiBearerAuth('JWT') +export class TermConditionDataController { + constructor(private orchestrator: TermConditionDataOrchestrator) {} + + @Post() + async create(@Body() data: TermConditionDto): 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: TermConditionDto, + ): 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/web-information/term-condition/term-condition.module.ts b/src/modules/web-information/term-condition/term-condition.module.ts new file mode 100644 index 0000000..0f2e156 --- /dev/null +++ b/src/modules/web-information/term-condition/term-condition.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 { TermConditionDataService } from './data/services/term-condition-data.service'; +import { TermConditionReadService } from './data/services/term-condition-read.service'; +import { TermConditionReadController } from './infrastructure/term-condition-read.controller'; +import { TermConditionReadOrchestrator } from './domain/usecases/term-condition-read.orchestrator'; +import { TermConditionDataController } from './infrastructure/term-condition-data.controller'; +import { TermConditionDataOrchestrator } from './domain/usecases/term-condition-data.orchestrator'; +import { CreateTermConditionManager } from './domain/usecases/managers/create-term-condition.manager'; +import { CqrsModule } from '@nestjs/cqrs'; +import { IndexTermConditionManager } from './domain/usecases/managers/index-term-condition.manager'; +import { DeleteTermConditionManager } from './domain/usecases/managers/delete-term-condition.manager'; +import { UpdateTermConditionManager } from './domain/usecases/managers/update-term-condition.manager'; +import { ActiveTermConditionManager } from './domain/usecases/managers/active-term-condition.manager'; +import { ConfirmTermConditionManager } from './domain/usecases/managers/confirm-term-condition.manager'; +import { InactiveTermConditionManager } from './domain/usecases/managers/inactive-term-condition.manager'; +import { DetailTermConditionManager } from './domain/usecases/managers/detail-term-condition.manager'; +import { BatchDeleteTermConditionManager } from './domain/usecases/managers/batch-delete-term-condition.manager'; +import { BatchActiveTermConditionManager } from './domain/usecases/managers/batch-active-term-condition.manager'; +import { BatchConfirmTermConditionManager } from './domain/usecases/managers/batch-confirm-term-condition.manager'; +import { BatchInactiveTermConditionManager } from './domain/usecases/managers/batch-inactive-term-condition.manager'; +import { TermConditionModel } from './data/models/term-condition.model'; + +@Module({ + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature([TermConditionModel], CONNECTION_NAME.DEFAULT), + CqrsModule, + ], + controllers: [TermConditionDataController, TermConditionReadController], + providers: [ + IndexTermConditionManager, + DetailTermConditionManager, + CreateTermConditionManager, + DeleteTermConditionManager, + UpdateTermConditionManager, + ActiveTermConditionManager, + ConfirmTermConditionManager, + InactiveTermConditionManager, + BatchDeleteTermConditionManager, + BatchActiveTermConditionManager, + BatchConfirmTermConditionManager, + BatchInactiveTermConditionManager, + + TermConditionDataService, + TermConditionReadService, + + TermConditionDataOrchestrator, + TermConditionReadOrchestrator, + ], +}) +export class TermConditionModule {}