import { NextApiResponse } from 'next'; import { ApiMethods, ApiRoutes, NextRequestWithBody, UpdateProgressBody, UpdateTeamBody, UpdateUserBody, } from '../../src/model/api'; import { CustomResponse } from '../../src/model/common'; import { Ring } from '../../src/model/rings'; import { RingScore, Team, User } from '../../src/model/user'; import authenticateRequest from '../../src/utils/api/authenticateRequest'; const updatePhaseAndScore = async ( req: NextRequestWithBody, res: NextApiResponse>, ): Promise => { const { user, phase, ring, data, score, file } = req.body; if (!user || !user.team) { return res.status(200).json({ ok: false, error: 'No user provided' }); } const body: UpdateUserBody = { answers: user.answers?.map((ans) => ({ ...ans, ring: ans.ring.id })) || [], }; let answerToUpdate = body.answers.find((ans) => ans.ring === ring); if (answerToUpdate) { answerToUpdate.phase = phase; } else { body.answers.push({ ring, phase, }); answerToUpdate = body.answers.find((ans) => ans.ring === ring); } if (data?.testAnswers) { answerToUpdate.testAnswers = data.testAnswers; } if (data?.challengeAnswer) { answerToUpdate.challengeAnswer = data.challengeAnswer; } const response = await authenticateRequest( ApiMethods.Put, `${ApiRoutes.UpdateUser}/${user._id}`, body, ); if (score || file) { const requestBody: UpdateTeamBody = {}; if (score) { let totalScore = 0; const ringScores = score.reduce((acc, current): RingScore[] => { const { points } = current; const iteratorRing = (current.ring as Ring)?.id || current.ring; totalScore += points; const item = acc.findIndex( (it) => it.ring === iteratorRing || (it.ring as Ring)?.id === iteratorRing, ); if (item > -1) { acc[item].score += points; } else { acc.push({ ring: iteratorRing, score: points }); } return acc; }, new Array()); requestBody.score = score; requestBody.totalScore = totalScore; requestBody.ringScores = ringScores; } if (file) { requestBody.clinicCase = file; } const teamResponse = await authenticateRequest( ApiMethods.Put, `${ApiRoutes.UpdateTeam}/${user.team.id}`, requestBody, ); if (response.data && teamResponse.data) { teamResponse.data.score = teamResponse.data.score.reverse(); response.data.team = teamResponse.data; } } return res.status(200).json(response); }; export default updatePhaseAndScore;