Filmorate - это бэкэнд-сервис на основе Restful API для хранения и управления информацией о фильмах(название, рейтинг MPA, жанр, описание и продолжительность), составления рейтинга фильмов на основе отзывов пользователей, поиска фильма, а также для общения пользователей.
- Java 11, Spring Boot, Lombok, Maven, Junit, JDBC, SQL, H2
- Создание/редактирование/удаление карточки фильма
- Получение фильма по id
- Получение списка всех фильмов
- Получение списка наиболее популярных фильмов
- Создание/редактирование/удаление профилей пользователей
- Получение списка всех пользователей
- Добавление пользователей в друзья, возможность рекомендовать фильм друг другу
- Получение списка друзей пользователя
- Получение списка общих друзей между двумя пользователями
- Получение списка рейтингов MPA, получения рейтинга по id
- Получение списка жанров, получение жанра по id
- Возможность поставить/удалить лайк фильму
Film
Столбец | Тип | Описание | Примечание |
---|---|---|---|
film_id | bigint | уникальный идентификатор | PK |
name | varchar | название фильма | NOT NULL |
description | varchar(200) | описание фильма | |
release_date | date | дата релиза | NOT NULL |
duration | int | длительность фильма в мин | |
rating_id | int | id рейтинга | FK(rating.rating_id) |
User_info
Столбец | Тип | Описание | Примечание |
---|---|---|---|
user_id | bigint | уникальный идентификатор | PK |
name | varchar | имя пользователя | |
login | varchar(100) | логин | NOT NULL, UNIQUE |
varchar(320) | NOT NULL, UNIQUE | ||
birthday | date | день рождения | NOT NULL |
Friendship
Столбец | Тип | Описание | Примечание |
---|---|---|---|
user_id | bigint | id пользователя | PK, FK(user_info.user_id) |
friend_id | bigint | id друга | PK, FK(user_info.user_id) |
friendship_state | boolean | подтверждение дружбы false - неподтверждённая true - подтверждённая |
default = false |
Likes
каждый пользователь может поставить лайк фильму только один разСтолбец | Тип | Описание | Примечание |
---|---|---|---|
film_id | bigint | id фильма | PK, FK(film.film_id) |
user_id | bigint | id пользователя | PK, FK(user_info.user_id) |
Genre(Список жанров)
Столбец | Тип | Описание | Примечание |
---|---|---|---|
genre_id | int | уникальный идентификатор | PK |
name | varchar(100) | название | NOT NULL |
genre_id | name |
---|---|
1 | Комедия |
2 | Драма |
3 | Мультфильм |
4 | Триллер |
5 | Документальный |
6 | Боевик |
Film_genre
У фильма может быть сразу несколько жанровСтолбец | Тип | Описание | Примечание |
---|---|---|---|
film_id | bigint | id фильма | PK, FK(film.film_id) |
genre_id | int | id жанра | PK, FK(genre.genre_id) |
Rating
Рейтинг Ассоциации кинокомпаний (англ. Motion Picture Association, сокращённо МРА). Эта оценка определяет возрастное ограничение для фильма.Столбец | Тип | Описание | Примечание |
---|---|---|---|
rating_id | int | уникальный идентификатор | PK |
name | varchar(200) | название | NOT NULL |
description | varchar | описание |
rating_id | name | description |
---|---|---|
1 | G | нет возрастных ограничений |
2 | PG | детям рекомендуется смотреть фильм с родителями |
3 | PG-13 | детям до 13 лет просмотр не желателен |
4 | R | лицам до 17 лет просматривать фильм можно только в присутствии взрослого |
5 | NC-17 | лицам до 18 лет просмотр запрещён |
- GET /films
SELECT f.film_id, f.name, f.description, f.duration, f.release_date, r.name AS rating_name
FROM film f
LEFT JOIN rating r ON r.rating_id = f.rating_id;
- GET /films/{id}
SELECT f.film_id,
f.name,
f.description,
f.duration,
f.release_date,
r.name AS rating_name
FROM film f
LEFT JOIN rating r ON r.rating_id = f.rating_id
WHERE f.film_id = {id};
- POST /films
INSERT INTO film
(name, description, duration, release_date)
VALUES({name}, {description}, {duration}, {release_date});
- PUT /films
UPDATE film
SET name = {name}, description = {description}, duration = {duration}, release_date = {release_date}
WHERE film_id = {id};
- DELETE /films/{id}
DELETE FROM film
WHERE film_id = {id};
- PUT /films/{id}/like/{userId}
INSERT INTO likes (film_id, user_id)
VALUES ({id}, {userId})
ON CONFLICT DO NOTHING;
- DELETE /films/{id}/like/{userId}
DELETE FROM likes
WHERE film_id = {id} AND user_id = {userId};
- GET /films/popular?count={count}
SELECT f.film_id, f.name, f.description, f.duration, f.release_date,
r.name AS rating_name,
COUNT(l.film_id) count_likes
FROM FILM f
LEFT JOIN likes l ON f.FILM_ID = l.FILM_ID
LEFT JOIN rating r ON r.rating_id = f.rating_id
GROUP BY f.film_id
ORDER BY count(l.film_id) DESC, f.film_id ASC
LIMIT {count};
- GET /users
SELECT user_id, name, login, email, birthday
FROM user_info;
- POST /users
INSERT INTO users_info
(name, login, email, birthday)
VALUES({name}, {login}, {email}, {birthday});
- PUT /users
UPDATE users_info
SET name = {name}, login = {login}, email = {email}, birthday = {birthday}
WHERE user_id = {id};
- DELETE /users/{id}
DELETE FROM users_info
WHERE user_id = {id};
- GET /users/{id}/friends
SELECT u.user_id, u.name, u.login,u.email, u.birthday
FROM friendship f2
LEFT JOIN users u ON u.user_id = f2.friend_id
WHERE f2.user_id = {id}
- PUT /users/{id}/friends/{friendId}
INSERT INTO friendship
VALUES ({id}, {friendId})
ON CONFLICT DO NOTHING;
- DELETE /users/{id}/friends/{friendId}
DELETE FROM friendship
WHERE (user_id = {id} AND friend_id = {friendId});
- GET /users/{id}/friends/common/{otherId}
SELECT u.user_id, u.name, u.login,u.email, u.birthday
FROM user_info u INNER JOIN (
SELECT friend_id FROM friendship f WHERE user_id = {id}
INTERSECT
SELECT friend_id FROM friendship f WHERE user_id = {otherId}
) f ON f.friend_id = u.user_id
mvn package
java -jar -Dfile.encoding=UTF-8 target/filmorate-0.1.1-SNAPSHOT.jar