import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common' import { pick } from 'lodash' import { TotemAuthorizationGuard } from '../../../guards' import { CompressedBioimpedance, Country, SmartfitTeacher, SmartfitUnit, User } from '../../../models' import { keepNumbers } from '../../../utils' import { Countries, MeasurementTotem, Nutritionist, Plans, TotemPatient } from '../domain' import { TotemPlan } from '../models' import { ConfirmSubscriptionResponse } from '../type' import { AddBioimpedanceParams, ConfirmSubscriptionParams, CountryCodeParams, GetParams, IdParams } from './params' const CENTAURO_ACRONYM_PREFIX = 'CTARO' @UseGuards(TotemAuthorizationGuard) @Controller('measurement-totem') export class MeasurementTotemController { constructor( private readonly measurementTotem: MeasurementTotem, private readonly nutritionist: Nutritionist, private readonly countries: Countries, private readonly plans: Plans, ) {} @Post('get-patient') async getPatient( @Body() { login, unit_acronym }: GetParams, ): Promise<{ patient: TotemPatient; bioimpedance_credit: number } | TotemPatient> { const isCentauroUnit = unit_acronym?.startsWith(CENTAURO_ACRONYM_PREFIX) const { patient, bioimpedance_credit } = await this.measurementTotem.getPatientAndCredits( this.keepNumbersIfDocumentNumber(login), isCentauroUnit, ) if (unit_acronym) return { patient, bioimpedance_credit } return patient } @Post('subscribe') async subscribe(@Body() { login }: GetParams): Promise<{ masked_email: string }> { const mask = await this.plans.subscribe(this.keepNumbersIfDocumentNumber(login)) return { masked_email: mask } } @Post('confirm-subscription') async confirmSubscription(@Body() params: ConfirmSubscriptionParams): Promise { return this.plans.confirmAndSubscribe({ ...params, login: this.keepNumbersIfDocumentNumber(params.login), }) } @Post('add-bioimpedance') async addBioimpedance( @Body() { login, smartfitUnitId, bioimpedance, name, userIds, smartfitTeacherId }: AddBioimpedanceParams, ): Promise<{ created: boolean }> { const created = await this.measurementTotem.addBioimpedance({ login: this.keepNumbersIfDocumentNumber(login), smartfitUnitId: +smartfitUnitId, name: name?.trim(), compressedBioimpedance: new CompressedBioimpedance(bioimpedance), userIds, smartfitTeacherId, }) return { created } } @Get('countries') async getCountries(): Promise>> { return await this.countries.getCountries() } @Get('smartfit-units/:countryCode?') async getSmartfitUnits(@Param() { countryCode }: CountryCodeParams): Promise> { return this.measurementTotem.getSmartFitUnits(countryCode) } @Get('smartfit-units/:id/teachers') async getSmartfitUnitTeachers(@Param() { id }: IdParams): Promise> { return this.measurementTotem.getSmartFitUnitTeachers(+id) } @Get('nutritionists/:countryCode?') async getNutritionists(@Param() { countryCode }: CountryCodeParams): Promise>> { return (await this.nutritionist.getNutritionists(countryCode)).map(nutri => pick(nutri, ['id', 'name'])) } @Get('plans/:countryCode?') async getPlans(@Param() { countryCode }: CountryCodeParams): Promise> { return this.plans.getPlans({ countryCode }) } private keepNumbersIfDocumentNumber(login: string): string { if (!login.includes('@')) login = keepNumbers(login) return login.trim() } }