Skip to content

KoryRunoMain/java-filmorate-team

 
 

Repository files navigation

Filmorate

Описание проекта

Restful API back-end сервис рекомендаций фильмов.

Основные особенности проекта:

  • Включает базу данных H2;
  • Разработан с использованием фреймворка Spring Boot;
  • 40 доступных End-points.

Содержание:

  1. Стэк проекта
  2. Функционал
  3. ER-диаграмма
  4. Файлы базы данных
  5. SQL-запросы
  6. Ограничения полей (валидация данных)
  7. Пошаговая инструкция по установке проекта
  8. Авторы

Стэк проекта

  • 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} - Получить жанр

MPA-рейтинг фильмов (MPA возрастное ограничение)

  • 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} - Получить самые популярные фильмы по жанру и годам

ER-диаграмма

img.png

Файлы базы данных

SQL-запросы

Примеры:

Фильмы

Таблица 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;

Ограничения полей (валидация данных)

Users (пользователи)

  • "user_id" может быть только положительным;
  • "email" не может быть пустым, не может содержать пробелы. Пример: [email protected];
  • "login" не может быть пустым;
  • "name" может быть не заполнен, при этом будет использован email адрес;
  • "birthday" не может быть пустым, не может быть в будущем;

Films (фильмы)

  • "film_id" может быть только положительным;
  • "name" не может быть пустым;
  • "description" не может быть пустым, минимальная длина описания - 1 символ, максимальная длина описания — 200 символов;
  • "release" не может быть пустым, дата релиза фильма — не раньше 28 декабря 1895 года;
  • "duration" не может быть пустым, продолжительность фильма должна быть положительной;
  • "rating_id" возрастной рейтинг не может быть пустым;

Review (отзывы)

  • "content" описание не может быть пустым;
  • "userId" не может быть пустым;
  • "filmId" не может быть пустым;

Director (режиссер)

  • "name" имя не может быть пустым.

Пошаговая инструкция по установке проекта

  1. Установите Git: Если у вас еще не установлен Git, загрузите и установите его с официального сайта Git: https://git-scm.com/.
  2. Клонируйте репозиторий: Откройте командную строку или тер минал и выполните команду клонирования для репозитория GitHub. Например:
git clone https://github.com/Remsely/java-filmorate.git
  1. Откройте проект в IDE: Откройте вашу среду разработки (IDE), такую как IntelliJ IDEA, Eclipse или NetBeans.
  2. Импортируйте проект как Maven проект: Если вы используете IntelliJ IDEA, выберите File -> Open и выберите папку, в которую был склонирован репозиторий. IntelliJ IDEA должна автоматически распознать проект как Maven проект и импортировать его. В Eclipse вы можете выбрать File -> Import -> Existing Maven Projects и выбрать корневую папку проекта. В NetBeans вы можете выбрать File -> Open Project и выбрать папку проекта.
  3. Запустите приложение: точка входа находится в классе "FilmorateApplication" помеченном аннотацией @SpringBootApplication. Либо запустите через Maven:
mvn spring-boot:run

Авторы

  • "Remsely", "4IPE·he/him", "SidyakinV", "KoryRunoMain", "Anastasia-star-star"

About

Template repository for Filmorate project.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%