import { Controller, Post, Body, UseGuards } from '@nestjs/common' import { classToPlain, plainToClass } from 'class-transformer' import { omit } from 'lodash' import { Accounts, Booking } from '../domain' import { AuthBaseParams } from '../../../params' import { User } from '../../../models' import { BasicAuthorizationGuard } from '../../../guards' import { parseISO } from '../../../utils/date' import { InactiveNutriParams, RedirectNutriParams, ResetPasswordParams, SignInParams, SignUpParams } from './params' @UseGuards(BasicAuthorizationGuard) @Controller('nutritionists') export class NutritionistsController { constructor(private readonly accounts: Accounts, private readonly booking: Booking) {} @Post('sign_up') async signUp(@Body() params: SignUpParams): Promise<{ token: string }> { const signUpResult = await this.accounts.createNutritionist( plainToClass(User, omit(classToPlain(params.input.user), ['password'])), params.input.user.password, ) return { token: signUpResult.token } } @Post('sign_in') async signIn(@Body() params: SignInParams): Promise<{ token: string }> { return this.accounts.authenticateNutritionist(params.input.credentials.email, params.input.credentials.password) } @Post('reset_password') async resetPassword(@Body() params: ResetPasswordParams): Promise<{ success: boolean }> { await this.accounts.sendResetPasswordEmail(params.input.email) return { success: true } } @Post('remove_auth_user') async removeAuthUser(@Body() { session_variables }: AuthBaseParams): Promise<{ success: boolean }> { await this.accounts.removeAuthUser(plainToClass(User, { id: session_variables['x-hasura-user-id'] })) return { success: true } } @Post('redirect_nutri') async redirect_nutri(@Body() { input }: RedirectNutriParams): Promise<{ success: boolean }> { await this.booking.transferUserAppointments(input.user_id, parseISO(input.date)) return { success: true } } @Post('inactive_nutri') async inactive_nutri(@Body() { input }: InactiveNutriParams): Promise<{ success: boolean }> { await this.booking.transferAllUserAppointments(input.user_id) await this.accounts.inactiveNutritionist(input.user_id) return { success: true } } }