import { Body, Controller, Post, UseGuards } from '@nestjs/common' import { plainToClass } from 'class-transformer' import { isNil } from 'lodash' import { BasicAuthorizationGuard } from '../../../guards' import { PaymentProviders, Subscription, SubscriptionTransaction } from '../../../models' import { BaseEventParams } from '../../../params' import { Subscriptions } from '../domain' @Controller('notification/subscription') export class SubscriptionController { constructor(private subscriptions: Subscriptions) {} @UseGuards(BasicAuthorizationGuard) @Post('cancelled') async notifySubscriptionCancelled(@Body() { event }: BaseEventParams): Promise { const subscription = plainToClass(Subscription, event.data.new) const old = plainToClass(Subscription, event.data.old) if (isNil(old.expiresAt) && !isNil(subscription.expiresAt)) await this.subscriptions.notifyCancelled(subscription) } @UseGuards(BasicAuthorizationGuard) @Post('new') async notifyNewSubscription(@Body() { event }: BaseEventParams): Promise { const subscription = plainToClass(Subscription, event.data.new) if (!isNil(subscription.expiresAt) && subscription.paymentProvider === PaymentProviders.N2B) await this.subscriptions.notifyNew(subscription) } @UseGuards(BasicAuthorizationGuard) @Post('transaction/new') async notifyTransaction(@Body() { event }: BaseEventParams): Promise { const transaction = SubscriptionTransaction.toInstance(event.data.new) const old = SubscriptionTransaction.toInstance(event.data.old) if ( transaction.payment_provider !== PaymentProviders.N2B || transaction.amount < 0 || isNil(transaction.subscription_id) ) return if (transaction.status === 'failed' && transaction.error_message !== old?.error_message) return this.subscriptions.notifyFailedOverduePayment(transaction) if (transaction.status === 'success' && transaction.paid_at !== old?.paid_at) return this.subscriptions.notifySuccessOverduePayment(transaction) } }