import { Body, Controller, Post, UseGuards } from '@nestjs/common' import { parseISO } from 'date-fns' import { Payment } from '../../../services/n2b-payments/types' import { InvoiceInstallment, InvoiceWithOrigin, N2BPaymentNotification, N2BPaymentRefundNotification, } from '../domain/types' import { Subscription } from '../domain' import { ThirdPartyAuthorizationGuard } from '../../../guards' import { N2BPaymentNotificationParam } from './params' @UseGuards(ThirdPartyAuthorizationGuard) @Controller('api-payment/subscription') export class SubscriptionController { constructor(private readonly subscription: Subscription) {} @Post('/handle') async handle(@Body() notification: N2BPaymentNotificationParam): Promise { if (notification.type === 'payment') return this.subscription.updateSubscriberStatus(this.parsePaymentParam(notification)) if (notification.type === 'refund') return this.subscription.expiresSubscription(this.parseRefundParam(notification)) return } private parsePaymentParam(notification: N2BPaymentNotificationParam): N2BPaymentNotification { const invoice_installment = this.parseInstallmentParams(notification.invoice_installment) return { ...notification, paid_at: notification.paid_at ? parseISO(notification.paid_at.toString()) : null, invoice_installment: invoice_installment as InvoiceInstallment, } } private parseRefundParam(notification: N2BPaymentNotificationParam): N2BPaymentRefundNotification { const invoice_pay = this.parsePaymentParams(notification.invoice_pay) return { ...notification, refunded_at: notification.refunded_at ? parseISO(notification.refunded_at.toString()) : null, invoice_pay, } } private parseInstallmentParams = (installment: InvoiceInstallment): InvoiceInstallment => ({ ...installment, due_date: installment.due_date ? parseISO(installment.due_date.toString()) : null, paid_at: installment.paid_at ? parseISO(installment.paid_at.toString()) : null, cancelled_at: installment.cancelled_at ? parseISO(installment.cancelled_at.toString()) : null, invoice: this.parseInvoiceParams(installment.invoice), }) private parsePaymentParams = ( payment: Payment & { invoice_installment: InvoiceInstallment }, ): Payment & { invoice_installment: InvoiceInstallment } => ({ ...payment, paid_at: payment.paid_at ? parseISO(payment.paid_at.toString()) : null, invoice_installment: this.parseInstallmentParams(payment.invoice_installment), }) private parseInvoiceParams = (invoice: InvoiceWithOrigin): InvoiceWithOrigin => ({ ...invoice, issued_at: invoice.issued_at ? parseISO(invoice.issued_at.toString()) : null, concluded_at: invoice.concluded_at ? parseISO(invoice.concluded_at.toString()) : null, cancelled_at: invoice.cancelled_at ? parseISO(invoice.cancelled_at.toString()) : null, subscription: { ...invoice.subscription, issued_at: invoice.subscription.issued_at ? parseISO(invoice.subscription.issued_at.toString()) : null, expires_at: invoice.subscription.expires_at ? parseISO(invoice.subscription.expires_at.toString()) : null, expired_at: invoice.subscription.expired_at ? parseISO(invoice.subscription.expired_at.toString()) : null, cancelled_at: invoice.subscription.cancelled_at ? parseISO(invoice.subscription.cancelled_at.toString()) : null, }, }) }