import { Body, Controller, Post, UseGuards } from '@nestjs/common' import { plainToClass } from 'class-transformer' import { isNil } from 'lodash' import { BasicAuthorizationGuard } from '../../../guards' import { Message, User } from '../../../models' import { ReleaseNote } from '../../../models/release_note.model' import { BaseEventParams } from '../../../params' import { Nutritionists } from '../domain' import { UserStatusUpdate } from '../models' @UseGuards(BasicAuthorizationGuard) @Controller('notification/nutritionist') export class NutritionistController { constructor(private nutritionists: Nutritionists) {} @Post('new-message') async notifyNewMessage(@Body() { event }: BaseEventParams): Promise { if (!isNil(event.data.new.replied_by_user_id)) return await this.nutritionists.notifyNewMessage(event.data.new.user_id, event.data.new.patient_id) } @Post('new-release') async notifyNewRelease(@Body() { event }: BaseEventParams): Promise { const releaseNote = plainToClass(ReleaseNote, event.data.new) await this.nutritionists.notifyNewRelease(releaseNote) } @Post('new-sign-up') async notifyNewSignUp(@Body() { event }: BaseEventParams): Promise { const user = plainToClass(User, event.data.new) await this.nutritionists.notifyNewSignUp(user) } @Post('status-update') async notifyStatusUpdate(@Body() { event }: BaseEventParams): Promise { const newUser = plainToClass(User, event.data.new) const oldUser = plainToClass(User, event.data.old) const status = this.getStatusUpdateFromTrigger({ newUser, oldUser }) if (isNil(status)) { await this.nutritionists.notifyNewSignUp(newUser) } else { await this.nutritionists.notifyStatusUpdate(newUser, status) } } private getStatusUpdateFromTrigger({ newUser, oldUser }: { newUser: User; oldUser: User }): UserStatusUpdate { if (newUser.approved_at && !oldUser.approved_at) { return UserStatusUpdate.approved } else if (newUser.reproved_at && !oldUser.reproved_at) { return !newUser.isActive ? UserStatusUpdate.reproved_final : UserStatusUpdate.reproved } else if (newUser.activated_at && !oldUser.activated_at) { return UserStatusUpdate.activated } else if (oldUser.reproved_at && !newUser.reproved_at) { return null } } }