- Architecture: Monolithic
- Programming Language: Java (Version 11)
- Framework: Spring Boot (Version 2.7.18)
- Database: H2
- Mapping: No MapStruct
- Persistence: No JPA, utilizing only JDBC with native SQL queries.
В информацию о фильмах добавлены имена режиссёров, что выражается в появлении следующей функциональности:
- Вывод всех фильмов режиссёра, отсортированных по количеству лайков.
- Вывод всех фильмов режиссёра, отсортированных по годам.
- API
GET /films/director/{directorId}?sortBy=[year,likes]
возвращает список фильмов режиссера отсортированных по количеству лайков или году выпуска
Добавлена функциональность для удаления фильма и пользователя по идентификатору.
- API
DELETE /films/{filmId}
Удаляет пользователя по идентификатору. - API
DELETE /users/{userId}
Удаляет фильм по идентификатору.
Добавлена возможность выводить топ-N фильмов по количеству лайков.
- Фильтрация по двум параметрам.
- По жанру
- За указанный год
- API
GET /films/popular?count={limit}&genreId={genreId}&year={year}
Возвращает список самых популярных фильмов указанного жанра за нужный год.
- В приложении появились отзывы на фильмы.
- Добавленные отзывы имеют рейтинг и несколько дополнительных характеристик.
Характеристики отзыва:
- Оценка — полезно/бесполезно.
- Тип отзыва — негативный/положительный.
- Рейтинг отзыва.
У отзыва имеется рейтинг. При создании отзыва рейтинг равен нулю. Если пользователь оценил отзыв как полезный, это увеличивает его рейтинг на 1. Если как бесполезный, то уменьшает на 1.
Отзывы сортируются по рейтингу полезности.
- API
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}
пользователь удаляет дизлайк отзыву.
Описание JSON-объекта с которым работают эндпоинты:
{
"reviewId": 123,
"content": "This film is sooo baad.",
"isPositive": false,
"userId": 123, // Пользователь
"filmId": 2, // Фильм
"useful": 20 // рейтинг полезности
}
Добавлена возможность просмотра последних событий на платформе
-
добавление в друзья,
-
удаление из друзей,
-
лайки и отзывы, которые оставил пользователь.
-
API
GET /users/{id}/feed
Возвращает ленту событий пользователя.
Пример JSON-объекта с которым работает эндпоинт:
[
{
"timestamp": 123344556,
"userId": 123,
"eventType": "LIKE", // одно из значениий LIKE, REVIEW или FRIEND
"operation": "REMOVE", // одно из значениий REMOVE, ADD, UPDATE
"eventId": 1234, //primary key
"entityId": 1234 // идентификатор сущности, с которой произошло событие
}
]
Примерный алгоритм выглядит следующим образом:
- Найти пользователей с максимальным количеством пересечения по лайкам.
- Определить фильмы, которые один пролайкал, а другой нет.
- Рекомендовать фильмы, которым поставил лайк пользователь с похожими вкусами, а тот, для кого составляется рекомендация, ещё не поставил.
GET /users/{id}/recommendations
Возвращает рекомендации по фильмам для просмотра.
Реализован поиск по названию фильмов и по режиссёру. Алгоритм умеет искать по подстроке.
- API
GET /fimls/search
Возвращает список фильмов, отсортированных по популярности. - Параметры строки запроса
query
— текст для поискаby
— может принимать значенияdirector
(поиск по режиссёру),title
(поиск по названию), либо оба значения через запятую при поиске одновременно и по режиссеру и по названию.- Пример:
GET /films/search?query=крад&by=director,title
Вывод общих с другом фильмов с сортировкой по их популярности.
- API
GET /films/common?userId={userId}&friendId={friendId}
Возвращает список фильмов, отсортированных по популярности. - Параметры
userId
— идентификатор пользователя, запрашивающего информацию;friendId
— идентификатор пользователя, с которым необходимо сравнить список фильмов.
INSERT INTO example (column_1, column_2, column_3, etc)
VALUES(?, ?, ?, ?)
SELECT MAX(id) AS last
FROM example
SELECT column_name
FROM example
WHERE id = ?
UPDATE films
SET rating_id = ?
WHERE id = ?
SELECT name
FROM genres
WHERE id = ?
INSERT INTO genres_films (genre_id, film_id)
VALUES(?, ?)
UPDATE films
SET name = ?,
description = ?,
release = ?,
duration = ?
WHERE id = ?
UPDATE films
SET rating_id = ?
WHERE id = ?
DELETE
FROM genres_films
WHERE film_id = ?
SELECT name,
description,
release,
duration
FROM films
WHERE id = ?
SELECT rating_id AS mpa_id
FROM films
WHERE id = ?
SELECT *
FROM ratings
WHERE id = ?
SELECT genre_id AS id
FROM genres_films
WHERE film_id = ?
SELECT *
FROM genres
WHERE id = ?
SELECT user_id AS id
FROM likes
WHERE film_id = ?
SELECT id
FROM films
ORDER BY id ASC
INSERT INTO likes (film_id, user_id)
VALUES(?, ?)
DELETE
FROM likes
WHERE film_id = ?
AND user_id = ?
SELECT film_id AS id
FROM likes
GROUP BY film_id
ORDER BY COUNT(user_id) DESC
LIMIT 10
SELECT EXISTS (SELECT *
FROM likes
WHERE film_id = ?
AND user_id = ?) AS match
SELECT EXISTS (SELECT rating_id
FROM films
WHERE rating_id IS NOT NULL
AND id = ?) AS match
SELECT EXISTS (SELECT id AS match
FROM tableName
WHERE id = ?) AS match
UPDATE users
SET name = ?, login = ?, email = ?, birthday = ?
WHERE id = ?
SELECT following_id
FROM follows
WHERE followed_id = ?
SELECT *
FROM users
WHERE id = ?
SELECT *
FROM users
ORDER BY id ASC"
INSERT INTO follows (following_id, followed_id)
VALUES(?, ?)
DELETE
FROM follows
WHERE following_id = ?
AND followed_id = ?
SELECT *
FROM users AS u
JOIN follows AS f ON f.following_id = u.id
AND f.followed_id = ?
JOIN follows AS friend_f ON friend_f.following_id = u.id
AND friend_f.followed_id = ?"
SELECT *
FROM users u
JOIN follows AS f ON f.following_id = u.id
AND f.followed_id = ?;
SELECT following_id
FROM follows
WHERE followed_id = ?
SELECT *
FROM genres
ORDER BY id ASC
SELECT *
FROM genres
WHERE id = ?
SELECT *
FROM genres
ORDER BY id ASC
SELECT *
FROM ratings
WHERE id = ?