Skip to content

Filmorate is a Restful API-based back-end service for storing and managing movie information (title, MPA rating, genre, description, and duration), rating movies based on user reviews, movie search, and user communication.

Notifications You must be signed in to change notification settings

catarena-s/java-filmorate

Repository files navigation

Java Filmorate project

Filmorate - это бэкэнд-сервис на основе Restful API для хранения и управления информацией о фильмах(название, рейтинг MPA, жанр, описание и продолжительность), составления рейтинга фильмов на основе отзывов пользователей, поиска фильма, а также для общения пользователей.

Стек

  • Java 11, Spring Boot, Lombok, Maven, Junit, JDBC, SQL, H2

Функциональность:

  1. Создание/редактирование/удаление карточки фильма
  2. Получение фильма по id
  3. Получение списка всех фильмов
  4. Получение списка наиболее популярных фильмов
  5. Создание/редактирование/удаление профилей пользователей
  6. Получение списка всех пользователей
  7. Добавление пользователей в друзья, возможность рекомендовать фильм друг другу
  8. Получение списка друзей пользователя
  9. Получение списка общих друзей между двумя пользователями
  10. Получение списка рейтингов MPA, получения рейтинга по id
  11. Получение списка жанров, получение жанра по id
  12. Возможность поставить/удалить лайк фильму

ER диаграмма

Описание таблиц

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
email varchar(320) email 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 лет просмотр запрещён

Дамп БД

SQL запросы для Film

  • 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};

SQL запросы для User_info

  • 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

Quick start

mvn package

java -jar -Dfile.encoding=UTF-8 target/filmorate-0.1.1-SNAPSHOT.jar

About

Filmorate is a Restful API-based back-end service for storing and managing movie information (title, MPA rating, genre, description, and duration), rating movies based on user reviews, movie search, and user communication.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages