import { Body, Controller, Post, UseGuards } from '@nestjs/common' import { subDays } from 'date-fns' import { isEmpty, isNil, omit } from 'lodash' import { Anthropometry, Competition, CompetitionCompetitor } from '../../../models' import { BasicAuthorizationGuard } from '../../../guards' import { CompetitionService } from '../../../services/ranking' import { BaseEventParams } from '../../../params' import { parseISO } from '../../../utils/date' import { AcceptInviteCompetitionParams, CreateCompetitionParams } from './params' @UseGuards(BasicAuthorizationGuard) @Controller('ranking/competition') export class CompetitionController { constructor(private readonly competitionService: CompetitionService) {} @Post('/create') async create(@Body() { input, session_variables }: CreateCompetitionParams): Promise> { const competition = await this.competitionService.create({ title: input.title, category: input.category, willEndAt: parseISO(input.will_end_at), patientId: session_variables['x-hasura-user-id'], }) return omit(competition, 'winner_id', 'winner') } @Post('/acceptInvite') async acceptInvite( @Body() { input, session_variables }: AcceptInviteCompetitionParams, ): Promise> { const competition = await this.competitionService.acceptInvite({ competitionId: input.competition_id, patientId: session_variables['x-hasura-user-id'], }) return omit(competition, 'winner_id', 'winner') } @Post('/cron/finish') async finish(): Promise { await this.competitionService.finish(subDays(new Date(), 1)) } @Post('/notify/acceptInvite') async notifyAcceptInvite(@Body() { event }: BaseEventParams): Promise { const competitionCompetitor = event.data.new || event.data.row await this.competitionService.notifyAcceptInvite(CompetitionCompetitor.toInstance(competitionCompetitor)) } @Post('/updatePatientCompetitions') async updatePatientCompetitions(@Body() { event }: BaseEventParams): Promise { const anthropometry = event.data.new || event.data.row await this.competitionService.generateNewScoreForAllCompetitions({ patientId: anthropometry.patient_id, anthropometryId: anthropometry.id, }) } @Post('/sort') async sort(@Body() { event }: BaseEventParams): Promise { const data = event.data.new || event.data.row const patientId = data?.patient_id || data?.id if (isEmpty(patientId)) return if (!isNil(data?.patient_id) && data.cancellation_at === null) return await this.competitionService.generatePositionsAndSort(patientId) } }