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.
41 lines
1.2 KiB
41 lines
1.2 KiB
import type {
|
|
EnrichedDataService,
|
|
InternalProvider,
|
|
MovieData,
|
|
OmdbProvider,
|
|
} from '../types';
|
|
|
|
export const createOmdbEnrichedDataService = async (
|
|
internalProvider: InternalProvider,
|
|
omdbProvider: OmdbProvider,
|
|
): Promise<EnrichedDataService> => {
|
|
const internalMetadataList = await internalProvider.getAllMetadata();
|
|
const mergedMetadataList = await Promise.all(
|
|
internalMetadataList.map(async (internalData): Promise<MovieData> => {
|
|
const omdbData = await omdbProvider.getMetadata(
|
|
internalData.imdbId,
|
|
);
|
|
|
|
if (!omdbData) {
|
|
throw new Error(
|
|
`No OMDB data found for ${internalData.imdbId}`,
|
|
);
|
|
}
|
|
|
|
return {
|
|
...omdbData,
|
|
...internalData,
|
|
ratings: [...omdbData.ratings, ...internalData.ratings],
|
|
};
|
|
}),
|
|
);
|
|
|
|
return {
|
|
getMetadataByInternalId: (requestedId) =>
|
|
mergedMetadataList.find(
|
|
({ internalId }) => internalId === requestedId,
|
|
),
|
|
getMetadataByImdbId: (requestedId) =>
|
|
mergedMetadataList.find(({ imdbId }) => imdbId === requestedId),
|
|
};
|
|
};
|
|
|