feat(SPG-123) Abstraction Transaction Data

pull/2/head
ashar 2024-06-03 15:35:00 +07:00
parent e442ca717e
commit 98f9fecc27
9 changed files with 155 additions and 77 deletions

View File

@ -0,0 +1,41 @@
import { HttpStatus, UnprocessableEntityException } from '@nestjs/common';
import { BaseDataService } from 'src/core/modules/data/service/base-data.service';
export class CheckDuplicateHelper {
constructor(
private dataService: BaseDataService<any>,
private duplicateColumn: string[],
private entity: any,
private entityId?: string,
) {}
async execute() {
for (const column of this.duplicateColumn) {
const queryBuilder = this.dataService
.getRepository()
.createQueryBuilder();
queryBuilder.orWhere(
`replace(trim(lower(${column})), ' ',' ') = :query`,
{
query: this.entity[column]
?.toLowerCase()
.trim()
.replace(/ +(?= )/g, ''),
},
);
if (this.entityId) {
queryBuilder.andWhere(`id Not In ('${this.entityId}')`);
}
const data_exists = await queryBuilder.getCount();
if (data_exists > 0) {
throw new UnprocessableEntityException({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
message: `Entity with ${column} : ${this.entity[column]} already exist`,
error: 'Unprocessable Entity',
});
}
}
}
}

View File

@ -1,8 +1,4 @@
import { import { Inject, Injectable, Logger } from '@nestjs/common';
Inject,
Injectable,
Logger,
} from '@nestjs/common';
import { EventBus } from '@nestjs/cqrs'; import { EventBus } from '@nestjs/cqrs';
import { UserProvider, UsersSession } from 'src/core/sessions'; import { UserProvider, UsersSession } from 'src/core/sessions';
import { BLANK_USER } from 'src/core/strings/constants/base.constants'; import { BLANK_USER } from 'src/core/strings/constants/base.constants';

View File

