Социальная сеть для любителей фильмов. Стэк: Spring Boot, JDBC Template, H2, Lombok, JUnit. Групповой проект, в котором участвовали: elenabokhan13, Redshnapper, Kazantsevyury, Ayzat Murtazin.
Основной функционал:
- создание, удаление, редактирование данных пользователя;
- отправка запроса на добавление пользователя в список друзей. Пользователь может как принять, так и отклонить данный запрос;
- получение списка общих друзей между двумя пользователями;
- создание, удаление, редактирование данных режиссеров;
- создание, удаление, редактирование данных фильма;
- возможность поставить оценку фильму (от 1 до 10);
- поиск фильмов по названию и режиссеру;
- получение списка фильмов с наибольшим количеством оценок, от конкретного режиссера или общих фильмов между двумя пользователями;
- создание, удаление, редактирование отзывов о просмотренном фильме;
- возможность поставить лайк/дизлайк отзыву;
- получение списка рекомендованных к просмотру фильмов (алгоритм выбора рекомендаций определяет пользователя с наиболее схожими оценками с пользователем, который хочет получить рекомендации, и возвращает те фильмы, которые не были оценены искомым пользователем и у которых положительный рейтинг)
-
filmorate_user:
- id (первичный ключ)
- email (электронная почта пользователя)
- login (логин пользователя)
- user_name (имя пользователя)
- birthday (дата рождения пользователя)
-
friendship_status:
- id (первичный ключ)
- status_name (статус, например, 'Ожидает подтверждения', 'В друзьях')
-
friendship:
- user_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user)
- friend_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user, который является другом пользователя c идентификатором user_id)
- friendship_id (внешний ключ, содержит id статуса дружбы из таблицы friendship)
-
mpa_rating:
- id (первичный ключ)
- rating_name (навзвание возрастного рейтинга)
-
film:
- id (первичный ключ)
- title (название фильма)
- description (опсисание фильма)
- release_date (дата релиза фильма)
- duration (длительность фильма в минутах)
- mpa_rating_id (внешний кллюч, содержит id возрастного рейтинга из таблицы mpa_rating)
-
genre:
- id (первичный ключ)
- genre_name (название жанра фильма)
-
film_genre (соединительная таблица между film и genre):
- film_id (составной первичный ключ, внешний ключ, содержит id фильма из таблицы film)
- genre_id (составной первичный ключ, внешний ключ, содержит id жанра из таблицы genre)
-
film_mark (содержит список оценок фильмов от пользователей):
- film_id (составной первичный ключ, внешний ключ, содержит id фильма из таблицы film)
- user_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы user)
- mark (оценка фильма)
-
review
- id (первичный ключ)
- review_content (содержание отзыва)
- is_positive (является ли отзыв положительным)
- useful (количество положительных лайков отзыва)
- user_id (идентификатор пользователя, который написал отзыв)
- film_id (идентификатор фильма, о котором напсисан отзыв)
-
review_like (соединительная таблица между review и filmorate_user)
- review_id (внешний ключ, содержит id фильма из таблицы review)
- user_id (внешний ключ, содержит id фильма из таблицы filmorate_user)
- like_type (тип оценки (лайк/дизлайк))
-
director
- id (первичный ключ)
- director_name (имя режиссера)
-
film_director (соединительная таблица между film и director)
- id (первичный ключ)
- film_id (внешний ключ, содержит id фильма из таблицы film)
- director_id (внешний ключ, содержит id фильма из таблицы director))
-
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;