"# Filmorate - Система рекомендаций фильмов
Filmorate - это REST API приложение для управления фильмами и пользователями, построенное на Spring Boot. Система позволяет пользователям добавлять фильмы, ставить лайки, добавлять друзей и получать рекомендации на основе популярности фильмов.
- Java 21
- Spring Boot 3.2.4
- Spring Data JPA
- H2 Database (встроенная база данных)
- Lombok (для уменьшения boilerplate кода)
- Jakarta Validation (для валидации данных)
- Maven (система сборки)
- JUnit 5 (тестирование)
Проект построен по принципам многослойной архитектуры:
src/main/java/ru/yandex/practicum/filmorate/
├── controller/ # REST контроллеры
├── service/ # Бизнес-логика
├── storage/ # Слой доступа к данным
│ ├── film/ # Репозитории для фильмов
│ ├── user/ # Репозитории для пользователей
│ ├── genre/ # Репозитории для жанров
│ └── mpa/ # Репозитории для рейтингов MPA
├── model/ # Модели данных
├── exception/ # Обработка исключений
└── mappers/ # Мапперы для преобразования данных
id- уникальный идентификаторname- название фильма (обязательное, не пустое)description- описание (максимум 200 символов)releaseDate- дата выпуска (обязательное)duration- продолжительность в минутах (положительное число)likesCount- количество лайковgenres- список жанровmpa- рейтинг MPA
id- уникальный идентификаторemail- электронная почта (обязательное, валидный email)login- логин (обязательное, не пустое)name- имя пользователяbirthday- дата рождения (обязательное, в прошлом)friends- список друзей
id- уникальный идентификаторname- название жанра
id- уникальный идентификаторname- название рейтинга (G, PG, PG-13, R, NC-17)
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /films |
Получить все фильмы |
| GET | /films/{id} |
Получить фильм по ID |
| GET | /films/popular?count={count} |
Получить популярные фильмы |
| POST | /films |
Создать новый фильм |
| PUT | /films |
Обновить фильм |
| PUT | /films/{filmId}/like/{userId} |
Поставить лайк фильму |
| DELETE | /films/{filmId}/like/{userId} |
Убрать лайк с фильма |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /users |
Получить всех пользователей |
| GET | /users/{userId}/friends |
Получить друзей пользователя |
| GET | /users/{userId}/friends/common/{friendsId} |
Получить общих друзей |
| POST | /users |
Создать нового пользователя |
| PUT | /users |
Обновить пользователя |
| PUT | /users/{userId}/friends/{friendsId} |
Добавить в друзья |
| DELETE | /users/{userId}/friends/{friendsId} |
Удалить из друзей |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /genres |
Получить все жанры |
| GET | /genres/{id} |
Получить жанр по ID |
| GET | /mpa |
Получить все рейтинги MPA |
| GET | /mpa/{id} |
Получить рейтинг MPA по ID |
Проект использует H2 встроенную базу данных со следующими таблицами:
film- фильмыusers- пользователиgenres- жанрыmpa- рейтинги MPAfilm_genre- связь фильмов и жанров (многие ко многим)film_like- лайки фильмовfriendship- дружба между пользователями
Основные настройки находятся в src/main/resources/application.properties:
- База данных: H2 файловая база
- Логирование: DEBUG уровень для SQL запросов
- Инициализация схемы: автоматическая при запуске
- Валидация данных: Используется Jakarta Validation для проверки входных данных
- Обработка ошибок: Централизованная обработка исключений через
@RestControllerAdvice - Два слоя storage: InMemory и Database реализации для гибкости
- Логирование: Подробное логирование HTTP запросов и SQL запросов
- Тестирование: Покрытие тестами основных сценариев использования
- Telegram - @sobolev_rs