mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-27 17:38:51 +05:00
Update 2 files
- /src/routes/movies.js - /src/index.js
This commit is contained in:
35
src/index.js
35
src/index.js
@@ -71,15 +71,22 @@ const swaggerOptions = {
|
|||||||
const swaggerDocs = swaggerJsdoc(swaggerOptions);
|
const swaggerDocs = swaggerJsdoc(swaggerOptions);
|
||||||
|
|
||||||
// CORS configuration
|
// CORS configuration
|
||||||
app.use(cors({
|
const corsOptions = {
|
||||||
origin: true,
|
origin: [
|
||||||
credentials: true,
|
'http://localhost:3000',
|
||||||
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
'https://neo-movies.vercel.app',
|
||||||
allowedHeaders: ['X-Requested-With', 'Content-Type', 'Authorization', 'Accept']
|
/\.vercel\.app$/
|
||||||
}));
|
],
|
||||||
|
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
||||||
|
allowedHeaders: ['Content-Type', 'Authorization'],
|
||||||
|
credentials: true,
|
||||||
|
optionsSuccessStatus: 200
|
||||||
|
};
|
||||||
|
|
||||||
|
app.use(cors(corsOptions));
|
||||||
|
|
||||||
// Handle preflight requests
|
// Handle preflight requests
|
||||||
app.options('*', cors());
|
app.options('*', cors(corsOptions));
|
||||||
|
|
||||||
// Middleware
|
// Middleware
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
@@ -90,15 +97,21 @@ app.use((req, res, next) => {
|
|||||||
try {
|
try {
|
||||||
const token = process.env.TMDB_ACCESS_TOKEN;
|
const token = process.env.TMDB_ACCESS_TOKEN;
|
||||||
if (!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);
|
req.tmdb = new TMDBClient(token);
|
||||||
next();
|
next();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('TMDB Client Error:', error);
|
console.error('Failed to initialize TMDB client:', error);
|
||||||
res.status(500).json({
|
res.status(500).json({
|
||||||
error: 'Failed to initialize TMDB client',
|
error: 'Server initialization error',
|
||||||
message: process.env.NODE_ENV === 'development' ? error.message : undefined
|
details: error.message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -613,19 +613,62 @@ router.get('/:id/videos', async (req, res) => {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
* /movies/genre/{id}:
|
* /movies/genres:
|
||||||
* get:
|
* get:
|
||||||
* summary: Фильмы по жанру
|
* summary: Получение списка жанров
|
||||||
* description: Получает список фильмов определенного жанра
|
* 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]
|
* tags: [movies]
|
||||||
* parameters:
|
* parameters:
|
||||||
* - in: path
|
* - in: query
|
||||||
* name: id
|
* name: with_genres
|
||||||
* required: true
|
* required: true
|
||||||
* description: ID жанра
|
* description: ID жанра
|
||||||
* schema:
|
* schema:
|
||||||
* type: integer
|
* type: integer
|
||||||
* example: 28
|
|
||||||
* - in: query
|
* - in: query
|
||||||
* name: page
|
* name: page
|
||||||
* description: Номер страницы
|
* description: Номер страницы
|
||||||
@@ -633,44 +676,23 @@ router.get('/:id/videos', async (req, res) => {
|
|||||||
* type: integer
|
* type: integer
|
||||||
* minimum: 1
|
* minimum: 1
|
||||||
* default: 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 {
|
try {
|
||||||
const { id } = req.params;
|
const { with_genres, page = 1 } = req.query;
|
||||||
const { 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', {
|
const response = await req.tmdb.makeRequest('get', '/discover/movie', {
|
||||||
params: {
|
params: {
|
||||||
with_genres: id,
|
with_genres,
|
||||||
page,
|
page,
|
||||||
language: 'ru-RU',
|
language: 'ru-RU',
|
||||||
'vote_count.gte': 100,
|
'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;
|
module.exports = router;
|
||||||
Reference in New Issue
Block a user