diff --git a/src/core/strings/constants/base.constants.ts b/src/core/strings/constants/base.constants.ts index 2fc60a6..272ddcd 100644 --- a/src/core/strings/constants/base.constants.ts +++ b/src/core/strings/constants/base.constants.ts @@ -7,7 +7,9 @@ export enum STATUS { INACTIVE = 'inactive', PENDING = 'pending', REFUNDED = 'refunded', + REJECTED = 'rejected', SETTLED = 'settled', + WAITING = 'waiting', } export enum ORDER_TYPE { diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index f1738a7..4b8377a 100644 --- a/src/core/strings/constants/module.constants.ts +++ b/src/core/strings/constants/module.constants.ts @@ -1,3 +1,4 @@ export enum MODULE_NAME { USER_PRIVILEGE = 'user-privileges', + USER_PRIVILEGE_CONFIGURATION = 'user-privilege-configurations', } diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 41116db..669b7e3 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -1,3 +1,5 @@ export enum TABLE_NAME { + USER = 'users', USER_PRIVILEGE = 'user_privileges', + USER_PRIVILEGE_CONFIGURATION = 'user_privilege_configurations', } diff --git a/src/database/migrations/1717385661972-user-privilege.ts b/src/database/migrations/1717385661972-user-privilege.ts new file mode 100644 index 0000000..b8b3252 --- /dev/null +++ b/src/database/migrations/1717385661972-user-privilege.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class UserPrivilege1717385661972 implements MigrationInterface { + name = 'UserPrivilege1717385661972'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "user_privilege_configurations" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "module" character varying(125) NOT NULL, "module_label" character varying(125), "menu" character varying(125) NOT NULL, "menu_label" character varying(125), "sub_menu" character varying(125), "sub_menu_label" character varying(125), "view" boolean, "create" boolean, "edit" boolean, "delete" boolean, "cancel" boolean, "confirm" boolean, "index" integer DEFAULT '0', "user_privilege_id" uuid, CONSTRAINT "PK_8ed47d7806c97dbf77969acc075" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TYPE "public"."user_privileges_status_enum" AS ENUM('active', 'cancel', 'confirmed', 'draft', 'expired', 'inactive', 'pending', 'refunded', 'rejected', 'settled', 'waiting')`, + ); + await queryRunner.query( + `CREATE TABLE "user_privileges" ("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"."user_privileges_status_enum" NOT NULL DEFAULT 'draft', "name" character varying(125) NOT NULL, CONSTRAINT "PK_4429e115dd3db86b6cf1f044ea5" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `ALTER TABLE "user_privilege_configurations" ADD CONSTRAINT "FK_ef45354482245798d95f78e450a" FOREIGN KEY ("user_privilege_id") REFERENCES "user_privileges"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_privilege_configurations" DROP CONSTRAINT "FK_ef45354482245798d95f78e450a"`, + ); + await queryRunner.query(`DROP TABLE "user_privileges"`); + await queryRunner.query(`DROP TYPE "public"."user_privileges_status_enum"`); + await queryRunner.query(`DROP TABLE "user_privilege_configurations"`); + } +} diff --git a/src/modules/user-related/user-privilege/data/service/user-privilege-read.service.ts b/src/modules/user-related/user-privilege/data/service/user-privilege-read.service.ts index eee5d80..7ef0438 100644 --- a/src/modules/user-related/user-privilege/data/service/user-privilege-read.service.ts +++ b/src/modules/user-related/user-privilege/data/service/user-privilege-read.service.ts @@ -1,19 +1,17 @@ -import { Injectable } from "@nestjs/common"; -import { UserPrivilegeEntity } from "../../domain/entities/user-privilege.entity"; -import { InjectRepository } from "@nestjs/typeorm"; -import { UserPrivilegeModel } from "../model/user-privilege.model"; -import { CONNECTION_NAME } from "src/core/strings/constants/base.constants"; -import { Repository } from "typeorm"; -import { BaseReadService } from "src/core/modules/data/service/base-read.service"; +import { Injectable } from '@nestjs/common'; +import { UserPrivilegeEntity } from '../../domain/entities/user-privilege.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { UserPrivilegeModel } from '../models/user-privilege.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; +import { BaseReadService } from 'src/core/modules/data/service/base-read.service'; @Injectable() export class UserPrivilegeReadService extends BaseReadService { - - constructor( - @InjectRepository(UserPrivilegeModel, CONNECTION_NAME.DEFAULT) - private repo: Repository, - ) { + constructor( + @InjectRepository(UserPrivilegeModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { super(repo); - } - -} \ No newline at end of file + } +} diff --git a/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege-configuration.entity.ts b/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege-configuration.entity.ts new file mode 100644 index 0000000..15e0096 --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege-configuration.entity.ts @@ -0,0 +1,6 @@ +import { BaseFilterEntity } from 'src/core/modules/domain/entities/base-filter.entity'; + +export interface FilterUserPrivilegeConfigurationEntity + extends BaseFilterEntity { + user_privilege_ids: string[]; +} diff --git a/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege.entity.ts b/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege.entity.ts index ad3141d..cb66f26 100644 --- a/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege.entity.ts +++ b/src/modules/user-related/user-privilege/domain/entities/filter-user-privilege.entity.ts @@ -1,5 +1,3 @@ -import { BaseFilterEntity } from "src/core/modules/domain/entities/base-filter.entity"; +import { BaseFilterEntity } from 'src/core/modules/domain/entities/base-filter.entity'; -export interface FilterUserPrivilegeEntity extends BaseFilterEntity { - -} \ No newline at end of file +export interface FilterUserPrivilegeEntity extends BaseFilterEntity {} diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/index-user-privilege-configuration.manager.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/index-user-privilege-configuration.manager.ts new file mode 100644 index 0000000..d8af159 --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege-configuration/managers/index-user-privilege-configuration.manager.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@nestjs/common'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { UserPrivilegeConfigurationEntity } from '../../../entities/user-privilege-configuration.entity'; +import { Param } from 'src/core/helpers/query/specific-search.helper'; +import { SelectQueryBuilder } from 'typeorm'; + +@Injectable() +export class IndexUserPrivilegeConfigurationManager extends BaseIndexManager { + async prepareData(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get specificFilter(): Param[] { + return; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + console.log(this.filterParam, 'param'); + if (this.filterParam.user_privilege_ids) { + queryBuilder.andWhere(`user_privilege_id In (:...privilegeIds)`, { + privilegeIds: this.filterParam.user_privilege_ids, + }); + } + + return queryBuilder; + } +} diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/detail-user-privilege.manager.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/detail-user-privilege.manager.ts new file mode 100644 index 0000000..720c366 --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/detail-user-privilege.manager.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDetailManager } from 'src/core/modules/domain/usecase/managers/base-detail.manager'; +import { UserPrivilegeEntity } from '../../../entities/user-privilege.entity'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class DetailUserPrivilegeManager extends BaseDetailManager { + get setFindProperties(): any { + return { + id: this.dataId, + }; + } + + get selectData(): string[] { + return ['id']; + } + + get relationData(): string[] { + return []; + } + + async prepareData(): Promise { + this.tableName = TABLE_NAME.USER_PRIVILEGE; + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } +} diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/index-user-privilege.manager.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/index-user-privilege.manager.ts new file mode 100644 index 0000000..33b3f20 --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/managers/index-user-privilege.manager.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { UserPrivilegeEntity } from '../../../entities/user-privilege.entity'; +import { SelectQueryBuilder } from 'typeorm'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { Param } from 'src/core/helpers/query/specific-search.helper'; + +@Injectable() +export class IndexUserPrivilegeManager extends BaseIndexManager { + async prepareData(): Promise { + this.tableName = TABLE_NAME.USER_PRIVILEGE; + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get specificFilter(): Param[] { + return []; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + return queryBuilder; + } + + setFilterSearch(): string[] { + return []; + } +} diff --git a/src/modules/user-related/user-privilege/domain/usecases/user-privilege/user-privilege-read.orchestrator.ts b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/user-privilege-read.orchestrator.ts new file mode 100644 index 0000000..3e8523c --- /dev/null +++ b/src/modules/user-related/user-privilege/domain/usecases/user-privilege/user-privilege-read.orchestrator.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; +import { IndexUserPrivilegeManager } from './managers/index-user-privilege.manager'; +import { UserPrivilegeReadService } from '../../../data/service/user-privilege-read.service'; +import { UserPrivilegeEntity } from '../../entities/user-privilege.entity'; +import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; +import { BaseReadOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-read.orchestrator'; +import { DetailUserPrivilegeManager } from './managers/detail-user-privilege.manager'; + +@Injectable() +export class UserPrivilegeReadOrchestrator extends BaseReadOrchestrator { + constructor( + private indexManager: IndexUserPrivilegeManager, + private detailManager: DetailUserPrivilegeManager, + private serviceData: UserPrivilegeReadService, + ) { + super(); + } + + async index(params): Promise> { + this.indexManager.setFilterParam(params); + this.indexManager.setService(this.serviceData); + await this.indexManager.execute(); + return this.indexManager.getResult(); + } + + async detail(dataId: string): Promise { + this.detailManager.setData(dataId); + this.detailManager.setService(this.serviceData); + await this.detailManager.execute(); + return this.detailManager.getResult(); + } +} diff --git a/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege-configuration.dto.ts b/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege-configuration.dto.ts new file mode 100644 index 0000000..5a4f625 --- /dev/null +++ b/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege-configuration.dto.ts @@ -0,0 +1,15 @@ +import { BaseFilterDto } from 'src/core/modules/infrastructure/dto/base-filter.dto'; +import { FilterUserPrivilegeConfigurationEntity } from '../../domain/entities/filter-user-privilege-configuration.entity'; +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class FilterUserPrivilegeConfigurationDto + extends BaseFilterDto + implements FilterUserPrivilegeConfigurationEntity +{ + @ApiProperty({ type: ['string'], required: false }) + @Transform((body) => { + return Array.isArray(body.value) ? body.value : [body.value]; + }) + user_privilege_ids: string[]; +} diff --git a/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege.dto.ts b/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege.dto.ts index e95210e..e32377e 100644 --- a/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege.dto.ts +++ b/src/modules/user-related/user-privilege/infrastructure/dto/filter-user-privilege.dto.ts @@ -1,4 +1,6 @@ -import { BaseFilterDto } from "src/core/modules/infrastructure/dto/base-filter.dto"; -import { FilterUserPrivilegeEntity } from "../../domain/entities/filter-user-privilege.entity"; +import { BaseFilterDto } from 'src/core/modules/infrastructure/dto/base-filter.dto'; +import { FilterUserPrivilegeEntity } from '../../domain/entities/filter-user-privilege.entity'; -export class FilterUserPrivilegeDto extends BaseFilterDto implements FilterUserPrivilegeEntity {} \ No newline at end of file +export class FilterUserPrivilegeDto + extends BaseFilterDto + implements FilterUserPrivilegeEntity {}