src/app/routes/onDemandTV/getInitialData/index.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import pathOr from 'ramda/src/pathOr';
import pathWithLogging, {
  LOG_LEVELS,
} from '#lib/utilities/logging/pathWithLogging';
import { TV_MISSING_FIELD } from '#lib/logger.const';
import getEpisodeAvailability, {
  getUrl,
} from '#lib/utilities/episodeAvailability';
import processRecentEpisodes from '#app/routes/utils/processRecentEpisodes';
import fetchPageData from '../../utils/fetchPageData';
import overrideRendererOnTest from '../../utils/overrideRendererOnTest';
import getPlaceholderImageUrl from '../../utils/getPlaceholderImageUrl';
import getErrorStatusCode from '../../utils/fetchPageData/utils/getErrorStatusCode';

const DEFAULT_TOGGLE_VALUE = { enabled: false, value: 4 };

const getRecentEpisodesToggle = pathOr(DEFAULT_TOGGLE_VALUE, [
  'recentVideoEpisodes',
]);

export default async ({ path: pathname, pageType, toggles }) => {
  try {
    const onDemandTvDataPath = overrideRendererOnTest(pathname);
    const { json, status } = await fetchPageData({
      path: onDemandTvDataPath,
      pageType,
    });
    const recentEpisodesToggle = getRecentEpisodesToggle(toggles);
    const { enabled: showRecentEpisodes, value: recentEpisodesLimit } =
      recentEpisodesToggle;

    const get = pathWithLogging(getUrl(json), TV_MISSING_FIELD, json);

    const episodeId = get(['content', 'blocks', 0, 'id'], LOG_LEVELS.ERROR);
    const recentEpisodes = showRecentEpisodes
      ? processRecentEpisodes(json, {
          exclude: episodeId,
          recentEpisodesLimit,
        })
      : [];

    const mediaBlocks = get(['content', 'blocks']).map(block => {
      return {
        type: 'tv',
        model: { ...block },
      };
    });

    const pageIdentifier = get([
      'metadata',
      'analyticsLabels',
      'pageIdentifier',
    ]);

    return {
      status,
      pageData: {
        metadata: {
          type: 'On Demand TV',
          atiAnalytics: {
            pageIdentifier,
          },
        },
        language: get(['metadata', 'language']),
        brandTitle: get(['metadata', 'title']),
        id: get(['metadata', 'id'], LOG_LEVELS.ERROR),
        headline: get(['promo', 'headlines', 'headline'], LOG_LEVELS.WARN),
        shortSynopsis: get(['promo', 'media', 'synopses', 'short']),
        mediumSynopsis: get(['promo', 'media', 'synopses', 'medium']),
        contentType: get(['metadata', 'analyticsLabels', 'contentType']),
        pageTitle: get(['metadata', 'analyticsLabels', 'pageTitle']),
        pageIdentifier,
        releaseDateTimeStamp: get(
          ['metadata', 'releaseDateTimeStamp'],
          LOG_LEVELS.WARN,
        ),
        durationISO8601: get([
          'promo',
          'media',
          'versions',
          0,
          'durationISO8601',
        ]),
        thumbnailImageUrl: getPlaceholderImageUrl(
          get(['promo', 'media', 'imageUrl']),
        ),
        promoBrandTitle: get(['promo', 'brand', 'title']),
        masterBrand: get(['metadata', 'createdBy'], LOG_LEVELS.ERROR),
        episodeId,
        imageUrl: get(['content', 'blocks', 0, 'imageUrl']),
        episodeAvailability: getEpisodeAvailability(json),
        episodeTitle: get(['content', 'blocks', 0, 'episodeTitle']),
        recentEpisodes,
        mediaBlocks,
      },
    };
  } catch ({ message, status = getErrorStatusCode() }) {
    return { error: message, status };
  }
};