Skip to content

m3Rzy/java-filmorate

Repository files navigation

java-filmorate

Фильмов много — и с каждым годом становится всё больше. Чем их больше, тем больше разных оценок. Чем больше оценок, тем сложнее сделать выбор. Однако не время сдаваться! Перед вами - бэкенд для сервиса, который будет работать с фильмами и оценками пользователей, а также возвращать топ фильмов, рекомендованных к просмотру.

Функциональность приложения эквивалентна API, посредством которого происходит взаимодействие.

Реализованные эндпоинты:

Пользователи

  • POST /users - создание пользователя
  • PUT /users - редактирование пользователя
  • GET /users - получение списка всех пользователей
  • GET /users/{userId} - получение информации о пользователе по его id
  • PUT /users/{id}/friends/{friendId} — добавление в друзья
  • DELETE /users/{id}/friends/{friendId} — удаление из друзей
  • GET /users/{id}/friends — возвращает список пользователей, являющихся его друзьями
  • GET /users/{id}/friends/common/{otherId} — список друзей, общих с другим пользователем

Фильмы

  • POST /films - создание фильма
  • PUT /films - редактирование фильма
  • GET /films - получение списка всех фильмов
  • GET /films/{filmId} - получение информации о фильме по его id
  • PUT /films/{id}/like/{userId} — пользователь ставит лайк фильму
  • DELETE /films/{id}/like/{userId} — пользователь удаляет лайк
  • GET /films/popular?count={count} — возвращает список из первых count фильмов по количеству лайков. Если значение параметра count не задано, возвращает первые 10

Жанры

  • GET /genres - получение списка всех жанров
  • GET /genres/{id} - получение информации о жанре по его id

Рейтинги

  • GET /mpa - получение списка всех рейтингов
  • GET /mpa/{id} - получение информации о рейтинге по его id

Валидация

Входные данные, которые приходят в запросе на добавление нового фильма или пользователя, проходят проверку. Эти данные должны соответствовать следующим критериям:

Для пользователей:

  • электронная почта не может быть пустой и должна содержать символ @;
  • логин не может быть пустым и содержать пробелы;
  • имя для отображения может быть пустым — в таком случае будет использован логин;
  • дата рождения не может быть в будущем.

Для фильмов:

  • название не может быть пустым;
  • максимальная длина описания — 200 символов;
  • дата релиза — не раньше 28 декабря 1895 года;
  • продолжительность фильма должна быть положительной;
  • рейтинг не может быть null.

Для пользователей:

  • создание пользователя
INSERT INTO users (email, login, name, birthday)
VALUES ( ?, ?, ?, ? );
  • редактирование пользователя
UPDATE users
SET email = ?,
    login = ?,
    name = ?,
    birthday = ?
WHERE user_id = ?
  • получение списка всех пользователей
SELECT *
FROM users
  • получение информации о пользователе по его id
SELECT *
FROM users
WHERE user_id = ?
  • добавление в друзья
INSERT IGNORE INTO user_friends (user_id, friend_id)
VALUES (?, ?)
  • удаление из друзей
DELETE
FROM user_friends
WHERE user_id = ? AND friend_id = ?
  • возвращает список пользователей, являющихся его друзьями
SELECT users.*
FROM users
INNER JOIN user_friends ON users.user_id = user_friends.friend_id
WHERE user_friends.user_id = ?
  • список друзей, общих с другим пользователем
SELECT users.*
FROM users
INNER JOIN user_friends ON users.user_id = user_friends.friend_id
WHERE user_friends.user_id = ?

INTERSECT

SELECT users.*
FROM users
INNER JOIN user_friends ON users.user_id = user_friends.friend_id
WHERE user_friends.user_id = ?

Для фильмов:

  • создание фильма
INSERT INTO films (name, description, release_date, duration_in_minutes, mpa_rating_id)
VALUES (?, ?, ?, ?, ?)
  • редактирование фильма
UPDATE films
SET name = ?,
    description = ?,
    release_date = ?,
    duration_in_minutes = ?,
    mpa_rating_id = ?
WHERE film_id = ?
  • получение списка всех фильмов
SELECT films.*, mpa_rating.mpa_name, COUNT(film_likes.user_id) AS rate
FROM films
LEFT JOIN mpa_rating ON films.mpa_rating_id = mpa_rating.mpa_rating_id
LEFT JOIN film_likes ON films.film_id = film_likes.film_id
GROUP BY films.film_id
ORDER BY films.film_id
  • получение информации о фильме по его id
SELECT films.*, mpa_rating.mpa_name, COUNT(film_likes.user_id) AS rate
FROM films
LEFT JOIN mpa_rating ON films.mpa_rating_id = mpa_rating.mpa_rating_id
LEFT JOIN film_likes ON films.film_id = film_likes.film_id
WHERE films.film_id = ?
GROUP BY films.film_id
  • пользователь ставит лайк фильму
INSERT IGNORE INTO film_likes (film_id, user_id)
VALUES (?, ?)
  • пользователь удаляет лайк
DELETE
FROM film_likes
WHERE film_id = ? AND user_id = ?
  • возвращает список из первых count фильмов по количеству лайков
SELECT films.*, mpa_rating.mpa_name, COUNT(film_likes.user_id) AS rate
FROM films
         LEFT JOIN mpa_rating ON films.mpa_rating_id = mpa_rating.mpa_rating_id
         LEFT JOIN film_likes ON films.film_id = film_likes.film_id
GROUP BY films.film_id
ORDER BY rate DESC, films.film_id
LIMIT ?

Для жанров:

  • получение списка всех жанров
SELECT *
FROM genres
ORDER BY genre_id
  • получение информации о жанре по его id
SELECT *
FROM genres
WHERE genre_id = ?

Для рейтингов:

  • получение списка всех рейтингов
SELECT *
FROM mpa_rating
ORDER BY mpa_rating_id
  • получение информации о рейтинге по его id
SELECT *
FROM mpa_rating
WHERE mpa_rating_id = ?

ER-диаграмма

About

Template repository for Filmorate project.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages