import { isEmpty, isNil } from 'lodash' import { BioimpedanceWithWeight } from '../models' import { CompetitionRepository, CompetitionCompetitorRepository, CompetitionHistoryRepository, } from '../../../repositories' import { Competition, CompetitionCategories } from '../../../models/ranking' import { RequiredArgumentError } from '../../../errors/required_argument.error' import { LanguageCountryCode } from '../../../utils/countries' import { CompetitionCompetitorFactory } from './competition-competitor.factory' type CompetitionFactoryParams = { title: string category: CompetitionCategories patientId: string willEndAt: Date language?: LanguageCountryCode bioimpedance?: BioimpedanceWithWeight competitionRepository: CompetitionRepository competitionCompetitorRepository: CompetitionCompetitorRepository competitionHistoryRepository?: CompetitionHistoryRepository } export class CompetitionFactory { static async build({ title, category, patientId, willEndAt, language, bioimpedance, competitionRepository, competitionCompetitorRepository, competitionHistoryRepository, }: CompetitionFactoryParams): Promise { if (isEmpty(title)) throw new RequiredArgumentError('title') if (isEmpty(category)) throw new RequiredArgumentError('category') if (isEmpty(patientId)) throw new RequiredArgumentError('patientId') if (isNil(willEndAt)) throw new RequiredArgumentError('willEndAt') if (isNil(competitionRepository)) throw new RequiredArgumentError('competitionRepository') const competition = await competitionRepository.create( Competition.toInstance({ title, category, patient_id: patientId, will_end_at: willEndAt, created_at: new Date(), }), { language }, ) competition.competitors = [ await CompetitionCompetitorFactory.build({ competition, position: 1, bioimpedance, competitionCompetitorRepository, competitionHistoryRepository, }), ] return competition } }