import { isNil } from 'lodash' import { BioimpedanceWithWeight } from '../models' import { CalculatorFactory } from '../factory' import { CompetitionHistoryRepository } from '../../../repositories' import { Competition, CompetitionCompetitor, CompetitionHistory } from '../../../models/ranking' import { RequiredArgumentError, UnprocessableEntityError } from '../../../errors' type CompetitionHistoryFactoryParams = { bioimpedance: BioimpedanceWithWeight competition: Competition competitor: CompetitionCompetitor competitionHistoryRepository: CompetitionHistoryRepository position?: number } export class CompetitionHistoryFactory { static async build({ bioimpedance, competition, competitor, competitionHistoryRepository, position, }: CompetitionHistoryFactoryParams): Promise { if (isNil(bioimpedance)) throw new RequiredArgumentError('bioimpedance') if (isNil(competitionHistoryRepository)) throw new RequiredArgumentError('competitionHistoryRepository') if (isNil(competitor?.id)) throw new UnprocessableEntityError('Competitor has not an id') const calculator = CalculatorFactory.build(competition.category) const { score, value } = calculator.calcule({ bioimpedance, competitor }) const history = CompetitionHistory.toInstance({ competitor_id: competitor.id, score, value, position: position || undefined, done_at: bioimpedance.done_at, created_at: new Date(), updated_at: new Date(), }) await competitionHistoryRepository.create(history) return history } }