From 0ce8c8402e57795133075abb245b5e5d7e26b95c Mon Sep 17 00:00:00 2001 From: ashar Date: Wed, 12 Jun 2024 11:47:44 +0700 Subject: [PATCH] feat(SPG-379) REST API CUD Metode Pembayaran --- src/app.module.ts | 4 + .../strings/constants/module.constants.ts | 1 + src/core/strings/constants/table.constants.ts | 1 + .../1718167285807-payment-method.ts | 23 ++++ .../transaction/payment-method/constants.ts | 5 + .../data/models/payment-method.model.ts | 33 +++++ .../services/payment-method-data.service.ts | 17 +++ .../payment-method-change-status.event.ts | 5 + .../event/payment-method-created.event.ts | 5 + .../event/payment-method-deleted.event.ts | 5 + .../event/payment-method-updated.event.ts | 5 + .../domain/entities/payment-method.entity.ts | 11 ++ .../managers/active-payment-method.manager.ts | 45 +++++++ .../batch-active-payment-method.manager.ts | 45 +++++++ .../batch-confirm-payment-method.manager.ts | 45 +++++++ .../batch-delete-payment-method.manager.ts | 45 +++++++ .../batch-inactive-payment-method.manager.ts | 45 +++++++ .../confirm-payment-method.manager.ts | 45 +++++++ .../managers/create-payment-method.manager.ts | 42 ++++++ .../managers/delete-payment-method.manager.ts | 45 +++++++ .../inactive-payment-method.manager.ts | 45 +++++++ .../managers/update-payment-method.manager.ts | 46 +++++++ .../payment-method-data.orchestrator.ts | 121 ++++++++++++++++++ .../transaction/payment-method/index.ts | 0 .../infrastructure/dto/payment-method.dto.ts | 62 +++++++++ .../payment-method-data.controller.ts | 78 +++++++++++ .../payment-method/payment-method.module.ts | 54 ++++++++ 27 files changed, 878 insertions(+) create mode 100644 src/database/migrations/1718167285807-payment-method.ts create mode 100644 src/modules/transaction/payment-method/constants.ts create mode 100644 src/modules/transaction/payment-method/data/models/payment-method.model.ts create mode 100644 src/modules/transaction/payment-method/data/services/payment-method-data.service.ts create mode 100644 src/modules/transaction/payment-method/domain/entities/event/payment-method-change-status.event.ts create mode 100644 src/modules/transaction/payment-method/domain/entities/event/payment-method-created.event.ts create mode 100644 src/modules/transaction/payment-method/domain/entities/event/payment-method-deleted.event.ts create mode 100644 src/modules/transaction/payment-method/domain/entities/event/payment-method-updated.event.ts create mode 100644 src/modules/transaction/payment-method/domain/entities/payment-method.entity.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/active-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/batch-active-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/batch-confirm-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/batch-delete-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/batch-inactive-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/confirm-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/create-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/delete-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/inactive-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/managers/update-payment-method.manager.ts create mode 100644 src/modules/transaction/payment-method/domain/usecases/payment-method-data.orchestrator.ts create mode 100644 src/modules/transaction/payment-method/index.ts create mode 100644 src/modules/transaction/payment-method/infrastructure/dto/payment-method.dto.ts create mode 100644 src/modules/transaction/payment-method/infrastructure/payment-method-data.controller.ts create mode 100644 src/modules/transaction/payment-method/payment-method.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index 94f1eb6..7bf0036 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -35,6 +35,8 @@ import { TaxModel } from './modules/transaction/tax/data/models/tax.model'; import { SalesPriceFormulaModule } from './modules/transaction/sales-price-formula/sales-price-formula.module'; import { SalesPriceFormulaModel } from './modules/transaction/sales-price-formula/data/models/sales-price-formula.model'; import { ProfitShareFormulaModule } from './modules/transaction/profit-share-formula/profit-share-formula.module'; +import { PaymentMethodModule } from './modules/transaction/payment-method/payment-method.module'; +import { PaymentMethodModel } from './modules/transaction/payment-method/data/models/payment-method.model'; @Module({ imports: [ @@ -56,6 +58,7 @@ import { ProfitShareFormulaModule } from './modules/transaction/profit-share-for ItemModel, ItemCategoryModel, LogModel, + PaymentMethodModel, SalesPriceFormulaModel, SeasonTypeModel, TaxModel, @@ -82,6 +85,7 @@ import { ProfitShareFormulaModule } from './modules/transaction/profit-share-for ItemModule, // transaction + PaymentMethodModule, ProfitShareFormulaModule, SalesPriceFormulaModule, TaxModule, diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index 489d50a..d5579b7 100644 --- a/src/core/strings/constants/module.constants.ts +++ b/src/core/strings/constants/module.constants.ts @@ -1,6 +1,7 @@ export enum MODULE_NAME { ITEM = 'items', ITEM_CATEGORY = 'item-categories', + PAYMENT_METHOD = 'payment-methods', SEASON_TYPE = 'season-types', TAX = 'taxes', TENANT = 'tenants', diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index a97570b..aeec40a 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -3,6 +3,7 @@ export enum TABLE_NAME { ITEM = 'items', ITEM_CATEGORY = 'item_categories', LOG = 'logs', + PAYMENT_METHOD = 'payment_methods', PRICE_FORMULA = 'price_formulas', SEASON_TYPE = 'season_types', TAX = 'taxes', diff --git a/src/database/migrations/1718167285807-payment-method.ts b/src/database/migrations/1718167285807-payment-method.ts new file mode 100644 index 0000000..648a2f9 --- /dev/null +++ b/src/database/migrations/1718167285807-payment-method.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class PaymentMethod1718167285807 implements MigrationInterface { + name = 'PaymentMethod1718167285807'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."payment_methods_status_enum" AS ENUM('active', 'cancel', 'confirmed', 'draft', 'expired', 'inactive', 'pending', 'refunded', 'rejected', 'settled', 'waiting')`, + ); + await queryRunner.query( + `CREATE TYPE "public"."payment_methods_type_enum" AS ENUM('bank transfer', 'e-wallet', 'edc')`, + ); + await queryRunner.query( + `CREATE TABLE "payment_methods" ("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"."payment_methods_status_enum" NOT NULL DEFAULT 'draft', "issuer_name" character varying NOT NULL, "account_number" character varying, "account_name" character varying, "qr_image" character varying, "note" character varying, "type" "public"."payment_methods_type_enum" NOT NULL DEFAULT 'bank transfer', CONSTRAINT "PK_34f9b8c6dfb4ac3559f7e2820d1" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "payment_methods"`); + await queryRunner.query(`DROP TYPE "public"."payment_methods_type_enum"`); + await queryRunner.query(`DROP TYPE "public"."payment_methods_status_enum"`); + } +} diff --git a/src/modules/transaction/payment-method/constants.ts b/src/modules/transaction/payment-method/constants.ts new file mode 100644 index 0000000..172a3af --- /dev/null +++ b/src/modules/transaction/payment-method/constants.ts @@ -0,0 +1,5 @@ +export enum PaymentMethodType { + TRANSFER_BANK = 'bank transfer', + E_WALLET = 'e-wallet', + EDC = 'edc', +} diff --git a/src/modules/transaction/payment-method/data/models/payment-method.model.ts b/src/modules/transaction/payment-method/data/models/payment-method.model.ts new file mode 100644 index 0000000..c879706 --- /dev/null +++ b/src/modules/transaction/payment-method/data/models/payment-method.model.ts @@ -0,0 +1,33 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { PaymentMethodEntity } from '../../domain/entities/payment-method.entity'; +import { Column, Entity } from 'typeorm'; +import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; +import { PaymentMethodType } from '../../constants'; + +@Entity(TABLE_NAME.PAYMENT_METHOD) +export class PaymentMethodModel + extends BaseStatusModel + implements PaymentMethodEntity +{ + @Column('varchar', { name: 'issuer_name' }) + issuer_name: string; + + @Column('varchar', { name: 'account_number', nullable: true }) + account_number: string; + + @Column('varchar', { name: 'account_name', nullable: true }) + account_name: string; + + @Column('varchar', { name: 'qr_image', nullable: true }) + qr_image: string; + + @Column('varchar', { name: 'note', nullable: true }) + note: string; + + @Column('enum', { + name: 'type', + enum: PaymentMethodType, + default: PaymentMethodType.TRANSFER_BANK, + }) + type: PaymentMethodType; +} diff --git a/src/modules/transaction/payment-method/data/services/payment-method-data.service.ts b/src/modules/transaction/payment-method/data/services/payment-method-data.service.ts new file mode 100644 index 0000000..d9f5212 --- /dev/null +++ b/src/modules/transaction/payment-method/data/services/payment-method-data.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { PaymentMethodEntity } from '../../domain/entities/payment-method.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { PaymentMethodModel } from '../models/payment-method.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class PaymentMethodDataService extends BaseDataService { + constructor( + @InjectRepository(PaymentMethodModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/transaction/payment-method/domain/entities/event/payment-method-change-status.event.ts b/src/modules/transaction/payment-method/domain/entities/event/payment-method-change-status.event.ts new file mode 100644 index 0000000..cb588b4 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/entities/event/payment-method-change-status.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class PaymentMethodChangeStatusEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/payment-method/domain/entities/event/payment-method-created.event.ts b/src/modules/transaction/payment-method/domain/entities/event/payment-method-created.event.ts new file mode 100644 index 0000000..1e4522f --- /dev/null +++ b/src/modules/transaction/payment-method/domain/entities/event/payment-method-created.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class PaymentMethodCreatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/payment-method/domain/entities/event/payment-method-deleted.event.ts b/src/modules/transaction/payment-method/domain/entities/event/payment-method-deleted.event.ts new file mode 100644 index 0000000..c269c98 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/entities/event/payment-method-deleted.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class PaymentMethodDeletedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/payment-method/domain/entities/event/payment-method-updated.event.ts b/src/modules/transaction/payment-method/domain/entities/event/payment-method-updated.event.ts new file mode 100644 index 0000000..0119cfc --- /dev/null +++ b/src/modules/transaction/payment-method/domain/entities/event/payment-method-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class PaymentMethodUpdatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/payment-method/domain/entities/payment-method.entity.ts b/src/modules/transaction/payment-method/domain/entities/payment-method.entity.ts new file mode 100644 index 0000000..d2708c9 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/entities/payment-method.entity.ts @@ -0,0 +1,11 @@ +import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity'; +import { PaymentMethodType } from '../../constants'; + +export interface PaymentMethodEntity extends BaseStatusEntity { + issuer_name: string; + account_number: string; + account_name: string; + qr_image: string; + type: PaymentMethodType; + note: string; +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/active-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/active-payment-method.manager.ts new file mode 100644 index 0000000..bf059b4 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/active-payment-method.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 { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; + +@Injectable() +export class ActivePaymentMethodManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.account_name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/batch-active-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/batch-active-payment-method.manager.ts new file mode 100644 index 0000000..f9be617 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/batch-active-payment-method.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchActivePaymentMethodManager extends BaseBatchUpdateStatusManager { + validateData(data: PaymentMethodEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/batch-confirm-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/batch-confirm-payment-method.manager.ts new file mode 100644 index 0000000..970c0ff --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/batch-confirm-payment-method.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchConfirmPaymentMethodManager extends BaseBatchUpdateStatusManager { + validateData(data: PaymentMethodEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/batch-delete-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/batch-delete-payment-method.manager.ts new file mode 100644 index 0000000..5d9736f --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/batch-delete-payment-method.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchDeleteManager } from 'src/core/modules/domain/usecase/managers/base-batch-delete.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodDeletedEvent } from '../../entities/event/payment-method-deleted.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchDeletePaymentMethodManager extends BaseBatchDeleteManager { + async beforeProcess(): Promise { + return; + } + + async validateData(data: PaymentMethodEntity): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodDeletedEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/batch-inactive-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/batch-inactive-payment-method.manager.ts new file mode 100644 index 0000000..0bff093 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/batch-inactive-payment-method.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchInactivePaymentMethodManager extends BaseBatchUpdateStatusManager { + validateData(data: PaymentMethodEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/confirm-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/confirm-payment-method.manager.ts new file mode 100644 index 0000000..ea24575 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/confirm-payment-method.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 { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; + +@Injectable() +export class ConfirmPaymentMethodManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.account_name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/create-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/create-payment-method.manager.ts new file mode 100644 index 0000000..3823263 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/create-payment-method.manager.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { PaymentMethodCreatedEvent } from '../../entities/event/payment-method-created.event'; + +@Injectable() +export class CreatePaymentMethodManager extends BaseCreateManager { + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'account_number' }, { column: 'account_name' }]; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodCreatedEvent, + data: this.data, + }, + ]; + } + + get entityTarget(): any { + return PaymentMethodModel; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/delete-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/delete-payment-method.manager.ts new file mode 100644 index 0000000..58305c3 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/delete-payment-method.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDeleteManager } from 'src/core/modules/domain/usecase/managers/base-delete.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodDeletedEvent } from '../../entities/event/payment-method-deleted.event'; + +@Injectable() +export class DeletePaymentMethodManager 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 PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodDeletedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/inactive-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/inactive-payment-method.manager.ts new file mode 100644 index 0000000..f20f1f7 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/inactive-payment-method.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 { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodChangeStatusEvent } from '../../entities/event/payment-method-change-status.event'; + +@Injectable() +export class InactivePaymentMethodManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success inactive data ${this.result.account_name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/managers/update-payment-method.manager.ts b/src/modules/transaction/payment-method/domain/usecases/managers/update-payment-method.manager.ts new file mode 100644 index 0000000..f64e351 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/managers/update-payment-method.manager.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateManager } from 'src/core/modules/domain/usecase/managers/base-update.manager'; +import { PaymentMethodEntity } from '../../entities/payment-method.entity'; +import { PaymentMethodModel } from '../../../data/models/payment-method.model'; +import { PaymentMethodUpdatedEvent } from '../../entities/event/payment-method-updated.event'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; + +@Injectable() +export class UpdatePaymentMethodManager extends BaseUpdateManager { + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'account_number' }, { column: 'account_name' }]; + } + + get entityTarget(): any { + return PaymentMethodModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: PaymentMethodUpdatedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/payment-method/domain/usecases/payment-method-data.orchestrator.ts b/src/modules/transaction/payment-method/domain/usecases/payment-method-data.orchestrator.ts new file mode 100644 index 0000000..bd132c1 --- /dev/null +++ b/src/modules/transaction/payment-method/domain/usecases/payment-method-data.orchestrator.ts @@ -0,0 +1,121 @@ +import { Injectable } from '@nestjs/common'; +import { CreatePaymentMethodManager } from './managers/create-payment-method.manager'; +import { PaymentMethodDataService } from '../../data/services/payment-method-data.service'; +import { PaymentMethodEntity } from '../entities/payment-method.entity'; +import { DeletePaymentMethodManager } from './managers/delete-payment-method.manager'; +import { UpdatePaymentMethodManager } from './managers/update-payment-method.manager'; +import { BaseDataTransactionOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data-transaction.orchestrator'; +import { ActivePaymentMethodManager } from './managers/active-payment-method.manager'; +import { InactivePaymentMethodManager } from './managers/inactive-payment-method.manager'; +import { ConfirmPaymentMethodManager } from './managers/confirm-payment-method.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchConfirmPaymentMethodManager } from './managers/batch-confirm-payment-method.manager'; +import { BatchInactivePaymentMethodManager } from './managers/batch-inactive-payment-method.manager'; +import { BatchActivePaymentMethodManager } from './managers/batch-active-payment-method.manager'; +import { BatchDeletePaymentMethodManager } from './managers/batch-delete-payment-method.manager'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class PaymentMethodDataOrchestrator extends BaseDataTransactionOrchestrator { + constructor( + private createManager: CreatePaymentMethodManager, + private updateManager: UpdatePaymentMethodManager, + private deleteManager: DeletePaymentMethodManager, + private activeManager: ActivePaymentMethodManager, + private confirmManager: ConfirmPaymentMethodManager, + private inactiveManager: InactivePaymentMethodManager, + private batchDeleteManager: BatchDeletePaymentMethodManager, + private batchActiveManager: BatchActivePaymentMethodManager, + private batchConfirmManager: BatchConfirmPaymentMethodManager, + private batchInactiveManager: BatchInactivePaymentMethodManager, + private serviceData: PaymentMethodDataService, + ) { + super(); + } + + async create(data): Promise { + this.createManager.setData(data); + this.createManager.setService(this.serviceData, TABLE_NAME.PAYMENT_METHOD); + 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.PAYMENT_METHOD); + await this.updateManager.execute(); + return this.updateManager.getResult(); + } + + async delete(dataId): Promise { + this.deleteManager.setData(dataId); + this.deleteManager.setService(this.serviceData, TABLE_NAME.PAYMENT_METHOD); + await this.deleteManager.execute(); + return this.deleteManager.getResult(); + } + + async batchDelete(dataIds: string[]): Promise { + this.batchDeleteManager.setData(dataIds); + this.batchDeleteManager.setService( + this.serviceData, + TABLE_NAME.PAYMENT_METHOD, + ); + 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.PAYMENT_METHOD); + 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.PAYMENT_METHOD, + ); + 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.PAYMENT_METHOD); + 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.PAYMENT_METHOD, + ); + 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.PAYMENT_METHOD, + ); + 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.PAYMENT_METHOD, + ); + await this.batchInactiveManager.execute(); + return this.batchInactiveManager.getResult(); + } +} diff --git a/src/modules/transaction/payment-method/index.ts b/src/modules/transaction/payment-method/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/transaction/payment-method/infrastructure/dto/payment-method.dto.ts b/src/modules/transaction/payment-method/infrastructure/dto/payment-method.dto.ts new file mode 100644 index 0000000..d6292c8 --- /dev/null +++ b/src/modules/transaction/payment-method/infrastructure/dto/payment-method.dto.ts @@ -0,0 +1,62 @@ +import { BaseStatusDto } from 'src/core/modules/infrastructure/dto/base-status.dto'; +import { PaymentMethodEntity } from '../../domain/entities/payment-method.entity'; +import { PaymentMethodType } from '../../constants'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, ValidateIf } from 'class-validator'; + +export class PaymentMethodDto + extends BaseStatusDto + implements PaymentMethodEntity +{ + @ApiProperty({ + type: String, + required: true, + example: PaymentMethodType.TRANSFER_BANK, + }) + @IsString() + type: PaymentMethodType; + + @ApiProperty({ + type: String, + required: true, + example: 'BCA', + }) + @IsString() + issuer_name: string; + + @ApiProperty({ + type: String, + required: false, + example: '1232334235', + }) + @IsString() + @ValidateIf((body) => body.account_number) + account_number: string; + + @ApiProperty({ + type: String, + required: false, + example: 'Skyworld', + }) + @IsString() + @ValidateIf((body) => body.account_name) + account_name: string; + + @ApiProperty({ + type: String, + required: false, + example: '...', + }) + @IsString() + @ValidateIf((body) => body.qr_image) + qr_image: string; + + @ApiProperty({ + type: String, + required: false, + example: 'gate 1', + }) + @IsString() + @ValidateIf((body) => body.note) + note: string; +} diff --git a/src/modules/transaction/payment-method/infrastructure/payment-method-data.controller.ts b/src/modules/transaction/payment-method/infrastructure/payment-method-data.controller.ts new file mode 100644 index 0000000..f208d49 --- /dev/null +++ b/src/modules/transaction/payment-method/infrastructure/payment-method-data.controller.ts @@ -0,0 +1,78 @@ +import { + Body, + Controller, + Delete, + Param, + Patch, + Post, + Put, +} from '@nestjs/common'; +import { PaymentMethodDataOrchestrator } from '../domain/usecases/payment-method-data.orchestrator'; +import { PaymentMethodDto } from './dto/payment-method.dto'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { PaymentMethodEntity } from '../domain/entities/payment-method.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.PAYMENT_METHOD.split('-').join(' ')} - data`) +@Controller(MODULE_NAME.PAYMENT_METHOD) +@Public(false) +@ApiBearerAuth('JWT') +export class PaymentMethodDataController { + constructor(private orchestrator: PaymentMethodDataOrchestrator) {} + + @Post() + async create(@Body() data: PaymentMethodDto): 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: PaymentMethodDto, + ): 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/transaction/payment-method/payment-method.module.ts b/src/modules/transaction/payment-method/payment-method.module.ts new file mode 100644 index 0000000..60c1472 --- /dev/null +++ b/src/modules/transaction/payment-method/payment-method.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 { PaymentMethodDataService } from './data/services/payment-method-data.service'; +import { PaymentMethodReadService } from './data/services/payment-method-read.service'; +import { PaymentMethodReadController } from './infrastructure/payment-method-read.controller'; +import { PaymentMethodReadOrchestrator } from './domain/usecases/payment-method-read.orchestrator'; +import { PaymentMethodDataController } from './infrastructure/payment-method-data.controller'; +import { PaymentMethodDataOrchestrator } from './domain/usecases/payment-method-data.orchestrator'; +import { CreatePaymentMethodManager } from './domain/usecases/managers/create-payment-method.manager'; +import { CqrsModule } from '@nestjs/cqrs'; +import { IndexPaymentMethodManager } from './domain/usecases/managers/index-payment-method.manager'; +import { DeletePaymentMethodManager } from './domain/usecases/managers/delete-payment-method.manager'; +import { UpdatePaymentMethodManager } from './domain/usecases/managers/update-payment-method.manager'; +import { ActivePaymentMethodManager } from './domain/usecases/managers/active-payment-method.manager'; +import { ConfirmPaymentMethodManager } from './domain/usecases/managers/confirm-payment-method.manager'; +import { InactivePaymentMethodManager } from './domain/usecases/managers/inactive-payment-method.manager'; +import { DetailPaymentMethodManager } from './domain/usecases/managers/detail-payment-method.manager'; +import { BatchDeletePaymentMethodManager } from './domain/usecases/managers/batch-delete-payment-method.manager'; +import { BatchActivePaymentMethodManager } from './domain/usecases/managers/batch-active-payment-method.manager'; +import { BatchConfirmPaymentMethodManager } from './domain/usecases/managers/batch-confirm-payment-method.manager'; +import { BatchInactivePaymentMethodManager } from './domain/usecases/managers/batch-inactive-payment-method.manager'; +import { PaymentMethodModel } from './data/models/payment-method.model'; + +@Module({ + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature([PaymentMethodModel], CONNECTION_NAME.DEFAULT), + CqrsModule, + ], + controllers: [PaymentMethodDataController, PaymentMethodReadController], + providers: [ + IndexPaymentMethodManager, + DetailPaymentMethodManager, + CreatePaymentMethodManager, + DeletePaymentMethodManager, + UpdatePaymentMethodManager, + ActivePaymentMethodManager, + ConfirmPaymentMethodManager, + InactivePaymentMethodManager, + BatchDeletePaymentMethodManager, + BatchActivePaymentMethodManager, + BatchConfirmPaymentMethodManager, + BatchInactivePaymentMethodManager, + + PaymentMethodDataService, + PaymentMethodReadService, + + PaymentMethodDataOrchestrator, + PaymentMethodReadOrchestrator, + ], +}) +export class PaymentMethodModule {}