pos-be/src/modules/configuration/midtrans/infrastructure/midtrans.controller.ts

100 lines
2.4 KiB
TypeScript

import {
Body,
Controller,
Get,
Injectable,
Param,
Post,
Query,
UnprocessableEntityException,
} from '@nestjs/common';
import { ApiQuery, ApiTags } from '@nestjs/swagger';
import { Public } from 'src/core/guards';
import { MidtransService } from '../data/services/midtrans.service';
import { EventBus } from '@nestjs/cqrs';
import {
MidtransCallbackEvent,
MidtransStatus,
} from '../domain/entities/midtrans-callback.event';
import { MidtransDto } from './dto/midtrans.dto';
@ApiTags(`midtrans`)
@Controller('v1/midtrans')
@Public()
@Injectable()
export class MidtransController {
constructor(
private dataService: MidtransService,
private eventBus: EventBus,
) {}
@Get(':id/status')
async getStatus(@Param('id') id: string) {
try {
const data = await this.dataService.getStatus(id);
this.eventBus.publishAll([
new MidtransCallbackEvent({
id: id,
data: data,
}),
]);
return 'Berhasil update status transaksi';
} catch (error) {
console.log(error.message);
throw new Error('Gagal update status transaksi');
}
}
@Get('sync')
async syncStatus() {
try {
const results = await this.dataService.syncPendingStatus();
for (const data of results) {
this.eventBus.publishAll([
new MidtransCallbackEvent({
id: data.order_id,
data: data,
}),
]);
}
return 'Berhasil update status transaksi';
} catch (error) {
console.log(error.message);
throw new Error('Gagal update status transaksi');
}
}
@Get(':id/change-status')
@ApiQuery({ name: 'status', enum: MidtransStatus })
async cancel(
@Param('id') id: string,
@Query('status') status = MidtransStatus.cancel,
) {
try {
return await this.dataService.changeStatus(id, status);
} catch (error) {
const data =
error.ApiResponse?.status_message ??
error.message ??
'Gagal update status transaksi';
throw new UnprocessableEntityException(data);
}
}
@Post('callback')
async callback(@Body() callback: MidtransDto) {
const data = await this.dataService.getStatus(callback?.order_id);
this.eventBus.publishAll([
new MidtransCallbackEvent({
id: data.order_id,
data: data,
}),
]);
console.log(`midtrans callback for order ${data.order_id}`);
return 'success listen callback';
}
}