diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java index 51a4b5f5..3a127c5a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java @@ -4,6 +4,7 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.dto.ReviewDto; +import ru.yandex.practicum.filmorate.model.ReviewLike; import ru.yandex.practicum.filmorate.service.ReviewService; import javax.validation.Valid; @@ -45,21 +46,21 @@ public List getReviewsByFilmId(@RequestParam(required = false) Long f @PutMapping("/{id}/like/{userId}") public ReviewDto addLikeToReview(@PathVariable long id, @PathVariable long userId) { - return reviewService.addLikeToReview(id, userId); + return reviewService.addLikeOrDislikeToReview(id, userId, ReviewLike.LIKE.toString()); } @PutMapping("/{id}/dislike/{userId}") public ReviewDto addDislikeToReview(@PathVariable long id, @PathVariable long userId) { - return reviewService.addDislikeToReview(id, userId); + return reviewService.addLikeOrDislikeToReview(id, userId, ReviewLike.DISLIKE.toString()); } @DeleteMapping("/{id}/like/{userId}") public ReviewDto deleteLikeFromReview(@PathVariable long id, @PathVariable long userId) { - return reviewService.deleteLikeFromReview(id, userId); + return reviewService.deleteLikeOrDislikeFromReview(id, userId, ReviewLike.LIKE.toString()); } @DeleteMapping("/{id}/dislike/{userId}") public ReviewDto deleteDislikeFromReview(@PathVariable long id, @PathVariable long userId) { - return reviewService.deleteDislikeFromReview(id, userId); + return reviewService.deleteLikeOrDislikeFromReview(id, userId, ReviewLike.DISLIKE.toString()); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/DirectorStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/DirectorStorage.java index 87d2dfd3..004faefb 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/DirectorStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/DirectorStorage.java @@ -3,4 +3,6 @@ import ru.yandex.practicum.filmorate.model.Director; public interface DirectorStorage extends Dao { + + void addDirectorToFilm(long filmId, long directorId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java deleted file mode 100644 index 619cd98d..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.yandex.practicum.filmorate.dao; - -import ru.yandex.practicum.filmorate.model.Director; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public interface FilmDirectorStorage { - void add(long filmId, long directorId); - - void batchUpdate(long filmId, Set directors); - - void deleteAllByFilmId(long filmId); - - Map> findDirectorsInIdList(Set filmIds); - - List findFilmsByDirectorId(long directorId); - - List findAllById(long filmId); -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmGenreStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmGenreStorage.java deleted file mode 100644 index 109292ab..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmGenreStorage.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.yandex.practicum.filmorate.dao; - -import ru.yandex.practicum.filmorate.model.Genre; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public interface FilmGenreStorage { - void add(long filmId, long genreId); - - List findAllById(long filmId); - - Map> findGenresInIdList(Set filmIds); - - void deleteAllById(long filmId); - - void batchUpdate(long filmId, Set genres); -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmLikeStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmLikeStorage.java deleted file mode 100644 index 7c693e7d..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmLikeStorage.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.yandex.practicum.filmorate.dao; - -import java.util.Map; -import java.util.Set; - -public interface FilmLikeStorage { - void add(long filmId, long userId); - - Long getCountById(long filmId); - - Map findAll(); - - void remove(long filmId, long userId); - - Map> getUsersAndFilmLikes(); -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java index eeb54746..8f74cf35 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java @@ -4,10 +4,17 @@ import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; +import java.util.Map; import java.util.Set; public interface FilmStorage extends Dao { + void addLikeToFilm(long filmId, long userId); + + void removeLikeFromFilm(long filmId, long userId); + + Map> getUsersAndFilmLikes(); + Collection findFilmsByIds(Set filmIds); Collection searchFilms(FilmSearchDto search); diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewLikeStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewLikeStorage.java deleted file mode 100644 index 90d6f0a0..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewLikeStorage.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.yandex.practicum.filmorate.dao; - -public interface ReviewLikeStorage { - void add(long reviewId, long userId, String type); - - void delete(long reviewId, long userId, String type); -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewStorage.java index a220dbfe..e1adbe7d 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewStorage.java @@ -9,7 +9,7 @@ public interface ReviewStorage extends Dao { List findAllLimitBy(int count); - void addLikeToReview(long id); + void addLikeOrDislikeToReview(long reviewId, long userId, String type); - void addDislikeToReview(long id); + void deleteLikeOrDislikeFromReview(final long reviewId, final long userId, final String type); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/DirectorDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/DirectorDbStorage.java index 8429ac06..4f705fde 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/DirectorDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/DirectorDbStorage.java @@ -71,6 +71,12 @@ public Director findById(final long id) { } } + @Override + public void addDirectorToFilm(final long filmId, final long directorId) { + final String sql = "INSERT INTO film_director VALUES (?, ?)"; + jdbcTemplate.update(sql, filmId, directorId); + } + private Director mapToDirector(ResultSet rs, int rowNum) throws SQLException { return Director.builder() .id(rs.getLong("id")) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDbStorage.java index aef3dfcc..d18baded 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDbStorage.java @@ -2,13 +2,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dao.FilmDirectorStorage; -import ru.yandex.practicum.filmorate.dao.FilmGenreStorage; import ru.yandex.practicum.filmorate.dao.FilmStorage; import ru.yandex.practicum.filmorate.dto.FilmSearchDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; @@ -30,10 +30,6 @@ public class FilmDbStorage implements FilmStorage { private final JdbcTemplate jdbcTemplate; - private final FilmGenreStorage filmGenreStorage; - - private final FilmDirectorStorage filmDirectorStorage; - @Override public Film add(final Film film) { final KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -50,8 +46,8 @@ public Film add(final Film film) { film.setId(Objects.requireNonNull(keyHolder.getKey(), "Не удалось добавить фильм.").longValue()); - filmGenreStorage.batchUpdate(film.getId(), film.getGenres()); - filmDirectorStorage.batchUpdate(film.getId(), film.getDirectors()); + batchUpdateGenres(film.getId(), film.getGenres()); + batchUpdateDirectors(film.getId(), film.getDirectors()); return film; } @@ -74,10 +70,10 @@ public void update(final Film film) { throw new NotFoundException("Фильм с id '" + film.getId() + "' не найден."); } - filmGenreStorage.deleteAllById(film.getId()); - filmGenreStorage.batchUpdate(film.getId(), film.getGenres()); - filmDirectorStorage.deleteAllByFilmId(film.getId()); - filmDirectorStorage.batchUpdate(film.getId(), film.getDirectors()); + deleteAllGenresByFilmId(film.getId()); + batchUpdateGenres(film.getId(), film.getGenres()); + deleteAllDirectorsByFilmId(film.getId()); + batchUpdateDirectors(film.getId(), film.getDirectors()); } @Override @@ -107,8 +103,8 @@ public Film findById(final long filmId) { try { final Film film = jdbcTemplate.queryForObject(sql, this::mapToFilm, filmId); - List genres = filmGenreStorage.findAllById(filmId); - List directors = filmDirectorStorage.findAllById(filmId); + List genres = findAllGenresByFilmId(filmId); + List directors = findAllDirectorsByFilmId(filmId); film.getGenres().addAll(genres); film.getDirectors().addAll(directors); return film; @@ -141,7 +137,7 @@ public Collection findMostLikedFilms(final int count, final Integer genreI @Override public Collection findFilmsFromDirectorOrderBy(final long directorId, final String sortBy) { - final List filmsByDirectorId = filmDirectorStorage.findFilmsByDirectorId(directorId); + final List filmsByDirectorId = findFilmsByDirectorId(directorId); final String ids = String.join(",", Collections.nCopies(filmsByDirectorId.size(), "?")); final String sql = String.format( "SELECT " + @@ -225,20 +221,117 @@ public Collection findCommonFilms(long userId, long friendId) { return jdbcTemplate.query(sql, this::mapToFilm, userId, friendId); } + @Override + public void addLikeToFilm(final long filmId, final long userId) { + final String sql = "INSERT INTO film_like (film_id, user_id) VALUES (?, ?)"; + jdbcTemplate.update(sql, filmId, userId); + } + + @Override + public void removeLikeFromFilm(long filmId, long userId) { + final String sql = "DELETE FROM film_like WHERE film_id = ? AND user_id = ?"; + jdbcTemplate.update(sql, filmId, userId); + } + + @Override + public Map> getUsersAndFilmLikes() { + String filmsIdsSql = "SELECT user_id, film_id FROM film_like"; + return jdbcTemplate.query(filmsIdsSql, this::extractToUserIdLikedFilmsIdsMap); + } + private void setGenresForFilms(Collection films) { Map filmMap = films.stream() .collect(Collectors.toMap(Film::getId, identity())); - Map> filmIdGenreMap = filmGenreStorage.findGenresInIdList(filmMap.keySet()); + Map> filmIdGenreMap = findGenresInIdList(filmMap.keySet()); filmIdGenreMap.forEach((id, genres) -> filmMap.get(id).getGenres().addAll(genres)); } private void setDirectorsForFilms(Collection films) { Map filmMap = films.stream() .collect(Collectors.toMap(Film::getId, identity())); - Map> filmIdDirectorMap = filmDirectorStorage.findDirectorsInIdList(filmMap.keySet()); + Map> filmIdDirectorMap = findDirectorsInIdList(filmMap.keySet()); filmIdDirectorMap.forEach((id, directors) -> filmMap.get(id).getDirectors().addAll(directors)); } + private void batchUpdateGenres(final long filmId, final Set genres) { + final List genreList = new ArrayList<>(genres); + final String sql = "INSERT INTO film_genre (film_id, genre_id) VALUES (?, ?)"; + jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + ps.setLong(1, filmId); + ps.setLong(2, genreList.get(i).getId()); + } + + @Override + public int getBatchSize() { + return genres.size(); + } + }); + } + + private void batchUpdateDirectors(final long filmId, final Set directors) { + final List directorList = new ArrayList<>(directors); + final String sql = "INSERT INTO film_director (film_id, director_id) VALUES (?, ?)"; + jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + ps.setLong(1, filmId); + ps.setLong(2, directorList.get(i).getId()); + } + + @Override + public int getBatchSize() { + return directors.size(); + } + }); + } + + private void deleteAllGenresByFilmId(final long filmId) { + final String sql = "DELETE FROM film_genre WHERE film_id = ?"; + jdbcTemplate.update(sql, filmId); + } + + private void deleteAllDirectorsByFilmId(final long filmId) { + final String sql = "DELETE FROM film_director WHERE film_id = ?"; + jdbcTemplate.update(sql, filmId); + } + + private Map> findGenresInIdList(Set filmIds) { + final String ids = String.join(",", Collections.nCopies(filmIds.size(), "?")); + final String sql = String.format( + "SELECT fg.film_id, fg.genre_id, g.genre_name FROM film_genre fg JOIN genre g ON fg.genre_id = g.id" + + " WHERE fg.film_id IN (%s)", ids); + + return jdbcTemplate.query(sql, this::extractToFilmIdGenreMap, filmIds.toArray()); + } + + private Map> findDirectorsInIdList(final Set filmIds) { + final String ids = String.join(",", Collections.nCopies(filmIds.size(), "?")); + final String sql = String.format( + "SELECT fd.film_id, fd.director_id, d.director_name FROM film_director fd JOIN director d ON fd.director_id = d.id" + + " WHERE fd.film_id IN (%s)", ids); + + return jdbcTemplate.query(sql, this::extractToFilmIdDirectorMap, filmIds.toArray()); + } + + private List findAllGenresByFilmId(final long filmId) { + final String sql = "SELECT fg.genre_id, g.genre_name FROM film_genre fg JOIN genre g ON fg.genre_id = g.id" + + " WHERE film_id = ?"; + return jdbcTemplate.query(sql, this::mapRowToGenre, filmId); + } + + private List findAllDirectorsByFilmId(long filmId) { + final String sql = "SELECT fd.film_id, fd.director_id, d.director_name FROM film_director fd JOIN director d ON fd.director_id = d.id" + + " WHERE fd.film_id = ?"; + return jdbcTemplate.query(sql, this::mapToDirector, filmId); + } + + private List findFilmsByDirectorId(final long directorId) { + final String sql = "SELECT film_id FROM film_director WHERE director_id = ?"; + return jdbcTemplate.queryForList(sql, Long.class, directorId); + } + private Film mapToFilm(ResultSet rs, int rowNum) throws SQLException { Film film = Film.builder() .id(rs.getLong(1)) @@ -251,4 +344,62 @@ private Film mapToFilm(ResultSet rs, int rowNum) throws SQLException { film.setLikes(rs.getLong("likes")); return film; } + + private Map> extractToFilmIdGenreMap(ResultSet rs) throws SQLException, DataAccessException { + final Map> filmIdGenreMap = new HashMap<>(); + while (rs.next()) { + final Long filmId = rs.getLong(1); + List genres = filmIdGenreMap.get(filmId); + if (genres == null) { + genres = new ArrayList<>(); + } + final Genre genre = new Genre(rs.getInt("genre_id"), rs.getString("genre_name")); + genres.add(genre); + filmIdGenreMap.put(filmId, genres); + } + return filmIdGenreMap; + } + + private Map> extractToFilmIdDirectorMap(ResultSet rs) throws SQLException, DataAccessException { + final Map> filmIdDirectorMap = new HashMap<>(); + while (rs.next()) { + final Long filmId = rs.getLong(1); + List directors = filmIdDirectorMap.get(filmId); + if (directors == null) { + directors = new ArrayList<>(); + } + final Director director = Director.builder() + .id(rs.getLong("director_id")) + .name(rs.getString("director_name")) + .build(); + directors.add(director); + filmIdDirectorMap.put(filmId, directors); + } + return filmIdDirectorMap; + } + + private Genre mapRowToGenre(ResultSet rs, int rowNum) throws SQLException { + return new Genre(rs.getInt("genre_id"), rs.getString("genre_name")); + } + + private Director mapToDirector(ResultSet rs, int i) throws SQLException { + return Director.builder() + .id(rs.getLong("director_id")) + .name(rs.getString("director_name")) + .build(); + } + + private Map> extractToUserIdLikedFilmsIdsMap(ResultSet rs) throws SQLException, DataAccessException { + final Map> userFilmLikesMap = new HashMap<>(); + while (rs.next()) { + final Long userId = rs.getLong("user_id"); + Set filmLikes = userFilmLikesMap.get(userId); + if (filmLikes == null) { + filmLikes = new HashSet<>(); + } + filmLikes.add(rs.getLong("film_id")); + userFilmLikesMap.put(userId, filmLikes); + } + return userFilmLikesMap; + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDirectorDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDirectorDbStorage.java deleted file mode 100644 index d912872d..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDirectorDbStorage.java +++ /dev/null @@ -1,99 +0,0 @@ -package ru.yandex.practicum.filmorate.dao.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.BatchPreparedStatementSetter; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dao.FilmDirectorStorage; -import ru.yandex.practicum.filmorate.model.Director; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - -@Repository -@RequiredArgsConstructor -public class FilmDirectorDbStorage implements FilmDirectorStorage { - - private final JdbcTemplate jdbcTemplate; - - @Override - public void add(final long filmId, final long directorId) { - final String sql = "INSERT INTO film_director VALUES (?, ?)"; - jdbcTemplate.update(sql, filmId, directorId); - } - - @Override - public void batchUpdate(final long filmId, final Set directors) { - final List directorList = new ArrayList<>(directors); - final String sql = "INSERT INTO film_director (film_id, director_id) VALUES (?, ?)"; - jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { - @Override - public void setValues(PreparedStatement ps, int i) throws SQLException { - ps.setLong(1, filmId); - ps.setLong(2, directorList.get(i).getId()); - } - - @Override - public int getBatchSize() { - return directors.size(); - } - }); - } - - @Override - public void deleteAllByFilmId(final long filmId) { - final String sql = "DELETE FROM film_director WHERE film_id = ?"; - jdbcTemplate.update(sql, filmId); - } - - @Override - public Map> findDirectorsInIdList(final Set filmIds) { - final String ids = String.join(",", Collections.nCopies(filmIds.size(), "?")); - final String sql = String.format( - "SELECT fd.film_id, fd.director_id, d.director_name FROM film_director fd JOIN director d ON fd.director_id = d.id" + - " WHERE fd.film_id IN (%s)", ids); - - return jdbcTemplate.query(sql, this::extractToMap, filmIds.toArray()); - } - - @Override - public List findFilmsByDirectorId(final long directorId) { - final String sql = "SELECT film_id FROM film_director WHERE director_id = ?"; - return jdbcTemplate.queryForList(sql, Long.class, directorId); - } - - @Override - public List findAllById(long filmId) { - final String sql = "SELECT fd.film_id, fd.director_id, d.director_name FROM film_director fd JOIN director d ON fd.director_id = d.id" + - " WHERE fd.film_id = ?"; - return jdbcTemplate.query(sql, this::mapToDirector, filmId); - } - - private Director mapToDirector(ResultSet rs, int i) throws SQLException { - return Director.builder() - .id(rs.getLong("director_id")) - .name(rs.getString("director_name")) - .build(); - } - - private Map> extractToMap(ResultSet rs) throws SQLException, DataAccessException { - final Map> filmIdDirectorMap = new HashMap<>(); - while (rs.next()) { - final Long filmId = rs.getLong(1); - List directors = filmIdDirectorMap.get(filmId); - if (directors == null) { - directors = new ArrayList<>(); - } - final Director director = Director.builder() - .id(rs.getLong("director_id")) - .name(rs.getString("director_name")) - .build(); - directors.add(director); - filmIdDirectorMap.put(filmId, directors); - } - return filmIdDirectorMap; - } -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmGenreDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmGenreDbStorage.java deleted file mode 100644 index e9c49b0f..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmGenreDbStorage.java +++ /dev/null @@ -1,87 +0,0 @@ -package ru.yandex.practicum.filmorate.dao.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.BatchPreparedStatementSetter; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dao.FilmGenreStorage; -import ru.yandex.practicum.filmorate.model.Genre; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - -@Repository -@RequiredArgsConstructor -public class FilmGenreDbStorage implements FilmGenreStorage { - - private final JdbcTemplate jdbcTemplate; - - @Override - public void add(final long filmId, final long genreId) { - final String sql = "MERGE INTO film_genre (film_id, genre_id) VALUES (?, ?)"; - jdbcTemplate.update(sql, filmId, genreId); - } - - @Override - public List findAllById(final long filmId) { - final String sql = "SELECT fg.genre_id, g.genre_name FROM film_genre fg JOIN genre g ON fg.genre_id = g.id" + - " WHERE film_id = ?"; - return jdbcTemplate.query(sql, this::mapRowToLong, filmId); - } - - @Override - public Map> findGenresInIdList(Set filmIds) { - final String ids = String.join(",", Collections.nCopies(filmIds.size(), "?")); - final String sql = String.format( - "SELECT fg.film_id, fg.genre_id, g.genre_name FROM film_genre fg JOIN genre g ON fg.genre_id = g.id" + - " WHERE fg.film_id IN (%s)", ids); - - return jdbcTemplate.query(sql, this::extractToMap, filmIds.toArray()); - } - - @Override - public void deleteAllById(final long filmId) { - final String sql = "DELETE FROM film_genre WHERE film_id = ?"; - jdbcTemplate.update(sql, filmId); - } - - @Override - public void batchUpdate(final long filmId, final Set genres) { - final List genreList = new ArrayList<>(genres); - final String sql = "INSERT INTO film_genre (film_id, genre_id) VALUES (?, ?)"; - jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { - @Override - public void setValues(PreparedStatement ps, int i) throws SQLException { - ps.setLong(1, filmId); - ps.setLong(2, genreList.get(i).getId()); - } - - @Override - public int getBatchSize() { - return genres.size(); - } - }); - } - - private Genre mapRowToLong(ResultSet rs, int rowNum) throws SQLException { - return new Genre(rs.getInt("genre_id"), rs.getString("genre_name")); - } - - private Map> extractToMap(ResultSet rs) throws SQLException, DataAccessException { - final Map> filmIdGenreMap = new HashMap<>(); - while (rs.next()) { - final Long filmId = rs.getLong(1); - List genres = filmIdGenreMap.get(filmId); - if (genres == null) { - genres = new ArrayList<>(); - } - final Genre genre = new Genre(rs.getInt("genre_id"), rs.getString("genre_name")); - genres.add(genre); - filmIdGenreMap.put(filmId, genres); - } - return filmIdGenreMap; - } -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmLikeDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmLikeDbStorage.java deleted file mode 100644 index cbdf1c5e..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmLikeDbStorage.java +++ /dev/null @@ -1,79 +0,0 @@ -package ru.yandex.practicum.filmorate.dao.impl; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.dao.DataAccessException; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dao.FilmLikeStorage; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - -@Repository -@RequiredArgsConstructor -@Slf4j -public class FilmLikeDbStorage implements FilmLikeStorage { - - private static final Long NO_LIKES = 0L; - private final JdbcTemplate jdbcTemplate; - - @Override - public void add(final long filmId, final long userId) { - final String sql = "INSERT INTO film_like (film_id, user_id) VALUES (?, ?)"; - jdbcTemplate.update(sql, filmId, userId); - } - - @Override - public Long getCountById(long filmId) { - try { - final String sql = "SELECT COUNT(*) AS likes FROM film_like GROUP BY film_id HAVING film_id = ?"; - return jdbcTemplate.queryForObject(sql, Long.class, filmId); - } catch (EmptyResultDataAccessException e) { - log.debug("getCountById вернул пустую строку."); - } - return NO_LIKES; - } - - @Override - public Map findAll() { - final String sql = "SELECT film_id, COUNT(*) AS likes FROM film_like GROUP BY film_id"; - return jdbcTemplate.query(sql, this::mapRowToIdCount); - } - - @Override - public void remove(long filmId, long userId) { - final String sql = "DELETE FROM film_like WHERE film_id = ? AND user_id = ?"; - jdbcTemplate.update(sql, filmId, userId); - } - - @Override - public Map> getUsersAndFilmLikes() { - String filmsIdsSql = "SELECT user_id, film_id FROM film_like"; - return jdbcTemplate.query(filmsIdsSql, this::extractToMap); - } - - private Map mapRowToIdCount(ResultSet rs) throws SQLException { - final Map result = new LinkedHashMap<>(); - while (rs.next()) { - result.put(rs.getLong("film_id"), rs.getLong("likes")); - } - return result; - } - - private Map> extractToMap(ResultSet rs) throws SQLException, DataAccessException { - final Map> userFilmLikesMap = new HashMap<>(); - while (rs.next()) { - final Long userId = rs.getLong("user_id"); - Set filmLikes = userFilmLikesMap.get(userId); - if (filmLikes == null) { - filmLikes = new HashSet<>(); - } - filmLikes.add(rs.getLong("film_id")); - userFilmLikesMap.put(userId, filmLikes); - } - return userFilmLikesMap; - } -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewDbStorage.java index d5fe12a9..573fb967 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewDbStorage.java @@ -9,6 +9,7 @@ import ru.yandex.practicum.filmorate.dao.ReviewStorage; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.model.Review; +import ru.yandex.practicum.filmorate.model.ReviewLike; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -93,15 +94,39 @@ public List findAllLimitBy(final int count) { } @Override - public void addLikeToReview(final long id) { - final String sql = "UPDATE review SET useful = useful + 1 WHERE id = ?"; + public void addLikeOrDislikeToReview(final long id, final long userId, final String type) { + addLikeOrDislike(id, userId, type); + String sql; + if (ReviewLike.LIKE.name().equals(type)) { + sql = "UPDATE review SET useful = useful + 1 WHERE id = ?"; + } else { + sql = "UPDATE review SET useful = useful - 1 WHERE id = ?"; + } jdbcTemplate.update(sql, id); } @Override - public void addDislikeToReview(long id) { - final String sql = "UPDATE review SET useful = useful - 1 WHERE id = ?"; - jdbcTemplate.update(sql, id); + public void deleteLikeOrDislikeFromReview(final long reviewId, final long userId, final String type) { + int update = deleteLikeOrDislike(reviewId, userId, type); + String changeUseful; + if (update == 1) { + if (ReviewLike.LIKE.name().equals(type)) { + changeUseful = "UPDATE review SET useful = useful - 1 WHERE id = ?"; + } else { + changeUseful = "UPDATE review SET useful = useful + 1 WHERE id = ?"; + } + jdbcTemplate.update(changeUseful, reviewId); + } + } + + private void addLikeOrDislike(final long reviewId, final long userId, final String type) { + final String sql = "INSERT INTO review_like VALUES (?, ?, ?)"; + jdbcTemplate.update(sql, reviewId, userId, type); + } + + private int deleteLikeOrDislike(final long reviewId, final long userId, final String type) { + final String sql = "DELETE FROM review_like WHERE review_id = ? AND user_id = ? AND like_type = ?"; + return jdbcTemplate.update(sql, reviewId, userId, type); } private Review mapReview(final ResultSet rs, final int rowNum) throws SQLException { diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewLikeDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewLikeDbStorage.java deleted file mode 100644 index 26cd5a6f..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewLikeDbStorage.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.yandex.practicum.filmorate.dao.impl; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dao.ReviewLikeStorage; - -@Repository -@RequiredArgsConstructor -@Slf4j -public class ReviewLikeDbStorage implements ReviewLikeStorage { - - private final JdbcTemplate jdbcTemplate; - - @Override - public void add(final long reviewId, final long userId, final String type) { - final String sql = "INSERT INTO review_like VALUES (?, ?, ?)"; - jdbcTemplate.update(sql, reviewId, userId, type); - } - - @Override - public void delete(final long reviewId, final long userId, final String type) { - final String sql = "DELETE FROM review_like WHERE review_id = ? AND user_id = ? AND like_type = ?"; - jdbcTemplate.update(sql, userId, type); - } -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java index 71f1acc7..dd20d4b1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java @@ -16,11 +16,7 @@ public interface ReviewService { List getReviewsByFilmId(Long filmId, int count); - ReviewDto addLikeToReview(long id, long userId); + ReviewDto addLikeOrDislikeToReview(long id, long userId, String type); - ReviewDto addDislikeToReview(long id, long userId); - - ReviewDto deleteLikeFromReview(long id, long userId); - - ReviewDto deleteDislikeFromReview(long id, long userId); + ReviewDto deleteLikeOrDislikeFromReview(long id, long userId, String type); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/impl/FilmServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/impl/FilmServiceImpl.java index 31acfe57..1e803ca1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/impl/FilmServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/impl/FilmServiceImpl.java @@ -27,8 +27,6 @@ public class FilmServiceImpl implements FilmService { private final UserStorage userStorage; - private final FilmLikeStorage filmLikeStorage; - private final DirectorStorage directorStorage; private final EventStorage eventStorage; @@ -100,7 +98,7 @@ public FilmDto getFilmById(final long filmId) { public FilmDto likeFilm(final long filmId, final long userId) { filmStorage.findById(filmId); userStorage.findById(userId); - filmLikeStorage.add(filmId, userId); + filmStorage.addLikeToFilm(filmId, userId); log.info("Пользователь с id {} поставил лайк фильму с id {}", userId, filmId); eventStorage.addEvent(EventType.LIKE.name(), Operation.ADD.name(), filmId, userId); return toDto(filmStorage.findById(filmId)); @@ -118,7 +116,7 @@ public FilmDto likeFilm(final long filmId, final long userId) { public FilmDto removeLike(final long filmId, final long userId) { filmStorage.findById(filmId); userStorage.findById(userId); - filmLikeStorage.remove(filmId, userId); + filmStorage.removeLikeFromFilm(filmId, userId); log.info("Пользователь с id {} удалил лайк фильма с id {}", userId, filmId); eventStorage.addEvent(EventType.LIKE.name(), Operation.REMOVE.name(), filmId, userId); return toDto(filmStorage.findById(filmId)); diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/impl/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/impl/ReviewServiceImpl.java index 965a533b..1519d1a5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/impl/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/impl/ReviewServiceImpl.java @@ -4,7 +4,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.yandex.practicum.filmorate.dao.*; +import ru.yandex.practicum.filmorate.dao.EventStorage; +import ru.yandex.practicum.filmorate.dao.FilmStorage; +import ru.yandex.practicum.filmorate.dao.ReviewStorage; +import ru.yandex.practicum.filmorate.dao.UserStorage; import ru.yandex.practicum.filmorate.dto.ReviewDto; import ru.yandex.practicum.filmorate.mapper.ReviewMapper; import ru.yandex.practicum.filmorate.model.EventType; @@ -17,8 +20,6 @@ import static ru.yandex.practicum.filmorate.mapper.ReviewMapper.toDto; import static ru.yandex.practicum.filmorate.mapper.ReviewMapper.toModel; -import static ru.yandex.practicum.filmorate.model.ReviewLike.DISLIKE; -import static ru.yandex.practicum.filmorate.model.ReviewLike.LIKE; @Service @RequiredArgsConstructor @@ -28,7 +29,6 @@ public class ReviewServiceImpl implements ReviewService { private final ReviewStorage reviewStorage; private final UserStorage userStorage; private final FilmStorage filmStorage; - private final ReviewLikeStorage reviewLikeStorage; private final EventStorage eventStorage; /** @@ -116,73 +116,37 @@ public List getReviewsByFilmId(final Long filmId, final int count) { } /** - * Добавление лайка отзыву. + * Добавление лайка или дизлайка отзыву. * * @param id идентификатор отзыва. - * @param userId идентификатор пользователя, который ставит лайк. - * @return отзыв с добавленным лайком. + * @param userId идентификатор пользователя, который ставит лайк/дизлайк. + * @return отзыв с добавленным лайком/дизлайк. */ @Override @Transactional - public ReviewDto addLikeToReview(final long id, final long userId) { + public ReviewDto addLikeOrDislikeToReview(final long id, final long userId, String type) { findReviewAndUserInDb(id, userId); - reviewStorage.addLikeToReview(id); - reviewLikeStorage.add(id, userId, LIKE.toString()); + reviewStorage.addLikeOrDislikeToReview(id, userId, type); log.info("Пользователь с id '{}' поставил лайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } /** - * Добавление дизлайка отзыву. + * Удаление лайка или дизлайка у отзыва. * * @param id идентификатор отзыва. - * @param userId идентификатор пользователя, который ставит дизлайк. - * @return отзыв с добавленным дизлайком. + * @param userId идентификатор пользователя, который удаляет лайк/дизлайк. + * @return отзыв с удаленным лайком/дизлайк. */ @Override @Transactional - public ReviewDto addDislikeToReview(long id, long userId) { + public ReviewDto deleteLikeOrDislikeFromReview(long id, long userId, String type) { findReviewAndUserInDb(id, userId); - reviewStorage.addDislikeToReview(id); - reviewLikeStorage.add(id, userId, DISLIKE.toString()); - log.info("Пользователь с id '{}' поставил дизлайк отзыву с id '{}'", userId, id); - return toDto(reviewStorage.findById(id)); - } - - /** - * Удаление лайка у отзыва. - * - * @param id идентификатор отзыва. - * @param userId идентификатор пользователя, который удаляет лайк. - * @return отзыв с удаленным лайком. - */ - @Override - @Transactional - public ReviewDto deleteLikeFromReview(long id, long userId) { - findReviewAndUserInDb(id, userId); - reviewStorage.addDislikeToReview(id); - reviewLikeStorage.delete(id, userId, LIKE.toString()); + reviewStorage.deleteLikeOrDislikeFromReview(id, userId, type); log.info("Пользователь с id '{}' удалил лайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } - /** - * Удаление дизлайка у отзыва. - * - * @param id идентификатор отзыва. - * @param userId идентификатор пользователя, который удаляет дизлайк. - * @return отзыв с удаленным дизлайком. - */ - @Override - @Transactional - public ReviewDto deleteDislikeFromReview(long id, long userId) { - findReviewAndUserInDb(id, userId); - reviewStorage.addLikeToReview(id); - reviewLikeStorage.delete(id, userId, DISLIKE.toString()); - log.info("Пользователь с id '{}' удалил дизлайк отзыву с id '{}'", userId, id); - return toDto(reviewStorage.findById(id)); - } - private void findReviewAndUserInDb(long id, long userId) { reviewStorage.findById(id); userStorage.findById(userId); diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/impl/UserServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/impl/UserServiceImpl.java index 5b6a4975..781d0740 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/impl/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/impl/UserServiceImpl.java @@ -27,7 +27,6 @@ public class UserServiceImpl implements UserService { private final UserStorage userStorage; private final FilmStorage filmStorage; private final FriendshipStorage friendshipStorage; - private final FilmLikeStorage filmLikeStorage; private final EventStorage eventStorage; /** @@ -179,7 +178,7 @@ public void removeUser(long userId) { @Override public Collection showRecommendations(long id) { log.info("Получение списка рекомендаций фильмов для пользователя с id {}.", id); - Map> usersLikes = filmLikeStorage.getUsersAndFilmLikes(); + Map> usersLikes = filmStorage.getUsersAndFilmLikes(); int maxLikes = 0; Set recommendations = new HashSet<>(); Set userLikedFilms = usersLikes.get(id); diff --git a/src/test/java/ru/yandex/practicum/filmorate/integration/FIlmServiceTest.java b/src/test/java/ru/yandex/practicum/filmorate/integration/FIlmServiceTest.java index fc2b4e2f..cc330eb1 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/integration/FIlmServiceTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/integration/FIlmServiceTest.java @@ -30,9 +30,6 @@ class FIlmServiceTest { @Mock private UserStorage userStorage; - @Mock - private FilmLikeStorage filmLikeStorage; - @Mock private DirectorStorage directorStorage; @@ -47,7 +44,7 @@ class FIlmServiceTest { @BeforeAll public void beforeAll() { - filmService = new FilmServiceImpl(filmStorage, userStorage, filmLikeStorage, directorStorage, eventStorage); + filmService = new FilmServiceImpl(filmStorage, userStorage, directorStorage, eventStorage); } @BeforeEach diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java index f57cd5d5..fa0d8882 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java @@ -8,8 +8,12 @@ import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.annotation.DirtiesContext; -import ru.yandex.practicum.filmorate.dao.*; -import ru.yandex.practicum.filmorate.dao.impl.*; +import ru.yandex.practicum.filmorate.dao.DirectorStorage; +import ru.yandex.practicum.filmorate.dao.FilmStorage; +import ru.yandex.practicum.filmorate.dao.UserStorage; +import ru.yandex.practicum.filmorate.dao.impl.DirectorDbStorage; +import ru.yandex.practicum.filmorate.dao.impl.FilmDbStorage; +import ru.yandex.practicum.filmorate.dao.impl.UserDbStorage; import ru.yandex.practicum.filmorate.dto.FilmSearchDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.model.*; @@ -17,6 +21,7 @@ import java.time.LocalDate; import java.util.Collection; import java.util.List; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,8 +34,6 @@ public class FilmDbStorageTest { private final JdbcTemplate jdbcTemplate; private FilmStorage filmDbStorage; - private FilmGenreStorage filmGenreStorage; - private FilmLikeStorage filmLikeStorage; private DirectorStorage directorStorage; private UserStorage userStorage; @@ -43,11 +46,8 @@ public class FilmDbStorageTest { @BeforeEach public void setUp() { - filmLikeStorage = new FilmLikeDbStorage(jdbcTemplate); - filmGenreStorage = new FilmGenreDbStorage(jdbcTemplate); directorStorage = new DirectorDbStorage(jdbcTemplate); - FilmDirectorStorage filmDirectorStorage = new FilmDirectorDbStorage(jdbcTemplate); - filmDbStorage = new FilmDbStorage(jdbcTemplate, filmGenreStorage, filmDirectorStorage); + filmDbStorage = new FilmDbStorage(jdbcTemplate); userStorage = new UserDbStorage(jdbcTemplate); Mpa mpa = new Mpa(1, "G"); @@ -183,12 +183,12 @@ void testAddAndGetById() { film.getGenres().add(genre2); filmDbStorage.add(film); - List genres = filmGenreStorage.findAllById(1); + Set genres = filmDbStorage.findById(1).getGenres(); assertThat(genres) .isNotNull() - .isEqualTo(List.of(genre1, genre2)); + .isEqualTo(Set.of(genre1, genre2)); } @Test @@ -202,24 +202,24 @@ void testUpdateAndGetById() { film.getGenres().add(genre2); filmDbStorage.add(film); - List genres = filmGenreStorage.findAllById(1); + Set genres = filmDbStorage.findById(1).getGenres(); assertThat(genres) .isNotNull() - .isEqualTo(List.of(genre1, genre2)); + .isEqualTo(Set.of(genre1, genre2)); film.getGenres().remove(genre2); film.getGenres().add(genre3); filmDbStorage.update(film); - List updatedGenres = filmGenreStorage.findAllById(1); + Set updatedGenres = filmDbStorage.findById(1).getGenres(); assertThat(updatedGenres) .isNotNull() - .isEqualTo(List.of(genre1, genre3)); + .isEqualTo(Set.of(genre1, genre3)); } @Test @@ -243,7 +243,7 @@ void testAddLike() { filmDbStorage.add(film); userStorage.add(user); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); @@ -258,13 +258,13 @@ void testAddAndRemoveLike() { filmDbStorage.add(film); userStorage.add(user); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); long likes = storedFilm.getLikes(); assertEquals(1, likes); - filmLikeStorage.remove(film.getId(), user.getId()); + filmDbStorage.removeLikeFromFilm(film.getId(), user.getId()); Film updatedFilm = filmDbStorage.findById(film.getId()); long updatedLikes = updatedFilm.getLikes(); @@ -282,7 +282,7 @@ void testFindAllWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -303,7 +303,7 @@ void testFindByIdWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -344,7 +344,7 @@ void testMostPopularFilmsWithSpecifiedGenreAndYear() { film.getGenres().add(genre2); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -363,7 +363,7 @@ void testMostPopularFilmsWithSpecifiedYearWithoutGenre() { userStorage.add(user); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -387,7 +387,7 @@ void testMostPopularFilmsWithSpecifiedGenreWithoutYear() { film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -506,12 +506,12 @@ void testMostPopularFilmsWithoutSpecifiedGenreAndYear() { filmDbStorage.add(film); filmDbStorage.add(film2); - filmLikeStorage.add(film.getId(), user.getId()); - filmLikeStorage.add(film.getId(), user2.getId()); - filmLikeStorage.add(film.getId(), user3.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user3.getId()); - filmLikeStorage.add(film2.getId(), user.getId()); - filmLikeStorage.add(film2.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user2.getId()); film.setLikes(3); film2.setLikes(2); @@ -538,9 +538,9 @@ void testMostPopularFilmsWithoutSpecifiedGenreAndYearOneFilmWithoutLikes() { filmDbStorage.add(film); filmDbStorage.add(film2); - filmLikeStorage.add(film.getId(), user.getId()); - filmLikeStorage.add(film.getId(), user2.getId()); - filmLikeStorage.add(film.getId(), user3.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user3.getId()); film.setLikes(3); @@ -582,7 +582,7 @@ public void findFilmsByDirectorSortByLikes() { directorStorage.add(director); filmDbStorage.add(film); filmDbStorage.add(film2); - filmLikeStorage.add(1, 1); + filmDbStorage.addLikeToFilm(1, 1); System.out.println(film.getId()); System.out.println(film2.getId()); @@ -616,9 +616,9 @@ public void findCommonFilms() { filmDbStorage.add(film2); userStorage.add(user); userStorage.add(user2); - filmLikeStorage.add(film.getId(), user.getId()); - filmLikeStorage.add(film2.getId(), user.getId()); - filmLikeStorage.add(film.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user2.getId()); film.setLikes(2); Collection commonFilms = filmDbStorage.findCommonFilms(user.getId(), user2.getId()); @@ -637,8 +637,8 @@ public void findEmptyCommonFilms() { filmDbStorage.add(film2); userStorage.add(user); userStorage.add(user2); - filmLikeStorage.add(film.getId(), user.getId()); - filmLikeStorage.add(film2.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user2.getId()); Collection commonFilms = filmDbStorage.findCommonFilms(user.getId(), user2.getId()); diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java index 252166eb..bfefc864 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java @@ -10,10 +10,7 @@ import org.springframework.test.annotation.DirtiesContext; import ru.yandex.practicum.filmorate.dao.*; import ru.yandex.practicum.filmorate.dao.impl.*; -import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.model.Mpa; -import ru.yandex.practicum.filmorate.model.Review; -import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.model.*; import java.time.LocalDate; import java.util.Collection; @@ -42,9 +39,7 @@ class ReviewDbStorageTest { @BeforeEach public void setUp() { reviewStorage = new ReviewDbStorage(jdbcTemplate); - FilmGenreStorage filmGenreStorage = new FilmGenreDbStorage(jdbcTemplate); - FilmDirectorStorage filmDirectorStorage = new FilmDirectorDbStorage(jdbcTemplate); - filmStorage = new FilmDbStorage(jdbcTemplate, filmGenreStorage, filmDirectorStorage); + filmStorage = new FilmDbStorage(jdbcTemplate); userStorage = new UserDbStorage(jdbcTemplate); Mpa mpa = new Mpa(1, "G"); @@ -260,7 +255,7 @@ public void updateReview() { public void addLikeToReview() { reviewStorage.add(review1); - reviewStorage.addLikeToReview(1); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(2, storedReview.getUseful()); } @@ -271,7 +266,7 @@ public void addLikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addLikeToReview(1); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -281,7 +276,7 @@ public void addLikeToReviewNegativeUseful() { public void addDislikeToReview() { reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -292,7 +287,7 @@ public void addDislikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(-2, storedReview.getUseful()); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java index 1a3c6718..178f3dd5 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java @@ -35,8 +35,6 @@ class UserDbStorageTest { private UserServiceImpl userService; private FilmServiceImpl filmService; private FriendshipStorage friendshipStorage; - private FilmGenreStorage filmGenreStorage; - private FilmLikeStorage filmLikeStorage; private FilmStorage filmStorage; private EventStorage eventStorage; private DirectorStorage directorStorage; @@ -49,15 +47,12 @@ class UserDbStorageTest { @BeforeEach void setUp() { - filmLikeStorage = new FilmLikeDbStorage(jdbcTemplate); - filmGenreStorage = new FilmGenreDbStorage(jdbcTemplate); - FilmDirectorStorage filmDirectorStorage = new FilmDirectorDbStorage(jdbcTemplate); - filmStorage = new FilmDbStorage(jdbcTemplate, filmGenreStorage, filmDirectorStorage); + filmStorage = new FilmDbStorage(jdbcTemplate); userStorage = new UserDbStorage(jdbcTemplate); eventStorage = new EventDbStorage(jdbcTemplate); friendshipStorage = new FriendshipDbStorage(jdbcTemplate); - userService = new UserServiceImpl(userStorage, filmStorage, friendshipStorage, filmLikeStorage, eventStorage); - filmService = new FilmServiceImpl(filmStorage, userStorage, filmLikeStorage, directorStorage, eventStorage); + userService = new UserServiceImpl(userStorage, filmStorage, friendshipStorage, eventStorage); + filmService = new FilmServiceImpl(filmStorage, userStorage, directorStorage, eventStorage); user = User.builder() .id(1) .email("email") @@ -378,11 +373,11 @@ void testGetRecommendationsList() { filmStorage.add(filmOne); filmStorage.add(filmTwo); - filmLikeStorage.add(filmOne.getId(), user.getId()); - filmLikeStorage.add(filmOne.getId(), anotherUser.getId()); - filmLikeStorage.add(filmTwo.getId(), anotherUser.getId()); + filmStorage.addLikeToFilm(filmOne.getId(), user.getId()); + filmStorage.addLikeToFilm(filmOne.getId(), anotherUser.getId()); + filmStorage.addLikeToFilm(filmTwo.getId(), anotherUser.getId()); - Map> filmRecommendations = filmLikeStorage.getUsersAndFilmLikes(); + Map> filmRecommendations = filmStorage.getUsersAndFilmLikes(); assertThat(filmRecommendations.get(1L)) .isNotNull() @@ -402,7 +397,7 @@ void testGetRecommendationsListNoLikes() { userStorage.add(anotherUser); filmStorage.add(filmOne); - Map> filmRecommendations = filmLikeStorage.getUsersAndFilmLikes(); + Map> filmRecommendations = filmStorage.getUsersAndFilmLikes(); assertThat(filmRecommendations) .isNotNull()