Данное приложение является бэкендом сервиса, позволяющего выбрать фильм или сериал для просмотра, и обладающего рекомендательной системой. Ключевыми особенностями приложения являются:
- Хранение информации о пользователях и фильмах в базе данных Н2.
- Добавление оценок и комментариев пользователей к фильмам.
- Добавление пользователей в друзья с возможностью последующего удаления из друзей.
- Составление TOP-n фильмов по рейтингу.
- Вывод списка общих с другом фильмов с их сортировкой по популярности.
- Рекомендательная система поиска фильмов по пользователям с пересечением по максимальному числу лайков.
- Лента событий
Стек проекта: Java, Spring Boot, Spring Framework, Lombok, Maven, JUnit, JdbcTemplate, H2, SQL, REST, SLF4J
В данный коллективный проект были добавлены следующие функциональности:
- "Фильмы по режиссерам" (ответственный Владимир Курнаков, ветка add-director).
- "Отзывы" (ответственный Мартынов Иван, тимлид, ветка add-reviews).
- "Удаление фильмов и пользователей" (ответственная Мария Лукьянова, ветка add-remove-endpoint).
- "Общие фильмы" (ответственная Мария Лукьянова, ветка add-common-films).
- "Рекомендации" (ответственная Гюзяль Сергейчук, ветка add-recommendations).
- "Поиск" (ответственная Ольга Лизунова, ветка add-search).
- "Лента событий" (ответственный Павел Трофимович, ветка add-feed).
- "Популярные фильмы" (ответственный Павел Трофимович, ветка add-most-populars).
С целью реализации представленных выше возможностей были созданы:
Эндпойнты пути /users:
- POST /users - создание пользователя.
- PUT /users - редактирование пользователя.
- GET /users - получение коллекции всех пользователей.
- GET /users/{id} - получение информации о пользователе по его идентификатору.
- PUT /users/{id}/friends/{friendId} - добавление в друзья (одностороннее).
- DELETE /users/{id}/friends/{friendId} -удаление пользователя из друзей (одностороннее).
- GET /users/{id}/friends - получение коллекции друзей пользователя с идентификатором id.
- GET /users/{id}/friends/common/{otherId} - получение списка друзей, общих для пользователей с идентификаторами id и otherId.
- DELETE /users/{userId} - удаление пользователя.
- GET /users/{id}/feed - возвращает ленту пользователя в виде коллекции.
- GET /users/{id}/recommendations - получение рекомендаций в виде списка по фильмам для целевого пользователя.
Эндпойнты пути /films:
- POST /films - создание фильма.
- PUT /films - редактирование фильма.
- GET /films - получение коллекции всех фильмов.
- GET /films/{id} - получение фильма по его идентификатору.
- PUT /films/{id}/like/{userId} - поставить лайк фильму с идентификатором id от пользователя с идентификатором userId.
- DELETE /films/{id}/like/{userId} - удалить лайк фильму с идентификатором id от пользователя с идентификатором userId.
- GET /films/popular?count={count} - получить список из count фильмов по количеству лайков. Если значение параметра count не задано, то будет получено первые 10 фильмов.
- DELETE /films/{filmId} - удаление фильма по его идентификатору.
- GET /films/common?userId={userId}&friendId={friendId} - возвращает список фильмов, общий для пользователей с идентификаторами userId и fiendId, отсортированный по популярности.
- GET /films/director/{directorId} - возвращает список фильмов режиссера с идентификатором directorId.
- GET /films/search?query={query}&by={by} - возвращает список отсортированных по популярности фильмов. Параметр query - текст для поиска, параметр by может принимать значения director (производится поиск по режиссеру), title (по названию), также оба параметра могут следовать через запятую при поиске по режиссеру и названию.
Эндпойнты пути /director:
- GET /directors - получение множества всех режиссеров.
- POST /directors - добавление режиссера.
- GET /directors/{id} - получение режиссера по его идентификатору.
- PUT /directors - редактирование режиссера.
- DELETE /directors/{id} - удаление режиссера по его идентификатору.
Эндпойнты пути /genres:
- GET /genres - получение коллекции всех жанров.
- GET /genres/{id} - получение информации о жанре по его идентификатору.
Эндпойнты пути /mpa:
- GET /mpa - получение коллекции всех рейтингов.
- GET /mpa/{id} - получение информации о рейтинге по его идентификатору.
Эндпойнты пути /reviews:
- POST /reviews - создание отзыва.
- PUT /reviews - редактирование отзыва.
- DELETE /reviews/{id} - удаление отзыва по его идентификатору.
- GET /reviews/{id} - получение отзыва по его идентификатору.
- GET /reviews?filmId={filmId}&count={count} - получение всех отзывов по идентификатору фильма, если фильм не указан, то все. Если количество не указано, то 10.
- PUT /reviews/{id}/like/{userId} - пользователь ставит лайк фильму.
- PUT /reviews/{id}/dislike/{userId} - пользователь ставит дизлайк фильму.
- DELETE /reviews/{id}/like/{userId} - пользователь удаляет лайк фильму.
- DELETE /reviews/{id}/dislike/{userId} - пользователь удаляет дизлайк фильму.
Схема базы данных
Примечания:
- В таблице user_friends_status тип поля status_of_friendship - varchar с ограничениями на принимаемые значения (Confirmed или Unconfirmed).
- В этой же таблице user_id - id пользователя, инициировавшего добавление в друзья, friend_id - id пользователя, подтверждающего статус дружбы.
Пример запроса к базе, возвращающего логины пользователей, которые отправили запрос на добавление в друзья к пользователю с логином login3 и статус дружбы которых не подтвержден:
SELECT DISTINCT
u.login
FROM users AS u
INNER JOIN user_friends_status AS ufs ON u.users_id = ufs.user_id
INNER JOIN users AS ua ON ua.users_id = ufs.friend_id
WHERE ufs.status_of_friendship = 'Unconfirmed' AND ua.login = 'login3';
