import { Router } from 'express'; import TheMovieDb from '../api/themoviedb'; import type { TmdbSearchMultiResponse } from '../api/themoviedb/interfaces'; import Media from '../entity/Media'; import { findSearchProvider } from '../lib/search'; import logger from '../logger'; import { mapSearchResults } from '../models/Search'; const searchRoutes = Router(); searchRoutes.get('/', async (req, res, next) => { const queryString = req.query.query as string; const searchProvider = findSearchProvider(queryString.toLowerCase()); let results: TmdbSearchMultiResponse; try { if (searchProvider) { const [id] = queryString .toLowerCase() .match(searchProvider.pattern) as RegExpMatchArray; results = await searchProvider.search({ id, language: req.locale ?? (req.query.language as string), query: queryString, }); } else { const tmdb = new TheMovieDb(); results = await tmdb.searchMulti({ query: queryString, page: Number(req.query.page), language: req.locale ?? (req.query.language as string), }); } const media = await Media.getRelatedMedia( results.results.map((result) => result.id) ); return res.status(200).json({ page: results.page, totalPages: results.total_pages, totalResults: results.total_results, results: mapSearchResults(results.results, media), }); } catch (e) { logger.debug('Something went wrong retrieving search results', { label: 'API', errorMessage: e.message, query: req.query.query, }); return next({ status: 500, message: 'Unable to retrieve search results.', }); } }); export default searchRoutes;