import { Injectable } from '@nestjs/common' import { isNil } from 'lodash' import { BioimpedanceCreditService, CreditService, TeleconsultationsCreditService } from '../../../services/credits' import { BusinessExceptionError } from '../../../errors/business_exception.error' import { CreditAuthor, Patient, Products } from '../../../models' import { PatientRepository } from '../../../repositories/patient.repository' type AditionalData = { externalId?: string } @Injectable() export class Credits { constructor( private readonly bioimpedanceCreditService: BioimpedanceCreditService, private readonly teleconsultationsCreditService: TeleconsultationsCreditService, private readonly patientRepository: PatientRepository, ) {} async add( identifier: Partial & AditionalData, productCode: Products, author: CreditAuthor = { type: 'system' }, ): Promise { const patient = await this.getPatient(identifier) const service = this.getCreditServiceByProduct(productCode) await service.createTransaction({ patientId: patient.id, reason: 'single_buy', value: 1, author, identifier: { documentNumber: patient.document_number, email: patient.email, externalId: identifier.externalId, }, }) } private async getPatient(patientData: Partial): Promise { const patient = Patient.toInstance(patientData) const result = await this.patientRepository.findByLogin(patient.login) if (!isNil(result)) return result return patient } private getCreditServiceByProduct(productCode: Products): CreditService { if (productCode === Products.BIOIMPEDANCE) return this.bioimpedanceCreditService if (productCode === Products.TELECONSULTATIONS) return this.teleconsultationsCreditService throw new BusinessExceptionError('Invalid product') } }