pos-be/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callba...

70 lines
2.1 KiB
TypeScript

import { EventBus, EventsHandler, IEventHandler } from '@nestjs/cqrs';
import { MidtransCallbackEvent } from 'src/modules/configuration/midtrans/domain/entities/midtrans-callback.event';
import { TransactionDataService } from '../../../data/services/transaction-data.service';
import { TransactionModel } from '../../../data/models/transaction.model';
import {
BLANK_USER,
OPERATION,
STATUS,
} from 'src/core/strings/constants/base.constants';
import { TransactionChangeStatusEvent } from '../../entities/event/transaction-change-status.event';
import * as _ from 'lodash';
import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
@EventsHandler(MidtransCallbackEvent)
export class MidtransCallbackHandler
implements IEventHandler<MidtransCallbackEvent>
{
constructor(
private dataService: TransactionDataService,
private eventBus: EventBus,
) {}
async handle(event: MidtransCallbackEvent) {
const data_id = event.data.id;
const data = event.data.data;
let old_data;
const transaction = await this.dataService.getOneByOptions({
where: {
id: data_id,
},
});
old_data = _.cloneDeep(transaction);
if (['capture', 'settlement'].includes(data.transaction_status)) {
Object.assign(transaction, {
status: STATUS.SETTLED,
settlement_date: new Date(data.settlement_time),
payment_code_reference: data.approval_code,
});
} else if (['pending'].includes(data['transaction_status'])) {
Object.assign(transaction, {
status: STATUS.PENDING,
});
} else {
Object.assign(transaction, {
status: STATUS.EXPIRED,
});
}
const queryRunner = this.dataService
.getRepository()
.manager.connection.createQueryRunner();
await this.dataService.create(queryRunner, TransactionModel, transaction);
this.eventBus.publish(
new TransactionChangeStatusEvent({
id: data_id,
old: old_data,
data: data,
user: BLANK_USER,
description: 'Midtrans Callback',
module: TABLE_NAME.TRANSACTION,
op: OPERATION.UPDATE,
}),
);
}
}