Small Nest.js-based project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

94 lines
3.4 KiB

import type { NormalizedOmdbData } from '../../../types';
import { createTargetHelpers, identity } from '../../../utils/objectHelpers';
import type { RawOmdbData } from './types';
const { createRequiredField, createOptionalField } =
createTargetHelpers<NormalizedOmdbData>([null, '', 'N/A']);
const stringToArray = (value: string) => value.split(', ');
const stringToNumber = (value: string) => parseInt(value, 10);
const stringToDuration = (value: string) => {
const match = /^(?<time>\d+)\smin$/.exec(value);
if (!match) {
throw new Error(`Cannot parse duration: "${value}"`);
}
// Both `groups` and `groups['time']` are guaranteed to be defined because of regex definition, but TS doesn't know that.
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return stringToNumber(match.groups!['time']!);
};
const omdbRatingsToNormalizedRatings = (ratings: RawOmdbData['Ratings']) =>
ratings.map(({ Source, Value }) => ({ source: Source, value: Value }));
export const normalizeRawOmdbData = (
rawOmdbData: RawOmdbData,
): NormalizedOmdbData => {
const {
Actors,
Awards,
BoxOffice,
Country,
DVD,
Director,
Episode,
Genre,
Language: _language,
Metascore: _metascore,
Plot,
Poster,
Production: _production,
Rated,
Ratings,
Released,
Runtime,
Season,
Title,
Type,
Website,
Writer,
Year,
imdbID,
imdbRating: _imdbRating,
imdbVotes: _imdbVotes,
seriesID,
totalSeasons,
...rest
} = rawOmdbData;
const restKeys = Object.keys(rest);
if (restKeys.length) {
throw new Error(
`Unexpected fields in OMDB response: ${restKeys.join(', ')}`,
);
}
return {
...createRequiredField('actors', Actors, stringToArray),
...createOptionalField('awards', Awards, identity),
...createOptionalField('boxOffice', BoxOffice, identity),
...createOptionalField('contentRating', Rated, identity),
...createRequiredField('description', Plot, identity),
...createOptionalField('directors', Director, stringToArray),
...createRequiredField('duration', Runtime, stringToDuration),
...createOptionalField('dvdReleaseDate', DVD, identity),
...createOptionalField('episodeNumber', Episode, stringToNumber),
...createRequiredField('genres', Genre, stringToArray),
...createRequiredField('imdbId', imdbID, identity),
...createRequiredField('posterUrl', Poster, identity),
...createRequiredField('productionCountries', Country, stringToArray),
...createRequiredField('productionYear', Year, stringToNumber),
...createRequiredField(
'ratings',
Ratings,
omdbRatingsToNormalizedRatings,
),
...createRequiredField('releaseDate', Released, identity),
...createOptionalField('seasonNumber', Season, stringToNumber),
...createOptionalField('seriesImdbId', seriesID, identity),
...createRequiredField('title', Title, identity),
...createOptionalField('totalSeasons', totalSeasons, stringToNumber),
...createRequiredField('type', Type, identity),
...createOptionalField('website', Website, identity),
...createRequiredField('writers', Writer, stringToArray),
};
};