100 lines
2.4 KiB
TypeScript
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';
|
|
}
|
|
}
|