feat(payments): support web and mobile platform for Telebirr initiation

This commit is contained in:
Abubeker Yasin
2026-05-23 05:07:24 +03:00
parent b67cb8610e
commit 5d5ec6b766
4 changed files with 34 additions and 12 deletions

View File

@@ -5,7 +5,7 @@ import { TicketsService } from '../tickets/tickets.service';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Prisma, PaymentIntentStatus, PaymentMethodType } from '@prisma/client';
import { InitiatePaymentDto, RefundDto, AddPaymentMethodDto, InitiateResponseDto, IntentStatusDto } from './payments.dto';
import { PaymentProvider, ProviderStatus } from './payments.types';
import { ClientAction, PaymentProvider, ProviderStatus } from './payments.types';
import { TelebirrProvider } from './providers/telebirr.provider';
import { CbeBirrProvider } from './providers/cbe-birr.provider';
import { EBirrProvider } from './providers/ebirr.provider';
@@ -66,7 +66,7 @@ export class PaymentsService {
const provider = this.providers.get(method);
if (provider) {
return this.initiateProviderPayment(booking, provider);
return this.initiateProviderPayment(booking, provider, dto.platform);
}
throw new BadRequestException(`Unsupported payment method: ${method}`);
@@ -139,6 +139,7 @@ export class PaymentsService {
private async initiateProviderPayment(
booking: Prisma.BookingGetPayload<{ include: { seats: true } }>,
provider: PaymentProvider,
platform: 'web' | 'mobile' | undefined,
): Promise<InitiateResponseDto> {
const merchantOrderId = createMerchantOrderId();
const result = await provider.initiate({
@@ -146,6 +147,7 @@ export class PaymentsService {
bookingRef: booking.bookingRef,
amountMinor: booking.totalMinor,
currency: booking.currency,
platform,
});
const intent = await this.prisma.paymentIntent.upsert({
@@ -184,7 +186,7 @@ export class PaymentsService {
): InitiateResponseDto {
const clientAction =
intent.clientAction && typeof intent.clientAction === 'object'
? (intent.clientAction as unknown as { type: 'REDIRECT'; url: string })
? (intent.clientAction as unknown as ClientAction)
: undefined;
return {
intentId: intent.id,