/java-filmorate

Movie service for selecting, commenting, liking, finding popular films, adding friends, and receiving movie recommendations based on friends' likes.

Primary LanguageJava

Filmorate

Данный проект - это сервис для кинотеки, который дает возможность пользователям выбирать, комментировать и оценивать любимые фильмы, а также искать наиболее популярные среди них. Кроме того, на сервисе можно добавлять друзей и получать рекомендации на основе их лайков.

Оглавление

База данных

Схема БД

Примеры запросов

Для фильмов:

  • Создание фильма:
INSERT INTO films (name,
                   description,
                   release_date,
                   duration_in_minutes,
                   mpa_rating_id)
VALUES (?, ?, ?, ?, ?);
  • Обновление фильма:
UPDATE
    films
SET name                = ?,
    description         = ?,
    release_date        = ?,
    duration_in_minutes = ?,
    mpa_rating_id       = ?
WHERE film_id = ?;
  • Получение фильма по идентификатору:
SELECT f.film_id,
       f.name,
       f.description,
       f.release_date,
       f.duration_in_minutes,
       mp.name AS mpa_rating,
       g.name  AS genre
FROM films f
         JOIN mpa_ratings mp ON f.mpa_rating_id = mp.mpa_rating_id
         JOIN film_genres fg ON f.film_id = fg.film_id
         JOIN genres g ON fg.genre_id = g.genre_id
WHERE f.film_id = ?;
  • Получение всех фильмов:
SELECT f.film_id,
       f.name,
       f.description,
       f.release_date,
       f.duration_in_minutes,
       mp.name              AS mpa_rating,
       GROUP_CONCAT(g.name) AS genres
FROM films f
         JOIN mpa_ratings mp ON f.mpa_rating_id = mp.mpa_rating_id
         JOIN film_genres fg ON f.film_id = fg.film_id
         JOIN genres g ON fg.genre_id = g.genre_id
GROUP BY f.film_id;
  • Получение топ-N (по количеству лайков) фильмов:
SELECT f.film_id,
       f.name,
       f.description,
       f.release_date,
       f.duration_in_minutes,
       mp.name           AS mpa_rating,
       g.name            AS genre,
       COUNT(fl.user_id) AS like_count
FROM films f
         JOIN mpa_ratings mp ON f.mpa_rating_id = mp.mpa_rating_id
         JOIN film_genres fg ON f.film_id = fg.film_id
         JOIN genres g ON fg.genre_id = g.genre_id
         LEFT JOIN film_likes fl ON f.film_id = fl.film_id
GROUP BY f.film_id,
         mp.name,
         g.name
ORDER BY like_count DESC LIMIT ?;

Для пользователей:

  • Создание пользователя:
INSERT INTO users (email,
                   login,
                   name,
                   birthday)
VALUES (?, ?, ?, ?)
  • Обновление пользователя:
UPDATE
    users
SET email    = ?,
    login    = ?,
    name     = ?,
    birthday = ?
WHERE user_id = ?
  • Получение пользователя по идентификатору:
SELECT *
FROM users
WHERE user_id = ?
  • Получение всех пользователей:
SELECT *
FROM users

Для жанров:

  • Получение жанра по идентификатору:
SELECT *
FROM genres
WHERE genre_id = ?
  • Получение всех жанров:
SELECT *
FROM genres

Для рейтингов MPA:

  • Получение рейтинга MPA по идентификатору:
SELECT *
FROM mpa_ratings
WHERE mpa_rating_id = ?
  • Получение всех рейтингов MPA:
SELECT *
FROM mpa_ratings

Валидация

Входные данные, поступающие в запросе, должны соответствовать определенным критериям:

Для фильмов:

  • Название фильма должно быть указано и не может быть пустым
  • Максимальная длина описания фильма не должна превышать 200 символов
  • Дата релиза фильма должна быть не раньше 28 декабря 1895 года1
  • Продолжительность фильма должна быть положительной
  • Рейтинг фильма должен быть указан

Для пользователей:

  • Электронная почта пользователя должна быть указана и соответствовать формату email
  • Логин пользователя должен быть указан и не содержать пробелов
  • Дата рождения пользователя должна быть указана и не может быть в будущем

Инструкция по установке

Требования

  • Apache Maven 3.6.0 или выше
  • Git
  • JDK 11 или выше

Установка

  1. Склонируйте репозиторий на свой компьютер с помощью команды:
git clone https://github.com/BucketOnHead/java-filmorate.git
  1. Перейдите в директорию проекта:
cd java-filmorate
  1. Соберите проект с помощью Apache Maven:
mvn clean install

Запуск

После установки проекта, вы можете запустить его с помощью команды:

mvn spring-boot:run

Технологический стек

  • Java 11
  • Spring boot 2
  • JDBC, SQL, H2
  • Apache Maven

Footnotes

  1. 28 декабря 1895 года считается днём рождения кино.