From ba9037b89b1d3d67a0ddc67f89ddb719b22221f1 Mon Sep 17 00:00:00 2001 From: katesim Date: Fri, 26 Aug 2022 09:31:08 -0700 Subject: [PATCH 1/5] move choosing method to reviewService --- .../practicum/filmorate/controller/ReviewController.java | 5 +---- .../ru/com/practicum/filmorate/service/ReviewService.java | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java b/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java index 7c10f4c..438cbaf 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java @@ -23,10 +23,7 @@ public class ReviewController { @GetMapping("/reviews") public List getFilmsReviews(@RequestParam(required = false) @Positive Long filmId, @RequestParam(defaultValue = "10", required = false) @Positive int count) { - if (filmId == null) { - return reviewService.getAll(); - } - return reviewService.getByFilmId(filmId, count); + return reviewService.get(filmId, count); } @GetMapping("/reviews/{id}") diff --git a/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java b/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java index 3033339..6d501a3 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java @@ -74,4 +74,11 @@ public List getByFilmId(long filmId, int limit) { // получаем о .limit(limit) .collect(Collectors.toList()); } + + public List get (Long filmId, int count) { + if (filmId == null) { + return getAll(); + } + return getByFilmId(filmId, count); + } } From 3b10e3a9dcdd0b9938a1069025d2d28c3f782908 Mon Sep 17 00:00:00 2001 From: katesim Date: Fri, 26 Aug 2022 09:59:20 -0700 Subject: [PATCH 2/5] fix longline --- .../com/practicum/filmorate/storage/film/DBFilmStorage.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java index 04830bf..b76c7b3 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java @@ -259,7 +259,10 @@ public List searchFilms(String directorSubstring, String titleSubstring) { (rs, rowNum) -> makeFilm(rs, genreService, directorService), director, title); } - private Film makeFilm(ResultSet rs, GenreService genreService, DirectorService directorService) throws SQLException { + private Film makeFilm(ResultSet rs, + GenreService genreService, + DirectorService directorService) throws SQLException { + Long id = rs.getLong("id"); String name = rs.getString("name"); String description = rs.getString("description"); From 562b5c637158df4ea6a43bc714424bf3bffa7386 Mon Sep 17 00:00:00 2001 From: alex1261bat Date: Fri, 26 Aug 2022 21:20:56 +0300 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DirectorController.java | 1 + .../filmorate/controller/ErrorHandler.java | 13 ++-- .../filmorate/controller/FeedController.java | 1 + .../filmorate/controller/FilmController.java | 3 +- .../filmorate/controller/GenreController.java | 1 + .../filmorate/controller/MPAController.java | 1 + .../controller/ReviewController.java | 3 +- .../filmorate/controller/UserController.java | 12 +--- .../filmorate/model/SortingTypes.java | 2 +- .../filmorate/service/DirectorService.java | 1 + .../filmorate/service/FilmService.java | 7 ++- .../filmorate/service/GenreService.java | 1 + .../filmorate/service/MPAService.java | 1 + .../filmorate/service/ReviewService.java | 39 ++++++------ .../filmorate/service/UserService.java | 8 +++ .../filmorate/storage/MPA/DBMPAStorage.java | 1 + .../filmorate/storage/MPA/MPAStorage.java | 1 + .../storage/director/DBDirectorStorage.java | 1 + .../storage/director/DirectorStorage.java | 1 + .../filmorate/storage/feed/DBFeedStorage.java | 19 +++--- .../filmorate/storage/film/DBFilmStorage.java | 61 ++++++++----------- .../filmorate/storage/film/FilmStorage.java | 3 +- .../storage/genre/DBGenreStorage.java | 1 + .../filmorate/storage/genre/GenreStorage.java | 1 + .../storage/review/ReviewStorage.java | 1 + .../filmorate/storage/user/UserStorage.java | 1 + .../validator/DirectorValidator.java | 1 + .../filmorate/validator/FilmValidator.java | 1 + .../filmorate/validator/UserValidator.java | 1 + 29 files changed, 99 insertions(+), 89 deletions(-) diff --git a/src/main/java/ru/com/practicum/filmorate/controller/DirectorController.java b/src/main/java/ru/com/practicum/filmorate/controller/DirectorController.java index bf31e13..b0b473b 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/DirectorController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/DirectorController.java @@ -38,4 +38,5 @@ public Director update(@RequestBody Director director) throws ValidationExceptio public void delete(@PathVariable Long id) { directorService.delete(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/ErrorHandler.java b/src/main/java/ru/com/practicum/filmorate/controller/ErrorHandler.java index e23954f..8c4e798 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/ErrorHandler.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/ErrorHandler.java @@ -17,9 +17,7 @@ public class ErrorHandler { @ExceptionHandler(ValidationException.class) - public ResponseEntity handleValidationException( - ValidationException exception - ) { + public ResponseEntity handleValidationException(ValidationException exception) { log.error(exception.getMessage()); return ResponseEntity .status(HttpStatus.BAD_REQUEST) @@ -33,9 +31,7 @@ public String handleAnnotationValidationException(final RuntimeException runtime } @ExceptionHandler(NotFoundException.class) - public ResponseEntity handleNotFoundException( - NotFoundException exception - ) { + public ResponseEntity handleNotFoundException(NotFoundException exception) { log.error(exception.getMessage()); return ResponseEntity .status(HttpStatus.NOT_FOUND) @@ -43,12 +39,11 @@ public ResponseEntity handleNotFoundException( } @ExceptionHandler(Exception.class) - public ResponseEntity handleException( - Throwable exception - ) { + public ResponseEntity handleException(Throwable exception) { log.error(exception.getMessage()); return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(exception.getMessage()); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/FeedController.java b/src/main/java/ru/com/practicum/filmorate/controller/FeedController.java index 1373cfc..e9d8ccd 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/FeedController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/FeedController.java @@ -18,4 +18,5 @@ public class FeedController { public List findById(@PathVariable Long id) { return feedService.getByUserId(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java index 0395f01..d6fbe05 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java @@ -88,7 +88,7 @@ public void deleteFilm(@PathVariable Long filmId) { @GetMapping(value = "/films/director/{directorId}") public List getFilmsByDirectorId(@PathVariable Long directorId, - @RequestParam SortingTypes sortBy) throws NotFoundException { + @RequestParam String sortBy) throws NotFoundException { return filmService.getFilmsByDirectorId(directorId, sortBy); } @@ -96,4 +96,5 @@ public List getFilmsByDirectorId(@PathVariable Long directorId, public List searchFilms(@RequestParam(name = "query") String query, @RequestParam(name = "by") String by) { return filmService.searchFilms(query, by); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/GenreController.java b/src/main/java/ru/com/practicum/filmorate/controller/GenreController.java index d51f16c..d103b53 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/GenreController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/GenreController.java @@ -22,4 +22,5 @@ public List findAll() { public Genre findById(@PathVariable Long id) { return genreService.getById(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/MPAController.java b/src/main/java/ru/com/practicum/filmorate/controller/MPAController.java index 12cca73..7bc5d39 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/MPAController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/MPAController.java @@ -23,4 +23,5 @@ public List findAll() { public MPA findById(@PathVariable Long id) { return mpaService.getById(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java b/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java index 438cbaf..9ca868e 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/ReviewController.java @@ -23,7 +23,7 @@ public class ReviewController { @GetMapping("/reviews") public List getFilmsReviews(@RequestParam(required = false) @Positive Long filmId, @RequestParam(defaultValue = "10", required = false) @Positive int count) { - return reviewService.get(filmId, count); + return reviewService.getFilmsReviews(filmId, count); } @GetMapping("/reviews/{id}") @@ -94,4 +94,5 @@ public void addDislike(@PathVariable long id, @PathVariable long userId) { public void removeDislike(@PathVariable long id, @PathVariable long userId) { reviewService.removeDislike(id, userId); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/controller/UserController.java b/src/main/java/ru/com/practicum/filmorate/controller/UserController.java index 769ec20..c09c8a5 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/UserController.java @@ -5,16 +5,11 @@ import org.springframework.web.bind.annotation.*; import ru.com.practicum.filmorate.exception.NotFoundException; import ru.com.practicum.filmorate.exception.ValidationException; -import ru.com.practicum.filmorate.model.Event; -import ru.com.practicum.filmorate.model.EventTypes; -import ru.com.practicum.filmorate.model.OperationTypes; -import ru.com.practicum.filmorate.model.Film; -import ru.com.practicum.filmorate.model.User; +import ru.com.practicum.filmorate.model.*; import ru.com.practicum.filmorate.service.FeedService; import ru.com.practicum.filmorate.service.UserService; import java.util.List; -import java.util.stream.Collectors; @Slf4j @RestController @@ -78,9 +73,7 @@ public List getFriends(@PathVariable Long id) { @GetMapping(value = "/users/{id}/friends/common/{otherId}") public List getCommonFriends(@PathVariable Long id, @PathVariable Long otherId) { - List first = userService.getAllFriends(id); - List second = userService.getAllFriends(otherId); - return first.stream().filter(second::contains).collect(Collectors.toList()); + return userService.getCommonFriends(id, otherId); } @DeleteMapping(value = "/users/{userId}") @@ -92,4 +85,5 @@ public void deleteUser(@PathVariable Long userId) { public List getRecommendations(@PathVariable Long id) { return userService.getRecommendations(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/model/SortingTypes.java b/src/main/java/ru/com/practicum/filmorate/model/SortingTypes.java index f909e14..39b3ce0 100644 --- a/src/main/java/ru/com/practicum/filmorate/model/SortingTypes.java +++ b/src/main/java/ru/com/practicum/filmorate/model/SortingTypes.java @@ -1,5 +1,5 @@ package ru.com.practicum.filmorate.model; public enum SortingTypes { - year, likes + YEAR, LIKES } diff --git a/src/main/java/ru/com/practicum/filmorate/service/DirectorService.java b/src/main/java/ru/com/practicum/filmorate/service/DirectorService.java index d1a759a..a5041d1 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/DirectorService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/DirectorService.java @@ -49,4 +49,5 @@ public void updateForFilm(Long filmId, List directors) { directorStorage.addAllToFilmId(filmId, directors); } } + } diff --git a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java index 0443d81..e07cdc3 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service; import ru.com.practicum.filmorate.exception.NotFoundException; import ru.com.practicum.filmorate.model.Film; -import ru.com.practicum.filmorate.model.SortingTypes; import ru.com.practicum.filmorate.storage.film.DBFilmStorage; import ru.com.practicum.filmorate.storage.film.FilmStorage; import ru.com.practicum.filmorate.validator.FilmValidator; @@ -71,7 +70,8 @@ public void removeLike(Long id, Long userId) throws NotFoundException { public List getTop(Integer count, Long genreId, Integer year) { return getFilterFilmsByGenreId(getFilterFilmsByYear(filmStorage.getAll().stream(), year), genreId) - .sorted((f1, f2) -> (dbFilmStorage.getFilmLikeId(f2.getId()) - dbFilmStorage.getFilmLikeId(f1.getId()))) + .sorted((f1, f2) -> + (dbFilmStorage.getFilmLikeId(f2.getId()) - dbFilmStorage.getFilmLikeId(f1.getId()))) .limit(count) .collect(Collectors.toList()); } @@ -96,7 +96,7 @@ public void deleteFilm(Long filmId) { log.info("Фильм c id {} удален", filmId); } - public List getFilmsByDirectorId(Long directorId, SortingTypes sortBy) throws NotFoundException { + public List getFilmsByDirectorId(Long directorId, String sortBy) throws NotFoundException { directorService.getById(directorId); return filmStorage.getFilmsByDirectorId(directorId, sortBy); } @@ -118,4 +118,5 @@ public List searchFilms(String query, String by) { throw new IllegalStateException("Unexpected value: " + by); } } + } diff --git a/src/main/java/ru/com/practicum/filmorate/service/GenreService.java b/src/main/java/ru/com/practicum/filmorate/service/GenreService.java index 20b4c33..fe40e4a 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/GenreService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/GenreService.java @@ -30,4 +30,5 @@ public void updateForFilm(Long filmId, List genres) { genreStorage.deleteAllByFilmId(filmId); genreStorage.addAllToFilmId(filmId, genres); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/service/MPAService.java b/src/main/java/ru/com/practicum/filmorate/service/MPAService.java index 569049a..360f0ca 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/MPAService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/MPAService.java @@ -21,4 +21,5 @@ public List getAll() { public MPA getById(Long id) throws NotFoundException { return mpaStorage.getById(id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java b/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java index 6d501a3..21178ad 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/ReviewService.java @@ -17,18 +17,25 @@ public class ReviewService { private final FilmService filmService; private final UserService userService; + public List getFilmsReviews(Long filmId, int count) { + if (filmId == null) { + return getAll(); + } + return getByFilmId(filmId, count); + } + public Review getById(long id) throws NotFoundException { return reviewStorage.getById(id); } public Review add(Review review) { - filmService.getById(review.getFilmId()); // проверяем существование фильма - userService.getById(review.getUserId()); // проверяем существование пользователя + filmService.getById(review.getFilmId()); + userService.getById(review.getUserId()); return reviewStorage.add(review); } public Review update(Review review) { - getById(review.getReviewId()); // проверяем наличие отзыва + getById(review.getReviewId()); return reviewStorage.update(review); } @@ -39,46 +46,40 @@ public Review deleteById(long id) { } public void addLike(long reviewId, long userId) { - getById(reviewId); // проверяем существование отзыва - userService.getById(userId); // проверяем существование пользователя + getById(reviewId); + userService.getById(userId); reviewStorage.addLike(reviewId, userId); } public void removeLike(long reviewId, long userId) { - getById(reviewId); // проверяем существование отзыва - userService.getById(userId); // проверяем существование пользователя + getById(reviewId); + userService.getById(userId); reviewStorage.removeLike(reviewId, userId); } public void addDislike(long reviewId, long userId) { - getById(reviewId); // проверяем существование отзыва - userService.getById(userId); // проверяем существование пользователя + getById(reviewId); + userService.getById(userId); reviewStorage.addDislike(reviewId, userId); } public void removeDislike(long reviewId, long userId) { - getById(reviewId); // проверяем существование отзыва - userService.getById(userId); // проверяем существование пользователя + getById(reviewId); + userService.getById(userId); reviewStorage.removeDislike(reviewId, userId); } - public List getAll() { // получаем все отзывы на все фильмы + private List getAll() { return reviewStorage.getAll().stream() .sorted(Comparator.comparingLong(Review::getUseful).reversed()) .collect(Collectors.toList()); } - public List getByFilmId(long filmId, int limit) { // получаем отзывы к нужному фильму + private List getByFilmId(long filmId, int limit) { return reviewStorage.getByFilmId(filmId).stream() .sorted(Comparator.comparingLong(Review::getUseful).reversed()) .limit(limit) .collect(Collectors.toList()); } - public List get (Long filmId, int count) { - if (filmId == null) { - return getAll(); - } - return getByFilmId(filmId, count); - } } diff --git a/src/main/java/ru/com/practicum/filmorate/service/UserService.java b/src/main/java/ru/com/practicum/filmorate/service/UserService.java index 1af8eed..5420ab7 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/UserService.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service @Slf4j @@ -77,4 +78,11 @@ public List getRecommendations(Long userId) { userStorage.getById(userId); return filmService.getRecommendations(userId); } + + public List getCommonFriends(Long id, Long otherId) { + List first = getAllFriends(id); + List second = getAllFriends(otherId); + return first.stream().filter(second::contains).collect(Collectors.toList()); + } + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/MPA/DBMPAStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/MPA/DBMPAStorage.java index 7c4d119..8cf6919 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/MPA/DBMPAStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/MPA/DBMPAStorage.java @@ -43,4 +43,5 @@ private MPA makeMPA(ResultSet rs) throws SQLException { String name = rs.getString("name"); return new MPA(id, name); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/MPA/MPAStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/MPA/MPAStorage.java index 1a0cbdc..7ec6473 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/MPA/MPAStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/MPA/MPAStorage.java @@ -9,4 +9,5 @@ public interface MPAStorage { List getAll(); MPA getById(Long id) throws NotFoundException; + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/director/DBDirectorStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/director/DBDirectorStorage.java index 1c663a8..ed3cf7a 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/director/DBDirectorStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/director/DBDirectorStorage.java @@ -117,4 +117,5 @@ private Director makeDirector(ResultSet rs) throws SQLException { String name = rs.getString("name"); return new Director(id, name); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/director/DirectorStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/director/DirectorStorage.java index d86c931..fc08dd8 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/director/DirectorStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/director/DirectorStorage.java @@ -21,4 +21,5 @@ public interface DirectorStorage { void addAllToFilmId(Long filmId, List directors); void deleteAllByFilmId(Long filmId); + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/feed/DBFeedStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/feed/DBFeedStorage.java index 8c95436..9f14c7d 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/feed/DBFeedStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/feed/DBFeedStorage.java @@ -22,22 +22,21 @@ public DBFeedStorage(JdbcTemplate jdbcTemplate) { @Override public List getByUserId(Long userId) { - String sqlQuery = - "SELECT f.id, " + - "f.created_at, " + - "f.user_id, " + - "f.event_type, " + - "f.operation, " + - "f.entity_id " + - "FROM feed AS f " + - "WHERE f.user_id = ?;"; + String sqlQuery = "SELECT f.id, " + + "f.created_at, " + + "f.user_id, " + + "f.event_type, " + + "f.operation, " + + "f.entity_id " + + "FROM feed AS f " + + "WHERE f.user_id = ?;"; return jdbcTemplate.query(sqlQuery, (rs, rowNum) -> makeEvent(rs), userId); } @Override public Event addEvent(Event event) { String sqlQuery = "INSERT INTO feed (created_at, user_id, event_type, operation, entity_id) " + - "VALUES (?, ?, ?, ?, ?);"; + "VALUES (?, ?, ?, ?, ?);"; KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement statement = connection.prepareStatement(sqlQuery, new String[]{"id"}); diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java index b76c7b3..352b716 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java @@ -126,10 +126,10 @@ public boolean hasLikeFromUser(Long id, Long userId) { } @Override - public List getFilmsByDirectorId(Long id, SortingTypes sortBy) { + public List getFilmsByDirectorId(Long id, String sortBy) { String sqlQuery; - switch (sortBy) { - case year: + switch (Enum.valueOf(SortingTypes.class, sortBy.toUpperCase())) { + case YEAR: sqlQuery = "SELECT f.id, " + "f.name, " + "f.description, " + @@ -143,7 +143,7 @@ public List getFilmsByDirectorId(Long id, SortingTypes sortBy) { "WHERE fd.director_id = ?" + "ORDER BY f.release_date;"; break; - case likes: + case LIKES: sqlQuery = "SELECT f.id, " + "f.name, " + "f.description, " + @@ -210,12 +210,12 @@ public List getRecommendations(Long userId) { @Override public List getCommonFilms(long userId, long friendId) { String sqlQuery = "SELECT film_id " + - "FROM likes_list " + - "WHERE user_id = ? " + - "INTERSECT SELECT film_id " + - "FROM likes_list " + - "WHERE user_id = ?" + - "GROUP BY user_id"; + "FROM likes_list " + + "WHERE user_id = ? " + + "INTERSECT SELECT film_id " + + "FROM likes_list " + + "WHERE user_id = ?" + + "GROUP BY user_id"; SqlRowSet rowSet = jdbcTemplate.queryForRowSet(sqlQuery, userId, friendId); List commonFilms = new ArrayList<>(); while (rowSet.next()) { @@ -234,35 +234,27 @@ public List searchFilms(String directorSubstring, String titleSubstring) { if (titleSubstring.length() != 0) { title = "%" + titleSubstring.toLowerCase(Locale.ROOT) + "%"; } - String sqlQuery = - "SELECT f.id, " + - "f.name, " + - "f.description, " + - "f.release_date, " + - "f.duration, " + - "f.mpa_id, " + - "m.name AS mpa_name " + - "FROM films AS f " + - "JOIN MPA_ratings AS m " + - "ON m.id = f.mpa_id " + - "LEFT JOIN films_directors AS fd " + - "ON f.id = fd.film_id " + - "LEFT JOIN directors AS d " + - "ON fd.director_id = d.id " + - "LEFT JOIN likes_list AS l " + - "ON f.id = l.film_id " + - "WHERE (LOWER(d.name) LIKE ?) " + - "OR (LOWER(f.name) LIKE ?) " + - "GROUP BY f.id " + - "ORDER BY COUNT(l.user_id) DESC;"; + String sqlQuery = "SELECT f.id, " + + "f.name, " + + "f.description, " + + "f.release_date, " + + "f.duration, " + + "f.mpa_id, " + + "m.name AS mpa_name " + + "FROM films AS f " + + "JOIN MPA_ratings AS m ON m.id = f.mpa_id " + + "LEFT JOIN films_directors AS fd ON f.id = fd.film_id " + + "LEFT JOIN directors AS d ON fd.director_id = d.id " + + "LEFT JOIN likes_list AS l ON f.id = l.film_id " + + "WHERE (LOWER(d.name) LIKE ?) OR (LOWER(f.name) LIKE ?) " + + "GROUP BY f.id " + + "ORDER BY COUNT(l.user_id) DESC;"; return jdbcTemplate.query(sqlQuery, (rs, rowNum) -> makeFilm(rs, genreService, directorService), director, title); } - private Film makeFilm(ResultSet rs, - GenreService genreService, + private Film makeFilm(ResultSet rs, GenreService genreService, DirectorService directorService) throws SQLException { - Long id = rs.getLong("id"); String name = rs.getString("name"); String description = rs.getString("description"); @@ -286,4 +278,5 @@ private long createLikeId(ResultSet rs, int rowNum) throws SQLException { String user_id = "user_id"; return rs.getLong(user_id); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java index 5b31091..36de39c 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java @@ -2,7 +2,6 @@ import ru.com.practicum.filmorate.exception.NotFoundException; import ru.com.practicum.filmorate.model.Film; -import ru.com.practicum.filmorate.model.SortingTypes; import java.util.List; @@ -25,7 +24,7 @@ public interface FilmStorage { List getCommonFilms(long userId, long friendId); - List getFilmsByDirectorId(Long id, SortingTypes sortBy); + List getFilmsByDirectorId(Long id, String sortBy); List getRecommendations(Long userId); diff --git a/src/main/java/ru/com/practicum/filmorate/storage/genre/DBGenreStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/genre/DBGenreStorage.java index 034582c..15c6a6a 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/genre/DBGenreStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/genre/DBGenreStorage.java @@ -78,4 +78,5 @@ private Genre makeGenre(ResultSet rs) throws SQLException { String name = rs.getString("name"); return new Genre(id, name); } + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/genre/GenreStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/genre/GenreStorage.java index 2fb1a79..af6a8df 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/genre/GenreStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/genre/GenreStorage.java @@ -15,4 +15,5 @@ public interface GenreStorage { void addAllToFilmId(Long filmId, List genre); void deleteAllByFilmId(Long filmId); + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/review/ReviewStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/review/ReviewStorage.java index 950b08f..3e0019c 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/review/ReviewStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/review/ReviewStorage.java @@ -25,4 +25,5 @@ public interface ReviewStorage { void removeDislike(long reviewId, long userId); List getByFilmId(long filmId); + } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/user/UserStorage.java index 01c7a6c..f728097 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/user/UserStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/user/UserStorage.java @@ -21,4 +21,5 @@ public interface UserStorage { void removeFriends(Long userId, Long friendId); List getUserFriendsById(Long userId); + } diff --git a/src/main/java/ru/com/practicum/filmorate/validator/DirectorValidator.java b/src/main/java/ru/com/practicum/filmorate/validator/DirectorValidator.java index c55aed7..10a1243 100644 --- a/src/main/java/ru/com/practicum/filmorate/validator/DirectorValidator.java +++ b/src/main/java/ru/com/practicum/filmorate/validator/DirectorValidator.java @@ -11,4 +11,5 @@ public static void validate(Director director) throws ValidationException { throw new ValidationException("Имя не может быть пустым"); } } + } diff --git a/src/main/java/ru/com/practicum/filmorate/validator/FilmValidator.java b/src/main/java/ru/com/practicum/filmorate/validator/FilmValidator.java index ab66ff0..084fcbe 100644 --- a/src/main/java/ru/com/practicum/filmorate/validator/FilmValidator.java +++ b/src/main/java/ru/com/practicum/filmorate/validator/FilmValidator.java @@ -27,4 +27,5 @@ public static void validate(Film film) throws ValidationException { throw new ValidationException("Продолжительность должна быть положительной"); } } + } diff --git a/src/main/java/ru/com/practicum/filmorate/validator/UserValidator.java b/src/main/java/ru/com/practicum/filmorate/validator/UserValidator.java index ac0637c..ac94935 100644 --- a/src/main/java/ru/com/practicum/filmorate/validator/UserValidator.java +++ b/src/main/java/ru/com/practicum/filmorate/validator/UserValidator.java @@ -26,4 +26,5 @@ public static void validate(User user) throws ValidationException { } } + } From 0e7e7b7690308b14eb24a32182d525782c62de1a Mon Sep 17 00:00:00 2001 From: alex1261bat Date: Fri, 26 Aug 2022 21:38:15 +0300 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/com/practicum/filmorate/controller/FilmController.java | 2 +- .../java/ru/com/practicum/filmorate/service/FilmService.java | 3 ++- .../com/practicum/filmorate/storage/film/DBFilmStorage.java | 4 ++-- .../ru/com/practicum/filmorate/storage/film/FilmStorage.java | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java index d6fbe05..e916472 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java @@ -89,7 +89,7 @@ public void deleteFilm(@PathVariable Long filmId) { @GetMapping(value = "/films/director/{directorId}") public List getFilmsByDirectorId(@PathVariable Long directorId, @RequestParam String sortBy) throws NotFoundException { - return filmService.getFilmsByDirectorId(directorId, sortBy); + return filmService.getFilmsByDirectorId(directorId, Enum.valueOf(SortingTypes.class, sortBy.toUpperCase())); } @GetMapping(value = "/films/search") diff --git a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java index e07cdc3..051f164 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service; import ru.com.practicum.filmorate.exception.NotFoundException; import ru.com.practicum.filmorate.model.Film; +import ru.com.practicum.filmorate.model.SortingTypes; import ru.com.practicum.filmorate.storage.film.DBFilmStorage; import ru.com.practicum.filmorate.storage.film.FilmStorage; import ru.com.practicum.filmorate.validator.FilmValidator; @@ -96,7 +97,7 @@ public void deleteFilm(Long filmId) { log.info("Фильм c id {} удален", filmId); } - public List getFilmsByDirectorId(Long directorId, String sortBy) throws NotFoundException { + public List getFilmsByDirectorId(Long directorId, SortingTypes sortBy) throws NotFoundException { directorService.getById(directorId); return filmStorage.getFilmsByDirectorId(directorId, sortBy); } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java index 352b716..035d253 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java @@ -126,9 +126,9 @@ public boolean hasLikeFromUser(Long id, Long userId) { } @Override - public List getFilmsByDirectorId(Long id, String sortBy) { + public List getFilmsByDirectorId(Long id, SortingTypes sortBy) { String sqlQuery; - switch (Enum.valueOf(SortingTypes.class, sortBy.toUpperCase())) { + switch (sortBy) { case YEAR: sqlQuery = "SELECT f.id, " + "f.name, " + diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java index 36de39c..5b31091 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java @@ -2,6 +2,7 @@ import ru.com.practicum.filmorate.exception.NotFoundException; import ru.com.practicum.filmorate.model.Film; +import ru.com.practicum.filmorate.model.SortingTypes; import java.util.List; @@ -24,7 +25,7 @@ public interface FilmStorage { List getCommonFilms(long userId, long friendId); - List getFilmsByDirectorId(Long id, String sortBy); + List getFilmsByDirectorId(Long id, SortingTypes sortBy); List getRecommendations(Long userId); From 3cb3d035a8b0453ebe1d903442ce999c7aaf097c Mon Sep 17 00:00:00 2001 From: alex1261bat Date: Fri, 26 Aug 2022 23:52:03 +0300 Subject: [PATCH 5/5] feat: add-marks --- .../filmorate/controller/FilmController.java | 9 +++-- .../filmorate/service/FilmService.java | 10 ++++-- .../filmorate/storage/film/DBFilmStorage.java | 36 +++++++++++-------- .../filmorate/storage/film/FilmStorage.java | 2 +- src/main/resources/schema.sql | 3 +- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java index e916472..c2fb094 100644 --- a/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/com/practicum/filmorate/controller/FilmController.java @@ -9,6 +9,7 @@ import ru.com.practicum.filmorate.service.FeedService; import ru.com.practicum.filmorate.service.FilmService; +import javax.validation.constraints.Positive; import java.util.List; @@ -40,8 +41,8 @@ public Film update(@RequestBody Film film) throws ValidationException, NotFoundE } @PutMapping(value = "/films/{id}/like/{userId}") - public void addLike(@PathVariable Long id, @PathVariable Long userId) { - filmService.addLike(id, userId); + public void addLike(@PathVariable Long id, @PathVariable Long userId, @RequestParam @Positive int rating) { + filmService.addLike(id, userId, rating); Event event = Event.builder() .timestamp(System.currentTimeMillis()) .userId(userId) @@ -75,9 +76,7 @@ public List getTop(@RequestParam(defaultValue = "10", required = false) In } @GetMapping(value = "/films/common") - public List getCommonFilms( - @RequestParam long userId, - @RequestParam long friendId){ + public List getCommonFilms(@RequestParam long userId, @RequestParam long friendId) { return filmService.getCommonFilms(userId, friendId); } diff --git a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java index 051f164..9920a83 100644 --- a/src/main/java/ru/com/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/com/practicum/filmorate/service/FilmService.java @@ -54,9 +54,13 @@ public Film update(Film film) throws NotFoundException { return filmStorage.update(film); } - public void addLike(Long id, Long userId) throws NotFoundException { + public void addLike(Long id, Long userId, int rating) throws NotFoundException { Film film = filmStorage.getById(id); - filmStorage.addLike(id, userId); + + if (rating < 11) { + filmStorage.addLike(id, userId, rating); + } + log.info("Фильм с id={} лайкнул пользователь {}", film.getId(), userId); } @@ -72,7 +76,7 @@ public void removeLike(Long id, Long userId) throws NotFoundException { public List getTop(Integer count, Long genreId, Integer year) { return getFilterFilmsByGenreId(getFilterFilmsByYear(filmStorage.getAll().stream(), year), genreId) .sorted((f1, f2) -> - (dbFilmStorage.getFilmLikeId(f2.getId()) - dbFilmStorage.getFilmLikeId(f1.getId()))) + (int) (dbFilmStorage.getFilmRating(f2.getId()) - dbFilmStorage.getFilmRating(f1.getId()))) .limit(count) .collect(Collectors.toList()); } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java index 035d253..bfbb599 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/DBFilmStorage.java @@ -107,9 +107,9 @@ public void delete(Long filmId) { } @Override - public void addLike(Long id, Long userId) { - String sqlQuery = "INSERT INTO likes_list (user_id, film_id) VALUES (?, ?);"; - jdbcTemplate.update(sqlQuery, userId, id); + public void addLike(Long id, Long userId, int rating) { + String sqlQuery = "INSERT INTO likes_list (user_id, film_id, rating) VALUES (?, ?, ?);"; + jdbcTemplate.update(sqlQuery, userId, id, rating); } @Override @@ -155,7 +155,7 @@ public List getFilmsByDirectorId(Long id, SortingTypes sortBy) { "JOIN MPA_ratings AS m ON m.id = f.mpa_id " + "JOIN films AS f ON f.id = fd.film_id " + "LEFT JOIN (SELECT film_id, " + - "COUNT(user_id) rate " + + "AVG(rating) rate " + "FROM likes_list " + "GROUP BY film_id) r ON fd.id = r.film_id " + "WHERE fd.director_id = ?" + @@ -171,13 +171,16 @@ public List getFilmsByDirectorId(Long id, SortingTypes sortBy) { public List getRecommendations(Long userId) { List recommendations = new ArrayList<>(); - String similarUserQuery = "SELECT user_id, COUNT(film_id) as c " + + String similarUserQuery = "SELECT user_id, AVG(rating) as r " + "FROM likes_list " + "WHERE film_id IN (SELECT film_id " + "FROM likes_list " + "WHERE user_id = ?) AND user_id != ? " + + "AND rating IN (SELECT rating " + + "FROM likes_list " + + "WHERE user_id = ?) " + "GROUP BY user_id " + - "ORDER BY c DESC " + + "ORDER BY r DESC " + "LIMIT 1;"; String recommendedFilmsQuery = "SELECT f.id, " + @@ -192,9 +195,10 @@ public List getRecommendations(Long userId) { "JOIN MPA_ratings AS m ON m.id = f.mpa_id " + "WHERE l.film_id NOT IN (SELECT film_id " + "FROM likes_list " + - "WHERE user_id = ?) AND l.user_id = ? ;"; + "WHERE user_id = ?) AND l.user_id = ? " + + "AND l.rating > 5;"; - SqlRowSet rowSet = jdbcTemplate.queryForRowSet(similarUserQuery, userId, userId); + SqlRowSet rowSet = jdbcTemplate.queryForRowSet(similarUserQuery, userId, userId, userId); if (!rowSet.next()) { return recommendations; @@ -248,7 +252,7 @@ public List searchFilms(String directorSubstring, String titleSubstring) { "LEFT JOIN likes_list AS l ON f.id = l.film_id " + "WHERE (LOWER(d.name) LIKE ?) OR (LOWER(f.name) LIKE ?) " + "GROUP BY f.id " + - "ORDER BY COUNT(l.user_id) DESC;"; + "ORDER BY AVG(l.rating) DESC;"; return jdbcTemplate.query(sqlQuery, (rs, rowNum) -> makeFilm(rs, genreService, directorService), director, title); } @@ -269,14 +273,16 @@ private Film makeFilm(ResultSet rs, GenreService genreService, return new Film(id, name, description, releaseDate, duration, genres, mpa, directors); } - public int getFilmLikeId(long film) { - String sqlQuery = "SELECT user_id FROM likes_list WHERE film_id = ?"; - return jdbcTemplate.query(sqlQuery, this::createLikeId, film).size(); + public double getFilmRating(long film) { + String sqlQuery = "SELECT rating FROM likes_list WHERE film_id = ?"; + return jdbcTemplate.query(sqlQuery, this::createRating, film).stream() + .mapToInt(Math::toIntExact) + .average() + .getAsDouble(); } - private long createLikeId(ResultSet rs, int rowNum) throws SQLException { - String user_id = "user_id"; - return rs.getLong(user_id); + private long createRating(ResultSet rs, int rowNum) throws SQLException { + return rs.getInt("rating"); } } diff --git a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java index 5b31091..ec4aa45 100644 --- a/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/com/practicum/filmorate/storage/film/FilmStorage.java @@ -17,7 +17,7 @@ public interface FilmStorage { void delete(Long filmId); - void addLike(Long id, Long userId); + void addLike(Long id, Long userId, int rating); void removeLike(Long id, Long userId); diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index da00f5d..bbd832a 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -42,7 +42,8 @@ CREATE TABLE IF NOT EXISTS friendships ( CREATE TABLE IF NOT EXISTS likes_list ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, user_id BIGINT REFERENCES users (id) ON DELETE CASCADE, - film_id BIGINT REFERENCES films (id) ON DELETE CASCADE + film_id BIGINT REFERENCES films (id) ON DELETE CASCADE, + rating INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS directors (