77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import { Injectable, UnprocessableEntityException } from '@nestjs/common';
|
|
import { BaseDataService } from 'src/core/modules/data/service/base-data.service';
|
|
import { validateRelations } from 'src/core/strings/constants/interface.constants';
|
|
|
|
@Injectable()
|
|
export class ValidateRelationHelper<Entity> {
|
|
constructor(
|
|
private dataId: string,
|
|
private dataService: BaseDataService<Entity>,
|
|
private relations: validateRelations[],
|
|
private tableName: string,
|
|
) { }
|
|
|
|
async execute() {
|
|
const repository = this.dataService.getRepository();
|
|
const queryBuilder = repository.createQueryBuilder(this.tableName);
|
|
|
|
// load relation
|
|
for (const relation of this.relations) {
|
|
if (relation.singleQuery) {
|
|
queryBuilder.leftJoinAndMapOne(
|
|
`${ this.tableName }.${ relation.relation }`,
|
|
`${ this.tableName }.${ relation.relation }`,
|
|
relation.relation,
|
|
)
|
|
}
|
|
else if (relation.query) {
|
|
queryBuilder.loadRelationCountAndMap(
|
|
`${ this.tableName }.total_${ relation.relation }`,
|
|
`${ this.tableName }.${ relation.relation }`,
|
|
`total_${ relation.relation }`,
|
|
relation.query,
|
|
);
|
|
}
|
|
else {
|
|
queryBuilder.loadRelationCountAndMap(
|
|
`${ this.tableName }.total_${ relation.relation }`,
|
|
`${ this.tableName }.${ relation.relation }`,
|
|
`total_${ relation.relation }`,
|
|
);
|
|
}
|
|
}
|
|
|
|
// filtering data only with specific data
|
|
queryBuilder.where(`${ this.tableName }.id in ('${ this.dataId }')`);
|
|
|
|
// get data
|
|
const data = await queryBuilder.getOne();
|
|
|
|
// process validasi
|
|
for (const relation of this.relations) {
|
|
const message =
|
|
relation.message ??
|
|
`Failed! this data already connected to ${ relation.relation }`;
|
|
|
|
if (relation.singleQuery) {
|
|
const relationColumn = data[relation.relation]?.[`${ relation.singleQuery[0] }`]
|
|
if (this.mappingValidator(relationColumn, relation.singleQuery[1], relation.singleQuery[2]))
|
|
throw new UnprocessableEntityException(message);
|
|
} else if (data[`total_${ relation.relation } `])
|
|
throw new UnprocessableEntityException(message);
|
|
}
|
|
}
|
|
|
|
mappingValidator(column, operator, value) {
|
|
switch (operator) {
|
|
case '!=':
|
|
return column != value;
|
|
|
|
case '==':
|
|
return column == value;
|
|
|
|
default:
|
|
return column == value;
|
|
}
|
|
}
|
|
} |