/
max.grinenko
/
Favorite_Films
Обзор
Документация
Войти
/
max.grinenko
/
Favorite_Films
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server.js
98 строк
3 KB
max.grinenko
upload files
17 дек 2025, 20:50
17 дек 2025, 20:50
7e2cfdf
Код
Авторство
О чём код?
require("dotenv").config(); const express = require("express"); const cors = require("cors"); const { Pool } = require("pg"); const app = express(); app.use(cors()); app.use(express.json()); const db = new Pool({ user: process.env.PG_USER, password: process.env.PG_PASSWORD, host: process.env.PG_HOST, port: process.env.PG_PORT, database: process.env.PG_DATABASE, }); const OMDB_KEY = process.env.OMDB_KEY; app.get("/api/search", async (req, res) => { const q = req.query.q; if (!q) return res.json({ movies: [] }); const url = `https://www.omdbapi.com/?apikey=${OMDB_KEY}&s=${encodeURIComponent(q)}`; try { const resp = await fetch(url); const data = await resp.json(); return res.json({ movies: data.Search || [] }); } catch { return res.status(500).json({ error: "API error" }); } }); app.post("/api/add-movie", async (req, res) => { const { imdbID } = req.body; if (!imdbID) return res.status(400).json({ error: "Нет imdbID" }); try { const url = `https://www.omdbapi.com/?apikey=${OMDB_KEY}&i=${imdbID}`; const r = await fetch(url); const m = await r.json(); const q = ` INSERT INTO movies (title, year, poster) VALUES ($1, $2, $3) ON CONFLICT (title, year) DO UPDATE SET poster = EXCLUDED.poster RETURNING id; `; const dbRes = await db.query(q, [m.Title, m.Year, m.Poster]); res.json({ movie_id: dbRes.rows[0].id }); } catch { res.status(500).json({ error: "Ошибка добавления фильма" }); } }); app.post("/api/favorite", async (req, res) => { const { movie_id, rating } = req.body; if (!movie_id || !rating) return res.status(400).json({ error: "movie_id и rating обязательны" }); try { const q = ` INSERT INTO favorites (movie_id, rating) VALUES ($1, $2) ON CONFLICT (movie_id) DO UPDATE SET rating = EXCLUDED.rating RETURNING id; `; const r = await db.query(q, [movie_id, rating]); res.json({ fav_id: r.rows[0].id }); } catch { res.status(500).json({ error: "Ошибка добавления в избранное" }); } }); app.get("/api/favorites", async (req, res) => { try { const q = ` SELECT f.id AS fav_id, f.rating, m.id AS movie_id, m.title, m.year, m.poster FROM favorites f JOIN movies m ON m.id = f.movie_id ORDER BY f.id DESC; `; const r = await db.query(q); res.json(r.rows); } catch { res.status(500).json({ error: "Ошибка получения избранного" }); } }); app.delete("/api/favorite/:id", async (req, res) => { try { await db.query("DELETE FROM favorites WHERE id = $1", [req.params.id]); res.json({ ok: true }); } catch { res.status(500).json({ error: "Ошибка удаления" }); } }); app.listen(5000, () => console.log("Server running on http://localhost:5000"));