import TheMovieDb from '@server/api/themoviedb'; import Media from '@server/entity/Media'; import logger from '@server/logger'; import { mapCastCredits, mapCrewCredits, mapPersonDetails, } from '@server/models/Person'; import { Router } from 'express'; const personRoutes = Router(); personRoutes.get('/:id', async (req, res, next) => { const tmdb = new TheMovieDb(); try { const person = await tmdb.getPerson({ personId: Number(req.params.id), language: (req.query.language as string) ?? req.locale, }); return res.status(200).json(mapPersonDetails(person)); } catch (e) { logger.debug('Something went wrong retrieving person', { label: 'API', errorMessage: e.message, personId: req.params.id, }); return next({ status: 500, message: 'Unable to retrieve person.', }); } }); personRoutes.get('/:id/combined_credits', async (req, res, next) => { const tmdb = new TheMovieDb(); try { const combinedCredits = await tmdb.getPersonCombinedCredits({ personId: Number(req.params.id), language: (req.query.language as string) ?? req.locale, }); const castMedia = await Media.getRelatedMedia( combinedCredits.cast.map((result) => result.id) ); const crewMedia = await Media.getRelatedMedia( combinedCredits.crew.map((result) => result.id) ); return res.status(200).json({ cast: combinedCredits.cast .map((result) => mapCastCredits( result, castMedia.find( (med) => med.tmdbId === result.id && med.mediaType === result.media_type ) ) ) .filter((item) => !item.adult), crew: combinedCredits.crew .map((result) => mapCrewCredits( result, crewMedia.find( (med) => med.tmdbId === result.id && med.mediaType === result.media_type ) ) ) .filter((item) => !item.adult), id: combinedCredits.id, }); } catch (e) { logger.debug('Something went wrong retrieving combined credits', { label: 'API', errorMessage: e.message, personId: req.params.id, }); return next({ status: 500, message: 'Unable to retrieve combined credits.', }); } }); export default personRoutes;