Filmorate — это приложение для управления рейтингами фильмов, пользовательскими лайками, друзьями и рекомендациями.
Пользователи могут делиться мнением о фильмах, ставить оценки, добавлять фильмы в избранное и видеть, что понравилось друзьям.
- Регистрация и управление пользователями
- Добавление, редактирование и удаление фильмов
- Система лайков и подсчёт популярности фильмов
- Хранение жанров и возрастных рейтингов (MPA)
- Добавление в друзья и отображение общих друзей
- Получение рекомендаций на основе лайков
- Сортировка фильмов по популярности
| Технология | Описание |
|---|---|
| Java 21 | Язык программирования |
| Spring Boot | Backend-фреймворк |
| Spring Web | Создание REST API |
| Spring Data JPA | Работа с базой данных |
| PostgreSQL | Реляционная база данных |
| Hibernate | ORM |
| Lombok | Упрощение кода |
| Maven | Сборка проекта |
| JUnit, Mockito | Модульное тестирование |
| Testcontainers | Интеграционные тесты |
Монолитное Spring Boot приложение:
- Контроллеры:
UserController,FilmController,ReviewController,DirectorController,FeedController - Сервисы:
UserService,FilmService,RecommendationServiceи др. - Хранилища: реализованы на основе интерфейсов с аннотациями
@Repository
Модели:
User— пользовательFilm— фильмLike— лайкFriendship— друзьяGenre,MPA— справочникиReview— отзывFeed— лента активности
На схеме показаны таблицы: users, films, likes, friends, genres, ratings, reviews и их связи.
- Docker
- Docker Compose
docker-compose up# Сборка и установка зависимостей
mvn clean install
# Запуск приложения
mvn spring-boot:runmvn testИспользуются:
JUnit 5— модульные тестыTestcontainers— интеграционные тесты с изолированной PostgreSQL
GET /films— получение списка всех фильмовGET /films/{filmId}— получение фильма по IDPOST /films— добавление фильмаPUT /films— обновление данных о фильмеPUT /films/{id}/like/{userId}— пользователь ставит лайк фильмуDELETE /films/{id}/like/{userId}— пользователь удаляет лайкGET /films/popular?count={count}— список N популярных фильмов по лайкам
GET /users— получение списка всех пользователейGET /users/{userId}— получение пользователя по IDPOST /users— создание пользователяPUT /users— обновление данных о пользователеPUT /users/{userId}/friends/{friendId}— добавление в друзьяDELETE /users/{userId}/friends/{friendId}— удаление из друзейGET /users/{userId}/friends— список друзей пользователяGET /users/{userId}/friends/common/{otherId}— общие друзья с другим пользователем
GET /mpa— список всех рейтинговGET /mpa/{id}— рейтинг по ID
GET /genres— список всех жанровGET /genres/{id}— жанр по ID
Получить все фильмы:
SELECT * FROM Film;Топ-10 популярных фильмов по лайкам:
SELECT f.Title, COUNT(l.UserID) AS LikeCount
FROM Film f
LEFT JOIN Like l ON f.FilmID = l.FilmID
GROUP BY f.FilmID
ORDER BY LikeCount DESC
LIMIT 10;Список друзей пользователя:
SELECT u.Name
FROM User u
JOIN Friendship f ON u.UserID = f.UserID_2
WHERE f.UserID_1 = 1 AND f.Status = 'друзья';Фильмы, лайкнутые пользователем:
SELECT f.*
FROM Film f
JOIN Like l ON f.FilmID = l.FilmID
WHERE l.UserID = 1;Проект разработан в рамках командной работы.
Тимлид: GordonSergey
Участники команды:
Разработано в рамках учебного проекта.
GitHub: GordonSergey
