Skip to content

Социальная сеть для любителей фильмов.

Notifications You must be signed in to change notification settings

vvbakhanovich/cinemania

Repository files navigation

java-filmorate

Социальная сеть для любителей фильмов. Стэк: Spring Boot, JDBC Template, H2, Lombok, JUnit. Групповой проект, в котором участвовали: elenabokhan13, Redshnapper, Kazantsevyury, Ayzat Murtazin.

Основной функционал:

  • создание, удаление, редактирование данных пользователя;
  • отправка запроса на добавление пользователя в список друзей. Пользователь может как принять, так и отклонить данный запрос;
  • получение списка общих друзей между двумя пользователями;
  • создание, удаление, редактирование данных режиссеров;
  • создание, удаление, редактирование данных фильма;
  • возможность поставить оценку фильму (от 1 до 10);
  • поиск фильмов по названию и режиссеру;
  • получение списка фильмов с наибольшим количеством оценок, от конкретного режиссера или общих фильмов между двумя пользователями;
  • создание, удаление, редактирование отзывов о просмотренном фильме;
  • возможность поставить лайк/дизлайк отзыву;
  • получение списка рекомендованных к просмотру фильмов (алгоритм выбора рекомендаций определяет пользователя с наиболее схожими оценками с пользователем, который хочет получить рекомендации, и возвращает те фильмы, которые не были оценены искомым пользователем и у которых положительный рейтинг)

Entity relations table for filmorate database

er table


База данных состоит из следующих таблиц:

  1. filmorate_user:

    • id (первичный ключ)
    • email (электронная почта пользователя)
    • login (логин пользователя)
    • user_name (имя пользователя)
    • birthday (дата рождения пользователя)
  2. friendship_status:

    • id (первичный ключ)
    • status_name (статус, например, 'Ожидает подтверждения', 'В друзьях')
  3. friendship:

    • user_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user)
    • friend_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user, который является другом пользователя c идентификатором user_id)
    • friendship_id (внешний ключ, содержит id статуса дружбы из таблицы friendship)
  4. mpa_rating:

    • id (первичный ключ)
    • rating_name (навзвание возрастного рейтинга)
  5. film:

    • id (первичный ключ)
    • title (название фильма)
    • description (опсисание фильма)
    • release_date (дата релиза фильма)
    • duration (длительность фильма в минутах)
    • mpa_rating_id (внешний кллюч, содержит id возрастного рейтинга из таблицы mpa_rating)
  6. genre:

    • id (первичный ключ)
    • genre_name (название жанра фильма)
  7. film_genre (соединительная таблица между film и genre):

    • film_id (составной первичный ключ, внешний ключ, содержит id фильма из таблицы film)
    • genre_id (составной первичный ключ, внешний ключ, содержит id жанра из таблицы genre)
  8. film_mark (содержит список оценок фильмов от пользователей):

    • film_id (составной первичный ключ, внешний ключ, содержит id фильма из таблицы film)
    • user_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user)
    • mark (оценка фильма)
  9. review

    • id (первичный ключ)
    • review_content (содержание отзыва)
    • is_positive (является ли отзыв положительным)
    • useful (количество положительных лайков отзыва)
    • user_id (идентификатор пользователя, который написал отзыв)
    • film_id (идентификатор фильма, о котором напсисан отзыв)
  10. review_like (соединительная таблица между review и filmorate_user)

    • review_id (внешний ключ, содержит id фильма из таблицы review)
    • user_id (внешний ключ, содержит id фильма из таблицы filmorate_user)
    • like_type (тип оценки (лайк/дизлайк))
  11. director

    • id (первичный ключ)
    • director_name (имя режиссера)
  12. film_director (соединительная таблица между film и director)

    • id (первичный ключ)
    • film_id (внешний ключ, содержит id фильма из таблицы film)
    • director_id (внешний ключ, содержит id фильма из таблицы director))
  13. feed_events

    • id (первичный ключ)
    • event_type (тип события в ленте)
    • operation (тип операции над объектом)
    • entity_id (идентификатор объекта, на котором производилась операция)
    • publication_time (время выполнения события)
    • user_id (внешний ключ, содержит id фильма из таблицы filmorate_user)

Примеры запросов для основных операций:

  • добавление пользователя   INSERT INTO user (email, login, user_name, birthday)

  VALUES ('[email protected]', 'test_login', 'test_user_name', DATE '2000-01-01');

  • обновление пользователя

  UPDATE user SET user_name = 'new_user_name' WHERE email = '[email protected]';

  • получение списка всех пользователей

  SELECT * FROM user;

  • получение пользователя по id

  SELECT * FROM usere WHERE id = 1;

  • добавление пользователя с id '1' в друзья пользователю с id '2' с id статуса дружбы '1'

  INSERT INTO friends (user_id, friend_1, friendship_id)

  VALUES (2, 1, 1);

  • получение списка друзей пользователя с id '1'

SELECT * FROM user WHERE id IN (SELECT friend_id FROM friends WHERE user_id = 1);

  • получение списка общих друзей между пользователей с id '1' и '2'

  SELECT * FROM user WHERE id IN (

    SELECT u1.friend_id

    FROM friends AS u1, friends AS u2

    WHERE u1.user_id = 1 AND u2.user_id = 2 AND u1.friend_id = u2.friend_id);

  • удаление пользователя из списка друзей

  DELETE friends WHERE user_id = 1 AND friend_id = 2;

  • добавление фильма

  INSERT INTO film (title, description, release_date, duration, genre_id)

  VALUES ('film_title', 'film_description', DATE '2010-10-10', 123, 1);

  • обновление фильма

  UPDATE film SET description = 'new_description' WHERE title = 'film_title';

  • получение списка всех фильмов

  SELECT * FROM film;

  • получение списка по id

  SELECT * FROM film WHERE id = 1;

  • добавить оценку фильму

  INSERT INTO film_mark (filmd_id, user_id, mark)

  VALUES (1, 1, 7);

  • удалить оценку

  DELETE film_mark WHERE filmd_id = 1 AND user_id = 1;

  • получить 10 самых популярных фильмов

  SELECT title FROM film WHERE id IN (

    SELECT film_id FROM film_mark GROUP BY film_id ORDER BY COUNT(*) DESC

  ) LIMIT 10;

About

Социальная сеть для любителей фильмов.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages