Skip to content

Приложение на Spring Boot с базой данных H2 для хранения и управления информацией о фильмах

Notifications You must be signed in to change notification settings

kirshumir01/java-filmorate

Repository files navigation

Filmorate

Read this on English.

Описание


Представьте, что вы решили отдохнуть и провести вечер за просмотром фильма. Вкусная еда уже готовится, ваш любимый плед уютно свернулся в кресле — а вы все еще не выбрали, что посмотреть!

Фильмов много и с каждым годом их становится все больше. Чем их больше, тем больше разных оценок. Чем больше оценок, тем сложнее сделать выбор. Однако сейчас не время сдаваться!

Filmorate — сервис, который работает с фильмами и оценками пользователей, предлагает список наиболее популярных фильмов, рекомендованных к просмотру. Теперь ни вам, ни вашим друзьям не придется долго думать, что посмотреть вечером.

Структура проекта и функциональность


  • фильмы:

    • модель данных: название, описание, дата релиза, продолжительность, рейтинг MPA, жанры, количество оценок пользователей;
    • валидация данных: название не может быть пустым, максимальная длина описания — 200 символов, дата релиза — не раньше 28 декабря 1895 года, продолжительность фильма должна быть положительным числом;
    • действия: добавление, обновление, хранение, получение и удаление;
    • функционал: назначение и удаление "лайков" пользователями, получение пользователем списка наиболее популярных фильмов.
  • пользователи:

    • модель данных: имя, логин, email, дата рождения;
    • валидация данных: электронная почта не может быть пустой и должна содержать символ @, логин не может быть пустым и содержать пробелы, имя для отображения может быть пустым — в таком случае будет использован логин, дата рождения не может быть в будущем;
    • действия: добавление, обновление, хранение, получение и удаление;
    • функционал: добавление в друзья, удаление из друзей, получение полного списка друзей, получение списка общих друзей пользователей.
  • жанры:

    • модель данных: наименование;
    • валидация данных: название не может быть пустым;
    • действия: получение информации о всех жанрах фильма, получение жанра по id.
  • рейтинг MPA:

    • модель данных: наименование;
    • валидация данных: название не может быть пустым;
    • действия: получение информации о рейтинге фильма, получение рейтинга по id.
  • жанры фильмов:

    • комедия;
    • драма;
    • мультфильм;
    • триллер;
    • документальный;
    • боевик.
  • рейтинги фильмов:

    • G — у фильма нет возрастных ограничений;
    • PG — детям рекомендуется смотреть фильм с родителями;
    • PG-13 — детям до 13 лет просмотр не желателен;
    • R — лицам до 17 лет просматривать фильм можно только в присутствии взрослого;
    • NC-17 — лицам до 18 лет просмотр запрещён.

Обработка исключений

  • ошибки валидации данных - код ответа 400 Bad Request;
  • ошибки валидации аргументов метода - код ответа 400 Bad Request;
  • ошибки поиска объекта - код ответа 404 Not Found;
  • внутренние ошибки сервера - код ответа 500 Internal Server Error.

Инструменты и технологии


  • фреймворк: Spring Boot 3.2.4:
    • spring-boot-starter-web;
    • spring-boot-starter-validation;
    • spring-boot-starter-jdbc;
    • spring-boot-starter-test.
  • аннотирование классов приложения: Lombok
  • логирование HTTP-запросов и ответов: Logbook 3.7.2
  • хранение данных (рабочий режим): H2 Database
  • хранение данных (режим тестирования): память приложения
  • сборка и управление зависимостями: Apache Maven 3.9.9
  • версия Java: 21

Схема базы данных приложения (ER-диаграмма)


ER-diagram

Примеры запросов в базу данных



Получение списка всех фильмов
SELECT *
FROM films;
film_id name description release_date duration mpa_rating_id
1 Гладиатор Римская империя. Бесстрашного и благородного генерала Максимуса боготворят солдаты, а старый император Марк Аврелий безгранично доверяет ему и относится как к сыну. 2000-05-01 155 4
2 Титаник
В первом и последнем плавании шикарного «Титаника» встречаются двое. Пассажир нижней палубы Джек выиграл билет в карты, а богатая наследница Роза отправляется в Америку, чтобы выйти замуж по расчёту. 1997-11-01 194 3

Получение списка всех пользователей
SELECT *
FROM users;
user_id email login name birthday
1 user1@ya.ru user1 Николай 1990-02-12
2 user2@ya.ru user2 Кирилл 1993-11-01
3 user3@ya.ru user3 Петр 1997-03-08

Получение списка MPA рейтинга
SELECT *
FROM mpa_ratings;
mpa_rating_id name
1 G
2 PG
3 PG-13
4 R
5 NC-17

Получение списка жанров
SELECT *
FROM genres;
name genre_id
Комедия 1
Драма 2
Мультфильм 3
Триллер 4
Документальный 5
Боевик 6

Получение списка фильмов и их жанров
SELECT f.name,
       g.name
FROM films f
         LEFT JOIN film_genres fg ON f.film_id = fg.film_id
         LEFT JOIN genres g ON fg.genre_id = g.genre_id;
name name
Гладиатор Драма
Гладиатор Боевик
Титаник
Драма

Получение списка популярных фильмов по лайкам
SELECT f.name,
       count(f.name) likes
FROM films f
         LEFT JOIN likes l ON f.film_id = l.film_id
GROUP BY f.name
ORDER BY count(f.name) DESC;
name likes
Гладиатор 4
Титаник
3

Получение всего списка друзей
SELECT *
FROM users
         LEFT JOIN friendship f ON users.user_id = f.friend_id;
user_id email login name birthday user_id friend_id friendship_status
1 user1@ya.ru user1 Николай 1990-02-12 1 2 true
1 user2@ya.ru user2 Кирилл 1993-11-01 2 1 true
2 user3@ya.ru user3 Петр 1997-03-08 3 1 true

Получение списка друзей Николая
SELECT *
FROM users
WHERE user_id IN (SELECT f.friend_id
                  FROM users u
                           JOIN friendship f ON u.user_id = f.user_id
                  WHERE u.user_id = 1);
user_id email login name birthday
2 user2@ya.ru user2 Кирилл 1993-11-01
3 user3@ya.ru user3 Петр 1997-03-08

Получение списка общих друзей Кирилла и Петра
SELECT *
FROM users
WHERE user_id IN
      (SELECT friend_id
       FROM users u
                JOIN friendship f ON u.user_id = f.user_id
       WHERE u.user_id = 2
         AND f.is_confirmed = 'true')
  AND user_id IN
      (SELECT friend_id
       FROM users u
                JOIN friendship f ON u.user_id = f.user_id
       WHERE u.user_id = 3
         AND f.is_confirmed = 'true');
user_id email login name birthday
1 user1@ya.ru user1 Николай 1990-02-12

Инструменты для запуска приложения


  • Java Development Kit (JDK) - версия 21 или более поздняя;
  • Apache Maven - версия 3.9.9 или более поздняя.

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

Ниже приведены инструкции по установке JDK 21 на различных операционных системах.


Установка на macOS

Установите Homebrew запуском следующей команды в терминале (командной строке) операционной системы:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Установите JDK 21 с помощью Homebrew:

brew install openjdk@21

Создайте символическую ссылку, чтобы система могла найти JDK:

sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk

Добавьте JDK 21 в PATH. Откройте файл .zshrc (или .bash_profile, в зависимости от используемой оболочки) и добавьте следующую строку:

echo 'export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc

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

source ~/.zshrc

Проверьте установленную версию Java:

java -version

Установка на Linux

Откройте терминал и выполните команду для обновления списка пакетов:

sudo apt update

Установите JDK 21:

sudo apt install openjdk-21-jdk

Убедитесь, что JDK установлен и настроен корректно:

java -version

