rnegron/cc-api

View on GitHub
src/tasks/utils/persist-movies.ts

Summary

Maintainability
A
0 mins
Test Coverage
import axios from 'axios';
import * as signale from 'signale';

import checkIfMovieExists from './check-if-movie-exists';

import { CC_URL } from '../../constants';
import dbConnect from '../../database';
import { IMovieTaskData } from '../../interfaces';

import Movie, { IMovie } from '../../models/movie';

import getMovieData from '../../helpers/get-movie-data';

interface IStatusQuery {
  nowShowing: boolean;
  comingSoon: boolean;
}

export default async (movies: IMovieTaskData[], statusQuery: IStatusQuery) => {
  const dbLog = new signale.Signale({ interactive: true, scope: 'db' });

  dbLog.await('Connecting to DB...');
  await dbConnect();
  dbLog.success('DB connection successful.');

  signale.info(`Obtained ${movies.length} movies`);

  const axiosInstance = axios.create({
    baseURL: CC_URL,
  });

  for (const movieTaskData of movies) {
    // https://github.com/klaussinani/signale/issues/44#issuecomment-499476792
    console.log();

    const movieId = movieTaskData.movieId;

    const movieLog = new signale.Signale({
      interactive: true,
      scope: `Movie ID: ${movieTaskData.movieId}`,
    });

    const movieExists = await checkIfMovieExists(movieId, movieLog);

    if (movieExists) {
      movieLog.note(`Movie already exists, updating status...`);
      // Type assertion, since we checked if the movie exists already
      const movieInstance = (await Movie.findOneAndUpdate(
        { movieId },
        statusQuery
      ).exec()) as IMovie;
      movieLog.success(`Updated movie status (${movieInstance._id})`);
      continue;
    }

    let moviePayload;
    try {
      movieLog.pending(`Obtaining data for movie...`);
      const movieData = await getMovieData(movieTaskData, axiosInstance);
      moviePayload = { movieId, ...movieData };
    } catch (err) {
      movieLog.fatal(`Could not parse movie data: ${err.message}`);
      continue;
    }

    try {
      // Create and save new movie
      const movieInstance = await Movie.create({
        ...moviePayload,
        ...statusQuery,
      });

      movieLog.success(`Saved instance (${movieInstance._id})`);
    } catch (err) {
      movieLog.fatal(`Failed to save instance (${movieTaskData.movieId})`);
      continue;
    }
  }
};