@ -1,10 +1,11 @@
import { CheckDuplicateHelper } from 'src/core/helpers/query/check-duplicate.helpers';
import { BaseManager } from '../base.manager'; import { BaseManager } from '../base.manager';
import { Injectable } from '@nestjs/common';
export abstract class BaseCreateManager<Entity> extends BaseManager { export abstract class BaseCreateManager<Entity> extends BaseManager {
protected result: Entity; protected result: Entity;
protected duplicateColumn: string[]; protected duplicateColumn: string[];
abstract get entityTarget(): any; abstract get entityTarget(): any;
abstract get uniqueColumns(): string[];
setData(entity: Entity): void { setData(entity: Entity): void {
this.data = entity; this.data = entity;
@ -19,6 +20,17 @@ export abstract class BaseCreateManager<Entity> extends BaseManager {
}); });
} }
async validateProcess(): Promise<void> {
if (this.uniqueColumns.length) {
await new CheckDuplicateHelper(
this.dataService,
this.uniqueColumns,
this.data,
).execute();
}
return;
}
async process(): Promise<void> { async process(): Promise<void> {
this.result = await this.dataService.create( this.result = await this.dataService.create(
this.queryRunner, this.queryRunner,

View File

@ -0,0 +1,21 @@
import { BaseManager } from '../base.manager';
export abstract class BaseCustomManager<Entity> extends BaseManager {
protected result: Entity;
abstract get entityTarget(): any;
setData(entity: Entity): void {
this.data = entity;
}
async prepareData(): Promise<void> {
if (this.data)
Object.assign(this.data, {
editor_id: this.user.id,
editor_name: this.user.name,
updated_at: new Date().getTime(),
});
}
abstract getResult(): any;
}

View File

@ -1,8 +1,4 @@
import { import { HttpStatus, UnprocessableEntityException } from '@nestjs/common';
HttpStatus,
Injectable,
UnprocessableEntityException,
} from '@nestjs/common';
import { BaseManager } from '../base.manager'; import { BaseManager } from '../base.manager';
export abstract class BaseDeleteManager<Entity> extends BaseManager { export abstract class BaseDeleteManager<Entity> extends BaseManager {

View File

@ -1,7 +1,6 @@
import { BaseReadManager } from "../base-read.manager"; import { BaseReadManager } from '../base-read.manager';
export abstract class BaseDetailManager<Entity> extends BaseReadManager { export abstract class BaseDetailManager<Entity> extends BaseReadManager {
protected dataId: string; protected dataId: string;
protected result: Entity; protected result: Entity;

View File

@ -1,16 +1,17 @@
import { PaginationResponse } from "src/core/response/domain/ok-response.interface"; import { PaginationResponse } from 'src/core/response/domain/ok-response.interface';
import { BaseReadManager } from "../base-read.manager"; import { BaseReadManager } from '../base-read.manager';
import { SelectQueryBuilder } from "typeorm"; import { SelectQueryBuilder } from 'typeorm';
import { BaseFilterEntity } from "../../entities/base-filter.entity"; import {
import { Param, SpecificSearchFilter } from "src/core/helpers/query/specific-search.helper"; Param,
SpecificSearchFilter,
} from 'src/core/helpers/query/specific-search.helper';
export abstract class BaseIndexManager<Entity> extends BaseReadManager { export abstract class BaseIndexManager<Entity> extends BaseReadManager {
protected result: PaginationResponse<Entity>; protected result: PaginationResponse<Entity>;
public filterParam: BaseFilterEntity; public filterParam: any;
abstract get specificFilter(): Param[]; abstract get specificFilter(): Param[];
setFilterParam(param: BaseFilterEntity): void { setFilterParam(param: any): void {
this.filterParam = param; this.filterParam = param;
} }
@ -29,7 +30,11 @@ export abstract class BaseIndexManager<Entity> extends BaseReadManager {
// }), // }),
// ); // );
new SpecificSearchFilter<Entity>(this.queryBuilder, this.tableName, this.specificFilter).getFilter(); // new SpecificSearchFilter<Entity>(
// this.queryBuilder,
// this.tableName,
// this.specificFilter,
// ).getFilter();
this.setQueryFilter(this.queryBuilder); this.setQueryFilter(this.queryBuilder);
this.result = await this.dataService.getIndex( this.result = await this.dataService.getIndex(
@ -38,7 +43,6 @@ export abstract class BaseIndexManager<Entity> extends BaseReadManager {
); );
} }
setFilterSearch(): string[] { setFilterSearch(): string[] {
return []; return [];
} }
@ -47,7 +51,6 @@ export abstract class BaseIndexManager<Entity> extends BaseReadManager {
queryBuilder: SelectQueryBuilder<Entity>, queryBuilder: SelectQueryBuilder<Entity>,
): SelectQueryBuilder<Entity>; ): SelectQueryBuilder<Entity>;
getResult(): PaginationResponse<Entity> { getResult(): PaginationResponse<Entity> {
return this.result; return this.result;
} }

View File

@ -1,6 +1,6 @@
import { BaseManager } from '../base.manager'; import { BaseManager } from '../base.manager';
import { STATUS } from 'src/core/strings/constants/base.constants'; import { STATUS } from 'src/core/strings/constants/base.constants';
import { UserPrivilegeModel } from 'src/modules/user-related/user-privilege/data/model/user-privilege.model'; import { UserPrivilegeModel } from 'src/modules/user-related/user-privilege/data/models/user-privilege.model';
export abstract class BaseUpdateStatusManager<Entity> extends BaseManager { export abstract class BaseUpdateStatusManager<Entity> extends BaseManager {
protected dataId: string; protected dataId: string;

View File

@ -1,4 +1,4 @@
import { Injectable } from '@nestjs/common'; import { CheckDuplicateHelper } from 'src/core/helpers/query/check-duplicate.helpers';
import { BaseManager } from '../base.manager'; import { BaseManager } from '../base.manager';
export abstract class BaseUpdateManager<Entity> extends BaseManager { export abstract class BaseUpdateManager<Entity> extends BaseManager {
@ -6,6 +6,7 @@ export abstract class BaseUpdateManager<Entity> extends BaseManager {
protected result: Entity; protected result: Entity;
protected duplicateColumn: string[]; protected duplicateColumn: string[];
abstract get entityTarget(): any; abstract get entityTarget(): any;
abstract get uniqueColumns(): string[];
setData(id: string, entity: Entity): void { setData(id: string, entity: Entity): void {
this.dataId = id; this.dataId = id;
@ -18,6 +19,15 @@ export abstract class BaseUpdateManager<Entity> extends BaseManager {
editor_name: this.user.name, editor_name: this.user.name,
updated_at: new Date().getTime(), updated_at: new Date().getTime(),
}); });
if (this.uniqueColumns.length) {
await new CheckDuplicateHelper(
this.dataService,
this.uniqueColumns,
this.data,
this.dataId,
).execute();
}
} }
async process(): Promise<void> { async process(): Promise<void> {