import { Body, Controller, Post, UseGuards } from '@nestjs/common' import { SQSRecord } from 'aws-lambda' import { isEmpty } from 'lodash' import { AdminAuthorizationGuard, BasicAuthorizationGuard, OnlyProductionGuard } from '../../../guards' import { PushPayload } from '../../../services' import { isNotBlank } from '../../../utils' import { Notifications } from '../domain/notifications' import { SendManualParams } from './params' const FLUTTER_ACTION = 'FLUTTER_NOTIFICATION_CLICK' @Controller('notification') export class NotificationController { constructor(private notifications: Notifications) {} async processNotificationsQueue(record: SQSRecord): Promise { await this.notifications.deleteMessage(record) await this.notifications.sendMessage(JSON.parse(record.body)) } @UseGuards(BasicAuthorizationGuard, OnlyProductionGuard) @Post('reports/process') async processDeliveryReport(): Promise { return this.notifications.processNotificationReports() } @UseGuards(AdminAuthorizationGuard) @Post('send/manual') async sendManual(@Body() { title, body, device_ids, page }: SendManualParams): Promise { if (isEmpty(device_ids)) return const payload = new PushPayload({ notification: { title, body, }, }) if (isNotBlank(page)) payload.data = { click_action: FLUTTER_ACTION, page, } await this.notifications.sendPushNotification(device_ids, payload) } }