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 {
Inject,
Injectable,
Logger,
} from '@nestjs/common';
import { Inject, Injectable, Logger } from '@nestjs/common';
import { EventBus } from '@nestjs/cqrs';
import { UserProvider, UsersSession } from 'src/core/sessions';
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 { Injectable } from '@nestjs/common';
export abstract class BaseCreateManager<Entity> extends BaseManager {
protected result: Entity;
protected duplicateColumn: string[];
abstract get entityTarget(): any;
abstract get uniqueColumns(): string[];
setData(entity: Entity): void {
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> {
this.result = await this.dataService.create(
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 {
HttpStatus,
Injectable,
UnprocessableEntityException,
} from '@nestjs/common';
import { HttpStatus, UnprocessableEntityException } from '@nestjs/common';
import { BaseManager } from '../base.manager';
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 {
protected dataId: string;
protected result: Entity;

View File

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

View File

@ -1,6 +1,6 @@
import { BaseManager } from '../base.manager';
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 {
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';
export abstract class BaseUpdateManager<Entity> extends BaseManager {
@ -6,6 +6,7 @@ export abstract class BaseUpdateManager<Entity> extends BaseManager {
protected result: Entity;
protected duplicateColumn: string[];
abstract get entityTarget(): any;
abstract get uniqueColumns(): string[];
setData(id: string, entity: Entity): void {
this.dataId = id;
@ -18,6 +19,15 @@ export abstract class BaseUpdateManager<Entity> extends BaseManager {
editor_name: this.user.name,
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> {