pos-be/src/core/modules/domain/usecase/base.manager.ts

98 lines
2.7 KiB
TypeScript

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';
import {
EventTopics,
validateRelations,
} from 'src/core/strings/constants/interface.constants';
import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { QueryRunner } from 'typeorm';
@Injectable()
export abstract class BaseManager {
public user: UsersSession;
public dataService: any;
protected data: any;
public queryRunner: QueryRunner;
protected tableName: TABLE_NAME;
@Inject()
protected userProvider: UserProvider;
@Inject()
protected eventBus: EventBus;
abstract get validateRelations(): validateRelations[];
// sebagai optional yang dapat digunakan
public dataServiceFirstOpt: any;
// sebagai optional yang dapat digunakan
public dataServiceSecondOpt: any;
private readonly baseLog = new Logger(BaseManager.name);
setUser() {
try {
this.user = this.userProvider?.user;
} catch (error) {
this.user = BLANK_USER;
}
}
setService(dataService, tableName, dataServiceOpt = null, dataServiceSecondOpt = null) {
this.dataService = dataService;
this.tableName = tableName;
this.queryRunner = this.dataService
.getRepository()
.manager.connection.createQueryRunner(tableName);
if (dataServiceOpt) this.dataServiceFirstOpt = dataServiceOpt;
if (dataServiceSecondOpt) this.dataServiceSecondOpt = dataServiceSecondOpt;
}
abstract get eventTopics(): EventTopics[];
async execute(): Promise<void> {
try {
this.setUser();
this.queryRunner.startTransaction();
this.baseLog.verbose('prepareData');
await this.prepareData();
if (!this.dataService) {
throw new Error('data or service not implemented.');
}
this.baseLog.verbose('validateProcess');
await this.validateProcess();
this.baseLog.verbose('beforeProcess');
await this.beforeProcess();
this.baseLog.verbose('process');
await this.process();
this.baseLog.verbose('afterProcess');
await this.afterProcess();
this.baseLog.verbose('commitTransaction');
await this.queryRunner.commitTransaction();
await this.queryRunner.release();
} catch (e) {
if (e.response) throw new Error(JSON.stringify(e.response));
else throw new Error(e.message);
}
}
abstract prepareData(): Promise<void>;
abstract validateProcess(): Promise<void>;
abstract beforeProcess(): Promise<void>;
abstract process(): Promise<void>;
abstract afterProcess(): Promise<void>;
}