Установка на Windows
  1. Скачайте установочный файл JDK 21 с официального сайта Oracle или OpenJDK.

  2. Запустите установочный файл и следуйте инструкциям установщика.

  3. После установки настройте переменную среды JAVA_HOME:

  • откройте Системные настройки > Переменные среды;
  • в разделе Системные переменные нажмите Создать и введите:
    • имя переменной: JAVA_HOME
    • значение переменной: путь к установленной JDK (например, C:\Program Files\Java\jdk-21).
  • добавьте JAVA_HOME\bin в переменную Path.
  1. Проверьте версию Java в командной строке:
java -version

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

Ниже приведены инструкции по установке Maven на различных операционных системах.


Установка на macOS

Установите Homebrew, если он еще не установлен:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Установите Maven с помощью Homebrew:

brew install maven

Проверьте версию Maven, чтобы убедиться в правильной установке:

mvn -version

Установка на Linux

Откройте терминал и загрузите Apache Maven 3.9.9:

wget https://downloads.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

Распакуйте архив:

tar xzvf apache-maven-3.9.9-bin.tar.gz

Переместите распакованную папку в директорию /opt/:

sudo mv apache-maven-3.9.9 /opt/maven

Добавьте Maven в PATH. Откройте файл .bashrc или .zshrc и добавьте следующую строку:

export PATH=/opt/maven/bin:$PATH

Примените изменения:

source ~/.bashrc

Проверьте версию Maven:

mvn -version

Установка на Windows
  1. Скачайте установочный архив Maven 3.9.9 с официального сайта.

  2. Распакуйте архив в удобное место, например C:\Program Files\Maven.

  3. Настройте переменные среды:

  • откройте Системные настройки > Переменные среды.
  • в разделе Системные переменные нажмите Создать и добавьте:
    • имя переменной: MAVEN_HOME
    • значение переменной: путь к папке Maven, например C:\Program Files\Maven.
  • найдите переменную Path, выберите ее и нажмите Изменить. Добавьте новый путь: %MAVEN_HOME%\bin.
  1. Перезапустите командную строку и проверьте версию Maven:
mvn -version

Подготовка к запуску приложения


ВАЖНО! Запуск приложения осуществляется через системный порт 8080. Перед запуском убедитесь, что порт 8080 свободен!

Как проверить, что системный порт свободен?

Ниже приведены инструкции по проверке порта на различных операционных системах.


Проверка порта на macOS

Откройте терминал.

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

lsof -i :PORT

Если порт занят, команда выведет список процессов, использующих порт. Для завершения процесса используйте команду:

kill -9 PID

где PID — идентификатор процесса из вывода предыдущей команды.

Если порт свободен, команда не вернет никаких данных.


Проверка порта на Linux

Откройте терминал.

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

sudo lsof -i :PORT

Если порт занят, команда выведет список процессов, использующих порт. Для завершения процесса используйте команду:

sudo kill -9 PID

где PID — идентификатор процесса из вывода предыдущей команды.

Если порт свободен, команда не вернет никаких данных.


Проверка порта на Windows

Откройте командную строку (cmd) или PowerShell с правами администратора.

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

netstat -aon | findstr :PORT

Если порт занят, команда выведет информацию о процессе, использующем порт. Обратите внимание на PID (идентификатор процесса).

Чтобы завершить процесс, откройте Диспетчер задач, перейдите на вкладку Подробности, найдите процесс с соответствующим PID и завершите его.

Если порт свободен, команда не вернет никаких данных.

Где следует выполнять команды для запуска приложения?

  • в терминале (командной строке) операционной системы;
  • в программной среде разработки IntelliJ IDEA непосредственно в данном файле нажатием на символ тройной стрелки >>>, расположенной слева от строки описания соответствующей команды.

Запуск приложения


  1. Склонируйте репозиторий с использованием следующей команды:
git clone https://github.com/kirshumir01/java-filmorate.git
  1. Перейдите в корневую директорию склонированного проекта и выполните команду:
cd java-filmorate
  1. Запустите сборку проекта командой:
./mvnw clean install
  1. Запустите приложение, выполнив следующую команду:
./mvnw spring-boot:run

Доступ к публичному API будет открыт по ссылке через адресную строку интернет-браузера: http://localhost:8080.

Read this on English.

About

Приложение на Spring Boot с базой данных H2 для хранения и управления информацией о фильмах

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages