pos-be/src/core/helpers/query/check-duplicate.helpers.ts

55 lines
1.7 KiB
TypeScript

import { HttpStatus, UnprocessableEntityException } from '@nestjs/common';
import { BaseDataService } from 'src/core/modules/data/service/base-data.service';
import { columnUniques } from 'src/core/strings/constants/interface.constants';
import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
export class CheckDuplicateHelper {
constructor(
private dataService: BaseDataService<any>,
private tableName: TABLE_NAME,
private duplicateColumn: columnUniques[],
private entity: any,
private entityId?: string,
) {}
async execute() {
for (const columnCheck of this.duplicateColumn) {
const queryBuilder = this.dataService
.getRepository()
.createQueryBuilder(this.tableName);
// process pengecekan column
queryBuilder.where(
`replace(trim(lower(${this.tableName}.${columnCheck.column})), ' ',' ') = :query`,
{
query: this.entity[columnCheck.column]
?.toLowerCase()
.trim()
.replace(/ +(?= )/g, ''),
},
);
// jika ingin check specific data
if (columnCheck.query) {
queryBuilder.andWhere(columnCheck.query);
}
// jika update, akan membawa id. Maka dari itu, jangan validasi diri sendiri
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: `Gagal! Data dengan ${columnCheck.column} : ${
this.entity[columnCheck.column]
} telah ada`,
error: 'Unprocessable Entity',
});
}
}
}
}