diff --git a/FILMO_RATE_DATABASE_MAP.png b/FILMO_RATE_DATABASE_MAP.png new file mode 100644 index 0000000..b50dbc3 Binary files /dev/null and b/FILMO_RATE_DATABASE_MAP.png differ diff --git a/QuickDBD-FILMO_RATE.png b/QuickDBD-FILMO_RATE.png deleted file mode 100644 index 34e7885..0000000 Binary files a/QuickDBD-FILMO_RATE.png and /dev/null differ diff --git a/README.md b/README.md index f47ddf9..3b62c5a 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The Filmorate project — это приложение для работы с б - logback-classic - logbook-spring-boot-starter ### Схема базы данных (Database map) -![DatabaseMap](QuickDBD-FILMO_RATE.png "Database map:") +![DatabaseMap](FILMO_RATE_DATABASE_MAP.png "Database map:") ### Примеры запросов к базе данных: 1. Get TOP-10 films: ```sql diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java index 1d78ac4..d5badc8 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -70,4 +70,9 @@ public void setLike(@PathVariable long filmId, @PathVariable long userId) { public void deleteLike(@PathVariable long filmId, @PathVariable long userId) { filmService.changeLike(LikeAction.REMOVE, filmId, userId); } + + @DeleteMapping("/{filmId}") + public void deleteFilm(@PathVariable long filmId) { + filmService.remove(filmId); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index 68efccf..cdf8ae3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -71,4 +71,9 @@ public Collection getUserEvents(@PathVariable(name = "id") long userId public Collection getRecommendations(@PathVariable long id) { return userService.getRecommendations(id); } + + @DeleteMapping("/{userId}") + public void deleteUser(@PathVariable long userId) { + userService.remove(userId); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/FilmStorage.java index 271192d..b5ee1b1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/FilmStorage.java @@ -43,4 +43,7 @@ public interface FilmStorage { Map> getAllLikes(); Collection getCommonLikedFilms(long userId, long friendId); + + /// Удаление фильма по id + void removeFilm(long filmId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/UserStorage.java index 368853b..65ff810 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/UserStorage.java @@ -36,4 +36,7 @@ public interface UserStorage { /// Получить список id друзей Collection getFriendIds(long userId); + + /// Удаление пользователя по id + void removeUser(long userId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/database/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/database/FilmDbStorage.java index 1828427..30ba174 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/database/FilmDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/database/FilmDbStorage.java @@ -213,4 +213,9 @@ public Map> getAllLikes() { public Collection getCommonLikedFilms(long userId, long friendId) { return findManyFilms(SQL_FILMS_FIND_COMMON_LIKED, userId, friendId); } + + @Override + public void removeFilm(long filmId) { + updateWithControl("DELETE FROM films WHERE id = ?", filmId); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/database/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/database/UserDbStorage.java index be9feb6..15a3bad 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/database/UserDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/database/UserDbStorage.java @@ -97,6 +97,11 @@ public Set getFriendIds(long userId) { return findColumnByQuery(sql, Long.class, userId); } + @Override + public void removeUser(long userId) { + updateWithControl("DELETE FROM users WHERE id = ?", userId); + } + @Override public boolean checkUserIsNotPresent(Long userId) { return checkIdIsNotPresentInTable(userId, "users"); diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryFilmStorage.java index 5c8645b..a20c49e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryFilmStorage.java @@ -86,4 +86,9 @@ public Map> getAllLikes() { public Collection getCommonLikedFilms(long userId, long friendId) { throw new MethodNotImplementedException(); } + + @Override + public void removeFilm(long filmId) { + throw new MethodNotImplementedException(); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryUserStorage.java index 3c2df8e..d88bb64 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/inmemory/InMemoryUserStorage.java @@ -73,4 +73,9 @@ public Collection getFriendIds(long userId) { throw new MethodNotImplementedException(); } + @Override + public void removeUser(long userId) { + throw new MethodNotImplementedException(); + } + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/servise/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/servise/FilmService.java index 8c38ccf..fdaf33e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/servise/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/servise/FilmService.java @@ -221,6 +221,14 @@ public FilmDto update(FilmUpdateRequest request) { return FilmMapper.mapToFilmDto(newFilm, mpa, filmGenres, filmDirectors); } + public void remove(long filmId) { + log.info("Удаление фильма с id={}", filmId); + if (filmStorage.checkFilmIsNotPresent(filmId)) { + throw new NotFoundException("Фильм с id=" + filmId + " не найден."); + } + filmStorage.removeFilm(filmId); + } + private Mpa validateMpa(Film film) { log.trace("Проверка рейтинга MPAA"); int mpaId = film.getMpaId(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/servise/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/servise/UserService.java index 0040d60..76ec5d5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/servise/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/servise/UserService.java @@ -118,6 +118,14 @@ public UserDto update(UserUpdateRequest request) { return UserMapper.mapToUserDto(newUser); } + public void remove(long userId) { + log.info("Удаление пользователя с id={}.", userId); + if (userStorage.checkUserIsNotPresent(userId)) { + throw new NotFoundException("Пользователь с id=" + userId + " не найден."); + } + userStorage.removeUser(userId); + } + public UserDto findUserDtoById(long userId) { log.info("Поиск пользователя с id={}.", userId); return UserMapper.mapToUserDto(findUser(userId)); diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 234a9c0..ac774a1 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -5,7 +5,7 @@ CREATE TABLE users ( user_name varchar(50), login varchar(50) NOT NULL, email varchar(50) NOT NULL, - birthday date NOT NULL + birthday date NOT NULL ); CREATE TABLE friends ( @@ -82,31 +82,31 @@ CREATE TABLE events ( ); ALTER TABLE friends ADD CONSTRAINT fk_friends_user_id FOREIGN KEY(user_id) -REFERENCES users (id); +REFERENCES users (id) ON DELETE CASCADE; ALTER TABLE friends ADD CONSTRAINT fk_friends_friend_id FOREIGN KEY(friend_id) -REFERENCES users (id); +REFERENCES users (id) ON DELETE CASCADE; ALTER TABLE films ADD CONSTRAINT fk_films_mpa_id FOREIGN KEY(mpa_id) -REFERENCES mpa (id); +REFERENCES mpa (id) ON DELETE SET NULL; ALTER TABLE genres_of_films ADD CONSTRAINT fk_genres_of_films_genre_id FOREIGN KEY(genre_id) -REFERENCES genres (id); +REFERENCES genres (id) ON DELETE CASCADE; ALTER TABLE genres_of_films ADD CONSTRAINT fk_genres_of_films_film_id FOREIGN KEY(film_id) -REFERENCES films (id); +REFERENCES films (id) ON DELETE CASCADE; ALTER TABLE likes ADD CONSTRAINT fk_likes_user_id FOREIGN KEY(user_id) -REFERENCES users (id); +REFERENCES users (id) ON DELETE CASCADE; ALTER TABLE likes ADD CONSTRAINT fk_likes_film_id FOREIGN KEY(film_id) -REFERENCES films (id); +REFERENCES films (id) ON DELETE CASCADE; ALTER TABLE DIRECTORS_OF_FILMS ADD CONSTRAINT fk_directors_of_films_director_id FOREIGN KEY(director_id) -REFERENCES directors (id); +REFERENCES directors (id) ON DELETE CASCADE; ALTER TABLE DIRECTORS_OF_FILMS ADD CONSTRAINT fk_directors_of_films_film_id FOREIGN KEY(film_id) -REFERENCES films (id); +REFERENCES films (id) ON DELETE CASCADE; ALTER TABLE reviews ADD CONSTRAINT fk_reviews_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE; @@ -115,13 +115,13 @@ ALTER TABLE reviews ADD CONSTRAINT fk_reviews_film_id FOREIGN KEY (film_id) REFERENCES films (id) ON DELETE CASCADE; ALTER TABLE review_likes ADD CONSTRAINT fk_review_likes_review_id FOREIGN KEY (review_id) -REFERENCES reviews (id); +REFERENCES reviews (id) ON DELETE CASCADE; ALTER TABLE review_likes ADD CONSTRAINT fk_review_likes_user_id FOREIGN KEY (user_id) -REFERENCES users (id); +REFERENCES users (id) ON DELETE CASCADE; ALTER TABLE events ADD CONSTRAINT fk_events_user_id FOREIGN KEY(user_id) -REFERENCES users (id); +REFERENCES users (id) ON DELETE CASCADE; CREATE INDEX IF NOT EXISTS idx_users_user_name ON users (user_name); CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users (email);