From d95037e61674ac17408fbba33ecb633dae4f0baa Mon Sep 17 00:00:00 2001 From: Foxix Date: Thu, 16 Jan 2025 16:28:35 +0000 Subject: [PATCH] Update 2 files - /src/routes/movies.js - /src/index.js --- src/index.js | 35 ++++++++---- src/routes/movies.js | 127 ++++++++++++++++++++----------------------- 2 files changed, 84 insertions(+), 78 deletions(-) diff --git a/src/index.js b/src/index.js index f10fecb..d38af86 100644 --- a/src/index.js +++ b/src/index.js @@ -71,15 +71,22 @@ const swaggerOptions = { const swaggerDocs = swaggerJsdoc(swaggerOptions); // CORS configuration -app.use(cors({ - origin: true, - credentials: true, - methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], - allowedHeaders: ['X-Requested-With', 'Content-Type', 'Authorization', 'Accept'] -})); +const corsOptions = { + origin: [ + 'http://localhost:3000', + 'https://neo-movies.vercel.app', + /\.vercel\.app$/ + ], + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'], + credentials: true, + optionsSuccessStatus: 200 +}; + +app.use(cors(corsOptions)); // Handle preflight requests -app.options('*', cors()); +app.options('*', cors(corsOptions)); // Middleware app.use(express.json()); @@ -90,15 +97,21 @@ app.use((req, res, next) => { try { const token = process.env.TMDB_ACCESS_TOKEN; if (!token) { - throw new Error('TMDB_ACCESS_TOKEN is not set'); + console.error('TMDB_ACCESS_TOKEN is not set'); + return res.status(500).json({ + error: 'Server configuration error', + details: 'API token is not configured' + }); } + + console.log('Initializing TMDB client...'); req.tmdb = new TMDBClient(token); next(); } catch (error) { - console.error('TMDB Client Error:', error); + console.error('Failed to initialize TMDB client:', error); res.status(500).json({ - error: 'Failed to initialize TMDB client', - message: process.env.NODE_ENV === 'development' ? error.message : undefined + error: 'Server initialization error', + details: error.message }); } }); diff --git a/src/routes/movies.js b/src/routes/movies.js index b950ec7..7c75241 100644 --- a/src/routes/movies.js +++ b/src/routes/movies.js @@ -613,19 +613,62 @@ router.get('/:id/videos', async (req, res) => { /** * @swagger - * /movies/genre/{id}: + * /movies/genres: * get: - * summary: Фильмы по жанру - * description: Получает список фильмов определенного жанра + * summary: Получение списка жанров + * description: Возвращает список всех доступных жанров фильмов + * tags: [movies] + * responses: + * 200: + * description: Список жанров + */ +router.get('/genres', async (req, res) => { + try { + console.log('Fetching genres...'); + const response = await req.tmdb.getGenres(); + + if (!response?.data?.genres) { + console.error('Invalid genres response:', response); + return res.status(500).json({ + error: 'Invalid response from TMDB', + details: 'Genres data is missing' + }); + } + + console.log('Genres response:', { + count: response.data.genres.length, + genres: response.data.genres + }); + + res.json(response.data); + } catch (error) { + console.error('Error fetching genres:', { + message: error.message, + response: error.response?.data, + stack: error.stack + }); + + res.status(500).json({ + error: 'Failed to fetch genres', + details: error.response?.data?.status_message || error.message + }); + } +}); + +/** + * @swagger + * /movies/discover: + * get: + * summary: Получение фильмов по жанру + * description: Возвращает список фильмов определенного жанра * tags: [movies] * parameters: - * - in: path - * name: id + * - in: query + * name: with_genres * required: true * description: ID жанра * schema: * type: integer - * example: 28 * - in: query * name: page * description: Номер страницы @@ -633,44 +676,23 @@ router.get('/:id/videos', async (req, res) => { * type: integer * minimum: 1 * default: 1 - * example: 1 - * responses: - * 200: - * description: Список фильмов - * content: - * application/json: - * schema: - * type: object - * properties: - * page: - * type: integer - * results: - * type: array - * items: - * $ref: '#/components/schemas/Movie' - * 404: - * description: Жанр не найден - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * 500: - * description: Ошибка сервера - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' */ -router.get('/genre/:id', async (req, res) => { +router.get('/discover', async (req, res) => { try { - const { id } = req.params; - const { page = 1 } = req.query; + const { with_genres, page = 1 } = req.query; - console.log('Fetching movies by genre:', { id, page }); + if (!with_genres) { + return res.status(400).json({ + error: 'Missing required parameter', + details: 'Genre ID is required' + }); + } + + console.log('Fetching movies by genre:', { with_genres, page }); const response = await req.tmdb.makeRequest('get', '/discover/movie', { params: { - with_genres: id, + with_genres, page, language: 'ru-RU', 'vote_count.gte': 100, @@ -705,33 +727,4 @@ router.get('/genre/:id', async (req, res) => { } }); -/** - * @swagger - * /movies/genres: - * get: - * summary: Получение списка жанров - * description: Возвращает список всех доступных жанров фильмов - * tags: [movies] - * responses: - * 200: - * description: Список жанров - */ -router.get('/genres', async (req, res) => { - try { - console.log('Fetching genres...'); - const response = await req.tmdb.makeRequest('get', '/genre/movie/list', { - language: 'ru-RU' - }); - - console.log('Genres response:', response.data); - res.json(response.data); - } catch (error) { - console.error('Error fetching genres:', error.response?.data || error.message); - res.status(500).json({ - error: 'Failed to fetch genres', - details: error.response?.data?.status_message || error.message - }); - } -}); - module.exports = router; \ No newline at end of file