Restful API back-end сервис рекомендаций фильмов.
- Включает базу данных H2;
- Разработан с использованием фреймворка Spring Boot;
- 40 доступных End-points.
- Стэк проекта
- Функционал
- ER-диаграмма
- Файлы базы данных
- SQL-запросы
- Ограничения полей (валидация данных)
- Пошаговая инструкция по установке проекта
- Авторы
- Java 11, Spring Boot, Maven, Lombok, Junit, JDBC, JdbcTest, SQL, H2, Postman
- Тесты: .postman-test
- GET /films - Получить все фильмы
- GET /films/{id} - Получить фильм
- POST /films - Добавить фильм
- PUT /films - Обновить фильм
- DELETE /films/{id} - Удалить фильм
- GET /genres - Получить все жанры
- GET /genres/{id} - Получить жанр
- GET /mpa - Получить все рейтинги фильмов
- GET /mpa/{id} - Получить рейтинг
- GET /directors - Получить всех режиссеров
- GET /directors/{id} - Получить режиссера
- POST /directors - Добавить режиссера
- PUT /directors - Обновить режиссера
- DELETE /directors/{id} - Удалить режиссера
- GET /users - Получить всех пользователей
- GET /users/{id} - Получить пользователя
- POST /users - Добавить пользователя
- PUT /users - Обновить пользователя
- DELETE /users/{id} - Удалить пользователя
- PUT /films/{id}/like/{userId} - Добавить лайк фильму;
- DELETE /films/{id}/like/{userId} - Удалить лайк фильма;
- GET /users/{id}/friends - Получить список друзей пользователя
- GET /users/{id}/friends/common/{otherId} - Получить список общих друзей с пользователем
- PUT /users/{id}/friends/{friendId} - Добавить пользователя в друзья
- DELETE /users/{id}/friends/{friendId} - Удалить пользователя из друзей
- GET /reviews?filmId={filmId}&count={count} - Получить все отзывы фильма (count - количество отзывов)
- GET /reviews/{id} - Получить отзыв
- POST /reviews - Добавить отзыв
- PUT /reviews/{id}/like/{userId} - Поставить лайк отзыву
- PUT /reviews/{id}/dislike/{userId} - Поставить дизлайк отзыву
- PUT /reviews - Обновить отзыв
- DELETE /reviews/{id}/like/{userId} - Удалить лайк/дизлайк отзыва
- DELETE /reviews/{id}/dislike/{userId} - Удалить дизлайк отзыва
- DELETE /reviews/{id} - Удалить отзыв
- GET /fimls/search - Получить список фильмов по названию фильмов и по режиссёру
- GET /films/common?userId={userId}&friendId={friendId} - Получить общие с другом фильмы с сортировкой по их популярности
- GET /users/{id}/recommendations - Получить рекомендации по фильмам для просмотра
- GET /users/{id}/feed - Получить ленту событий пользователя
- GET /films/director/{directorId}?sortBy=[year,likes] - Получить список фильмов режиссера по количеству лайков/году выпуска
- GET /films/popular?count={limit}&genreId={genreId}&year={year} - Получить самые популярные фильмы по жанру и годам
Таблица film
- Получить все фильмы
SELECT *
FROM film;
- Получить фильм
SELECT *
FROM film
WHERE film_id = ?;
- Получить популярные фильмы (count - топ фильмов)
SELECT f.*
FROM film AS f
LEFT JOIN (SELECT film_id, COUNT(*) AS like_count
FROM like_film
GROUP BY film_id) l ON f.film_id = l.film_id
ORDER BY l.like_count DESC
LIMIT ?;
- Получить рейтинг фильмов режиссера по количеству лайков или году выпуска
SELECT f.film_id
FROM film f
JOIN film_director fd ON f.film_id = fd.film_id
(sortBy != null && "year".equals(sortBy) ? "WHERE fd.director_id = ?
ORDER BY f.release" :
LEFT JOIN like_film lf ON f.film_id = lf.film_id
WHERE fd.director_id = ?
GROUP BY f.film_id
ORDER BY COUNT(lf.film_id) DESC");
- Добавить фильм
INSERT INTO film (name, description, rating_id, release, duration)
VALUES (?, ?, ?, ?, ?);
- Обновить фильм
UPDATE film
SET name = ?,
description = ?,
rating_id = ?,
release = ?,
duration = ?
WHERE film_id = ?;
- Добавить лайк фильму
INSERT INTO like_film (film_id, user_id)
VALUES (?, ?);
- Удалить лайк фильма
DELETE FROM like_film
WHERE film_id = ? AND user_id = ?;
- Удалить фильм
DELETE FROM film
WHERE film_id = ?;
- Проверить фильма
SELECT COUNT(*)
FROM film WHERE film_id = ?;
Таблица mpa_rating
- Получить все рейтинги фильмов
SELECT *
FROM mpa_rating;
- Получить рейтинг
SELECT *
FROM mpa_rating
WHERE rating_id = ?;
- Проверить рейтинг
SELECT COUNT(*)
FROM mpa_rating
WHERE rating_id = ?;
Таблица genre
- Получить все жанры
SELECT *
FROM genre;
- Получить жанр
SELECT *
FROM genre WHERE genre_id = ?;
- Получить все жанры фильма
SELECT *
FROM film_genre
WHERE film_id = ?;
- Проверить жанр
SELECT COUNT(*)
FROM genre
WHERE genre_id = ?;
Таблица film_genre
- Получить жанр фильма
SELECT genre_id
FROM film_genre
WHERE film_id = ?;
- Добавить жанры фильму
INSERT INTO film_genre (film_id, genre_id)
VALUES (?, ?);
- Обновить жанры фильма
INSERT INTO film_genre (film_id, genre_id)
VALUES (?, ?);
- Удалить жанр фильма
DELETE FROM film_genre
WHERE film_id = ? AND genre_id = ?;
- Удалить все жанры фильма
DELETE FROM film_genre
WHERE film_id = ?;
Таблица user_data
- Добавить пользователя
INSERT INTO user_data (name, login, email, birthday)
VALUES (?, ?, ?, ?);
- Обновить пользователя
UPDATE user_data
SET name = ?,
login = ?,
email = ?,
birthday = ?
WHERE user_id = ?;
- Получить пользователя
SELECT *
FROM user_data
WHERE user_id = ?;
- Получить всех пользователей
SELECT *
FROM user_data;
- Проверить пользователя
SELECT COUNT(*)
FROM user_data
WHERE user_id = ?;
Таблица like_film
Примеры:
- Получить лайки пользователя
SELECT user_id
FROM like_film WHERE film_id = ?;
- Добавить лайк фильму
INSERT INTO like_film (film_id, user_id)
VALUES (?, ?);
- Удалить лайк фильма
DELETE FROM like_film
WHERE film_id = ? AND user_id = ?;
Таблица follow
- Добавить в друзья В друзьях
UPDATE follow
SET approved = ?
WHERE target_id = ? AND follower_id = ?;
Не в друзьях
INSERT INTO follow (target_id, follower_id, approved)
VALUES (?, ?, ?);
- Удалить из друзей В друзьях пользователя
DELETE FROM follow
WHERE target_id = ? AND follower_id = ?;
В друзьях у пользователя
UPDATE follow
SET approved = ?
WHERE target_id = ? AND follower_id = ?;
Не в друзьях
DELETE FROM follow
WHERE target_id = ? AND follower_id = ?;
- Получить всех друзей
SELECT *
FROM user_data
WHERE user_id IN (SELECT target_id
FROM follow
WHERE follower_id = ?
AND approved = true)
OR user_id IN (SELECT follower_id
FROM follow
WHERE target_id = ?);
- Получить общих друзей с другим пользователем
SELECT u1.user_id, u1.email, u1.login, u1.birthday, u1.name
FROM (SELECT *
FROM user_data
WHERE user_id IN (SELECT target_id
FROM follow
WHERE follower_id = ?
AND approved = TRUE)
OR user_id IN (SELECT follower_id
FROM follow
WHERE target_id = ?)
) AS u1
INNER JOIN (SELECT *
FROM user_data
WHERE user_id IN (SELECT target_id
FROM follow
WHERE follower_id = ?
AND approved = TRUE)
OR user_id IN (SELECT follower_id
FROM follow
WHERE target_id = ?)
) AS u2 ON u1.user_id = u2.user_id;
- Получить id дорузей
SELECT user_id
FROM user_data
WHERE user_id IN (SELECT target_id
FROM follow
WHERE follower_id = ?
AND approved = TRUE)
OR user_id IN (SELECT follower_id
FROM follow
WHERE target_id = ?);
- Проверить дружбу двух пользователей
SELECT COUNT(*)
FROM follow
WHERE target_id = ? AND follower_id = ? AND approved = ?;
Таблица director
- Получить всех режиссеров
SELECT *
FROM director;
- Получить режиссера
SELECT *
FROM director
WHERE director_id = ?;
- Добавить режиссера
INSERT INTO director (name)
VALUES (?);
- Обновить режиссера
UPDATE director SET name = ?
WHERE director_id = ?;
- Удалить режиссера
DELETE FROM director
WHERE director_id = ?;
- Проверить режиссера
SELECT COUNT(*)
FROM director
WHERE director_id = ?;
Таблица film_director
- Получить всех режиссеров фильма
SELECT *
FROM film_director
WHERE film_id = ?;
- Добавить режиссера к фильму
INSERT INTO film_director (film_id, director_id)
VALUES (?, ?);
- Удалить режиссеров фильма
DELETE FROM film_director
WHERE film_id = ?;
- Проверить режиссера фильма в БД
SELECT COUNT(*)
FROM film_director
WHERE director_id = ? AND film_id = ?;
Таблица review
- Добавить отзыв
INSERT INTO review (content, user_id, film_id, is_positive)
VALUES (?, ?, ?, ?);
- Обновить отзыв
UPDATE review
SET content = ?, is_positive = ?
WHERE review_id = ?;
- Получить отзывФ
SELECT review_id, content, user_id, film_id, is_positive,
IFNULL((SELECT sum(CASE usefull WHEN true THEN 1 ELSE -1 END)
FROM like_review
WHERE review_id = r.review_id), 0) AS useful
FROM review as r
WHERE review_id = ?;
- Получить все отзывы
SELECT review_id, content, user_id, film_id, is_positive,
IFNULL((SELECT sum(CASE usefull WHEN true THEN 1 ELSE -1 END)
FROM like_review
WHERE review_id = r.review_id), 0) AS useful
FROM review as r
ORDER BY useful DESC
LIMIT ?;
- Получить отзывы фильма
SELECT review_id, content, user_id, film_id, is_positive,
IFNULL((SELECT sum(CASE usefull WHEN true THEN 1 ELSE -1 END)
FROM like_review
WHERE review_id = r.review_id), 0) AS useful
FROM review as r
WHERE film_id = ?
ORDER BY useful DESC
LIMIT ?;
- Удалить отзыв
DELETE FROM review
WHERE review_id = ?;
- Проверить отзыв
SELECT review_id
FROM review
WHERE review_id = ?;
Таблица like_review
- Добавить лайк отзыву
MERGE INTO like_review (user_id, review_id, usefull)
VALUES (?, ?, true);
- Добавить дизлайк отзыву
MERGE INTO like_review (user_id, review_id, usefull)
VALUES (?, ?, false);
- Удалить лайк отзыва
DELETE FROM like_review
WHERE user_id = ? AND review_id = ?;
- Удалить дизлайк отзыва
DELETE FROM like_review WHERE user_id = ? AND review_id = ?
Таблица user_event
- Получить ленту событий пользователя
SELECT f.event_id,
f.user_id,
f.entity_id,
f.time, o.name
AS operation_name, et.name
AS type_name
FROM feed f
JOIN event_operation eo ON f.operation_id = eo.operation_id
JOIN event_type et ON f.type_id = et.type_id
WHERE f.user_id = ?
ORDER BY f.time;
Таблица user_event
- По названию фильма
SELECT *
FROM film
WHERE LOWER(name) LIKE ?;
- По режиссерам
SELECT f.*
FROM FILM f
JOIN FILM_DIRECTOR fd ON f.FILM_ID = fd.FILM_ID
JOIN DIRECTOR d ON d.DIRECTOR_ID = fd.DIRECTOR_ID
WHERE LOWER(d.NAME) LIKE ?;
- По году
SELECT film.film_id
FROM film
JOIN film_director ON film.film_id = film_director.film_id
WHERE film_director.director_id = ?
ORDER BY film.release;
- По лайкам
SELECT film.film_id
FROM film
JOIN film_director ON film.film_id = film_director.film_id
LEFT JOIN like_film ON film.film_id = like_film.film_id
WHERE film_director.director_id = ?
GROUP BY film.film_id
ORDER BY COUNT(like_film.film_id) DESC;
Таблица user_event
- По жанру и году
SELECT f.film_id
FROM film f
JOIN film_director fd ON f.film_id = fd.film_id
(sortBy != null && "year".equals(sortBy) ? "WHERE fd.director_id = ?
ORDER BY f.release" :
LEFT JOIN like_film lf ON f.film_id = lf.film_id
WHERE fd.director_id = ?
GROUP BY f.film_id
ORDER BY COUNT(lf.film_id) DESC;
- "user_id" может быть только положительным;
- "email" не может быть пустым, не может содержать пробелы. Пример: [email protected];
- "login" не может быть пустым;
- "name" может быть не заполнен, при этом будет использован email адрес;
- "birthday" не может быть пустым, не может быть в будущем;
- "film_id" может быть только положительным;
- "name" не может быть пустым;
- "description" не может быть пустым, минимальная длина описания - 1 символ, максимальная длина описания — 200 символов;
- "release" не может быть пустым, дата релиза фильма — не раньше 28 декабря 1895 года;
- "duration" не может быть пустым, продолжительность фильма должна быть положительной;
- "rating_id" возрастной рейтинг не может быть пустым;
- "content" описание не может быть пустым;
- "userId" не может быть пустым;
- "filmId" не может быть пустым;
- "name" имя не может быть пустым.
- Установите Git: Если у вас еще не установлен Git, загрузите и установите его с официального сайта Git: https://git-scm.com/.
- Клонируйте репозиторий: Откройте командную строку или тер минал и выполните команду клонирования для репозитория GitHub. Например:
git clone https://github.com/Remsely/java-filmorate.git
- Откройте проект в IDE: Откройте вашу среду разработки (IDE), такую как IntelliJ IDEA, Eclipse или NetBeans.
- Импортируйте проект как Maven проект: Если вы используете IntelliJ IDEA, выберите File -> Open и выберите папку, в которую был склонирован репозиторий. IntelliJ IDEA должна автоматически распознать проект как Maven проект и импортировать его. В Eclipse вы можете выбрать File -> Import -> Existing Maven Projects и выбрать корневую папку проекта. В NetBeans вы можете выбрать File -> Open Project и выбрать папку проекта.
- Запустите приложение: точка входа находится в классе "FilmorateApplication" помеченном аннотацией @SpringBootApplication. Либо запустите через Maven:
mvn spring-boot:run
- "Remsely", "4IPE·he/him", "SidyakinV", "KoryRunoMain", "Anastasia-star-star"