visible/visible

View on GitHub
packages/@visi/web-server/src/application/interactors/create-diagnosis-interactor.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { isURL } from 'class-validator';
import { inject, injectable } from 'inversify';
import * as uuid from 'uuid';

import { Diagnosis, Status } from '../../domain/models';
import { Logger } from '../../domain/services';
import { TYPES } from '../../types';
import { DiagnosisRepository, StatsRepository } from '../repositories';
import {
  CreateDiagnosisRequest,
  CreateDiagnosisResponse,
  CreateDiagnosisUseCase,
} from '../use-cases';

@injectable()
export class CreateDiagnosisInteractor implements CreateDiagnosisUseCase {
  constructor(
    @inject(TYPES.Logger)
    private readonly logger: Logger,

    @inject(TYPES.DiagnosisRepository)
    private readonly diagnosisRepository: DiagnosisRepository,

    @inject(TYPES.StatsRepository)
    private readonly statsRepository: StatsRepository,
  ) {}

  async run(params: CreateDiagnosisRequest): Promise<CreateDiagnosisResponse> {
    this.logger.info(`Creating diagnosis for ${params.url}`);

    if (!isURL(params.url, { require_protocol: true })) {
      throw new Error(`Invalid URL ${params.url} given`);
    }

    const stats = await this.statsRepository.fetch();

    const diagnosis = Diagnosis.from({
      id: uuid.v4(),
      status: Status.QUEUED,
      url: params.url,
      sources: [],
      totalCount: 0,
      doneCount: 0,
      createdAt: new Date(),
      updatedAt: new Date(),
      waitingCountAtCreation: stats.diagnosisWaitingCount,
      completeCountAtCreation: stats.diagnosisCompleteCount,
    });

    this.logger.debug(diagnosis.toString());

    await this.diagnosisRepository.save(diagnosis);
    await this.diagnosisRepository.queue(diagnosis);
    this.logger.info(`Diagnosis ${diagnosis.id} were created and queued`);

    return { diagnosis };
  }
}