From 2ae414e7d5fb92238d06df768cf6831eb3cd8988 Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Wed, 7 Feb 2024 13:08:52 +0300 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=D0=A3=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20FilmDbStorage=20=D0=BE=D1=82=20=D0=B4=D1=80?= =?UTF-8?q?=D1=83=D0=B3=D0=B8=D1=85=20dao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/dao/DirectorStorage.java | 2 + .../filmorate/dao/FilmDirectorStorage.java | 16 -- .../filmorate/dao/FilmGenreStorage.java | 19 --- .../filmorate/dao/impl/DirectorDbStorage.java | 6 + .../filmorate/dao/impl/FilmDbStorage.java | 153 ++++++++++++++++-- .../dao/impl/FilmDirectorDbStorage.java | 99 ------------ .../dao/impl/FilmGenreDbStorage.java | 87 ---------- .../filmorate/storage/FilmDbStorageTest.java | 28 ++-- .../storage/ReviewDbStorageTest.java | 4 +- .../filmorate/storage/UserDbStorageTest.java | 5 +- 10 files changed, 162 insertions(+), 257 deletions(-) delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/FilmGenreStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmDirectorDbStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmGenreDbStorage.java 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 index 619cd98d..ce83bf28 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java @@ -1,21 +1,5 @@ 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/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..603af119 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 " + @@ -228,17 +224,96 @@ public Collection findCommonFilms(long userId, long friendId) { 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 +326,48 @@ 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(); + } } 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/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java index 35b4ecfd..cce89690 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,14 @@ 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.FilmLikeStorage; +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.FilmLikeDbStorage; +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.*; @@ -18,6 +24,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; @@ -30,7 +37,6 @@ public class FilmDbStorageTest { private final JdbcTemplate jdbcTemplate; private FilmStorage filmDbStorage; - private FilmGenreStorage filmGenreStorage; private FilmLikeStorage filmLikeStorage; private DirectorStorage directorStorage; private UserStorage userStorage; @@ -45,10 +51,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"); @@ -184,12 +188,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 @@ -203,24 +207,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 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..42309665 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java @@ -42,9 +42,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"); 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..53bb5c48 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java @@ -35,7 +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; @@ -50,9 +49,7 @@ 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); From e658470ce4a4b9b779c085bb1ea371114154c581 Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Wed, 7 Feb 2024 14:14:15 +0300 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20dao=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B2=D1=8F?= =?UTF-8?q?=D0=B7=D1=83=D1=8E=D1=89=D0=B8=D1=85=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/dao/FilmDirectorStorage.java | 5 -- .../filmorate/dao/FilmLikeStorage.java | 16 ---- .../practicum/filmorate/dao/FilmStorage.java | 7 ++ .../filmorate/dao/ReviewLikeStorage.java | 7 -- .../filmorate/dao/ReviewStorage.java | 4 +- .../filmorate/dao/impl/FilmDbStorage.java | 32 ++++++++ .../filmorate/dao/impl/FilmLikeDbStorage.java | 79 ------------------- .../filmorate/dao/impl/ReviewDbStorage.java | 18 ++++- .../dao/impl/ReviewLikeDbStorage.java | 27 ------- .../service/impl/FilmServiceImpl.java | 6 +- .../service/impl/ReviewServiceImpl.java | 18 ++--- .../service/impl/UserServiceImpl.java | 3 +- .../integration/FIlmServiceTest.java | 5 +- .../filmorate/storage/FilmDbStorageTest.java | 48 ++++++----- .../storage/ReviewDbStorageTest.java | 13 ++- .../filmorate/storage/UserDbStorageTest.java | 16 ++-- 16 files changed, 103 insertions(+), 201 deletions(-) delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/FilmLikeStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/ReviewLikeStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/impl/FilmLikeDbStorage.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/dao/impl/ReviewLikeDbStorage.java 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 ce83bf28..00000000 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDirectorStorage.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.yandex.practicum.filmorate.dao; - -public interface FilmDirectorStorage { - void add(long filmId, long directorId); -} 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..596b4a10 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 addLike(long filmId, long userId); + + void removeLike(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..c6857de7 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 addLikeToReview(long reviewId, long userId, String type); - void addDislikeToReview(long id); + void addDislikeToReview(long reviewId, long userId, String type); } 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 603af119..df95e242 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 @@ -221,6 +221,24 @@ public Collection findCommonFilms(long userId, long friendId) { return jdbcTemplate.query(sql, this::mapToFilm, userId, friendId); } + @Override + public void addLike(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 removeLike(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())); @@ -370,4 +388,18 @@ private Director mapToDirector(ResultSet rs, int i) throws SQLException { .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/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 f57f25a8..c9bf84d0 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 @@ -18,6 +18,8 @@ import java.util.List; import java.util.Objects; +import static ru.yandex.practicum.filmorate.model.ReviewLike.LIKE; + @Repository @RequiredArgsConstructor @Slf4j @@ -95,17 +97,29 @@ public List findAllLimitBy(final int count) { } @Override - public void addLikeToReview(final long id) { + public void addLikeToReview(final long id, final long userId, final String type) { + addLike(id, userId, type); final String sql = "UPDATE review SET useful = useful + 1 WHERE id = ?"; jdbcTemplate.update(sql, id); } @Override - public void addDislikeToReview(long id) { + public void addDislikeToReview(final long id, final long userId, final String type) { + deleteLike(id, userId, type); final String sql = "UPDATE review SET useful = useful - 1 WHERE id = ?"; jdbcTemplate.update(sql, id); } + private void addLike(final long reviewId, final long userId, final String type) { + final String sql = "INSERT INTO review_like VALUES (?, ?, ?)"; + jdbcTemplate.update(sql, reviewId, userId, type); + } + + private void deleteLike(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, reviewId, userId, type); + } + private Review mapReview(final ResultSet rs, final int rowNum) throws SQLException { return Review.builder() .reviewId(rs.getLong("id")) 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/impl/FilmServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/impl/FilmServiceImpl.java index 847ef806..0614a9ae 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 @@ -36,8 +36,6 @@ public class FilmServiceImpl implements FilmService { private final UserStorage userStorage; - private final FilmLikeStorage filmLikeStorage; - private final DirectorStorage directorStorage; private final EventStorage eventStorage; @@ -110,7 +108,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.addLike(filmId, userId); log.info("Пользователь с id {} поставил лайк фильму с id {}", userId, filmId); eventStorage.addEvent(EventType.LIKE.name(), Operation.ADD.name(), filmId, userId); return toDto(filmStorage.findById(filmId)); @@ -128,7 +126,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.removeLike(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 8dc01c06..c679f1c0 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; @@ -28,7 +31,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; /** @@ -126,8 +128,7 @@ public List getReviewsByFilmId(final Long filmId, final int count) { @Transactional public ReviewDto addLikeToReview(final long id, final long userId) { findReviewAndUserInDb(id, userId); - reviewStorage.addLikeToReview(id); - reviewLikeStorage.add(id, userId, LIKE.toString()); + reviewStorage.addLikeToReview(id, userId, LIKE.toString()); log.info("Пользователь с id '{}' поставил лайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } @@ -143,8 +144,7 @@ public ReviewDto addLikeToReview(final long id, final long userId) { @Transactional public ReviewDto addDislikeToReview(long id, long userId) { findReviewAndUserInDb(id, userId); - reviewStorage.addDislikeToReview(id); - reviewLikeStorage.add(id, userId, DISLIKE.toString()); + reviewStorage.addDislikeToReview(1, 1, DISLIKE.toString()); log.info("Пользователь с id '{}' поставил дизлайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } @@ -160,8 +160,7 @@ public ReviewDto addDislikeToReview(long id, long userId) { @Transactional public ReviewDto deleteLikeFromReview(long id, long userId) { findReviewAndUserInDb(id, userId); - reviewStorage.addDislikeToReview(id); - reviewLikeStorage.delete(id, userId, LIKE.toString()); + reviewStorage.addDislikeToReview(1, 1, DISLIKE.toString()); log.info("Пользователь с id '{}' удалил лайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } @@ -177,8 +176,7 @@ public ReviewDto deleteLikeFromReview(long id, long userId) { @Transactional public ReviewDto deleteDislikeFromReview(long id, long userId) { findReviewAndUserInDb(id, userId); - reviewStorage.addLikeToReview(id); - reviewLikeStorage.delete(id, userId, DISLIKE.toString()); + reviewStorage.addDislikeToReview(id, userId, DISLIKE.toString()); log.info("Пользователь с id '{}' удалил дизлайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } 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 cce89690..0419518b 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java @@ -9,12 +9,10 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.annotation.DirtiesContext; import ru.yandex.practicum.filmorate.dao.DirectorStorage; -import ru.yandex.practicum.filmorate.dao.FilmLikeStorage; 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.FilmLikeDbStorage; import ru.yandex.practicum.filmorate.dao.impl.UserDbStorage; import ru.yandex.practicum.filmorate.dto.FilmSearchDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; @@ -37,7 +35,6 @@ public class FilmDbStorageTest { private final JdbcTemplate jdbcTemplate; private FilmStorage filmDbStorage; - private FilmLikeStorage filmLikeStorage; private DirectorStorage directorStorage; private UserStorage userStorage; @@ -50,7 +47,6 @@ public class FilmDbStorageTest { @BeforeEach public void setUp() { - filmLikeStorage = new FilmLikeDbStorage(jdbcTemplate); directorStorage = new DirectorDbStorage(jdbcTemplate); filmDbStorage = new FilmDbStorage(jdbcTemplate); userStorage = new UserDbStorage(jdbcTemplate); @@ -248,7 +244,7 @@ void testAddLike() { filmDbStorage.add(film); userStorage.add(user); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); @@ -263,13 +259,13 @@ void testAddAndRemoveLike() { filmDbStorage.add(film); userStorage.add(user); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); long likes = storedFilm.getLikes(); assertEquals(1, likes); - filmLikeStorage.remove(film.getId(), user.getId()); + filmDbStorage.removeLike(film.getId(), user.getId()); Film updatedFilm = filmDbStorage.findById(film.getId()); long updatedLikes = updatedFilm.getLikes(); @@ -287,7 +283,7 @@ void testFindAllWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); film.setLikes(1); @@ -308,7 +304,7 @@ void testFindByIdWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); film.setLikes(1); @@ -349,7 +345,7 @@ void testMostPopularFilmsWithSpecifiedGenreAndYear() { film.getGenres().add(genre2); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); film.setLikes(1); @@ -368,7 +364,7 @@ void testMostPopularFilmsWithSpecifiedYearWithoutGenre() { userStorage.add(user); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); film.setLikes(1); @@ -392,7 +388,7 @@ void testMostPopularFilmsWithSpecifiedGenreWithoutYear() { film.getGenres().add(genre2); filmDbStorage.add(film); - filmLikeStorage.add(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user.getId()); film.setLikes(1); @@ -511,12 +507,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.addLike(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user2.getId()); + filmDbStorage.addLike(film.getId(), user3.getId()); - filmLikeStorage.add(film2.getId(), user.getId()); - filmLikeStorage.add(film2.getId(), user2.getId()); + filmDbStorage.addLike(film2.getId(), user.getId()); + filmDbStorage.addLike(film2.getId(), user2.getId()); film.setLikes(3); film2.setLikes(2); @@ -543,9 +539,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.addLike(film.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user2.getId()); + filmDbStorage.addLike(film.getId(), user3.getId()); film.setLikes(3); @@ -587,7 +583,7 @@ public void findFilmsByDirectorSortByLikes() { directorStorage.add(director); filmDbStorage.add(film); filmDbStorage.add(film2); - filmLikeStorage.add(1, 1); + filmDbStorage.addLike(1, 1); System.out.println(film.getId()); System.out.println(film2.getId()); @@ -621,9 +617,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.addLike(film.getId(), user.getId()); + filmDbStorage.addLike(film2.getId(), user.getId()); + filmDbStorage.addLike(film.getId(), user2.getId()); film.setLikes(2); Collection commonFilms = filmDbStorage.findCommonFilms(user.getId(), user2.getId()); @@ -642,8 +638,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.addLike(film.getId(), user.getId()); + filmDbStorage.addLike(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 42309665..cef2be52 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; @@ -258,7 +255,7 @@ public void updateReview() { public void addLikeToReview() { reviewStorage.add(review1); - reviewStorage.addLikeToReview(1); + reviewStorage.addLikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(2, storedReview.getUseful()); } @@ -269,7 +266,7 @@ public void addLikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addLikeToReview(1); + reviewStorage.addLikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -279,7 +276,7 @@ public void addLikeToReviewNegativeUseful() { public void addDislikeToReview() { reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1); + reviewStorage.addDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -290,7 +287,7 @@ public void addDislikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1); + reviewStorage.addDislikeToReview(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 53bb5c48..56033797 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java @@ -35,7 +35,6 @@ class UserDbStorageTest { private UserServiceImpl userService; private FilmServiceImpl filmService; private FriendshipStorage friendshipStorage; - private FilmLikeStorage filmLikeStorage; private FilmStorage filmStorage; private EventStorage eventStorage; private DirectorStorage directorStorage; @@ -48,13 +47,12 @@ class UserDbStorageTest { @BeforeEach void setUp() { - filmLikeStorage = new FilmLikeDbStorage(jdbcTemplate); 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") @@ -375,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.addLike(filmOne.getId(), user.getId()); + filmStorage.addLike(filmOne.getId(), anotherUser.getId()); + filmStorage.addLike(filmTwo.getId(), anotherUser.getId()); - Map> filmRecommendations = filmLikeStorage.getUsersAndFilmLikes(); + Map> filmRecommendations = filmStorage.getUsersAndFilmLikes(); assertThat(filmRecommendations.get(1L)) .isNotNull() @@ -399,7 +397,7 @@ void testGetRecommendationsListNoLikes() { userStorage.add(anotherUser); filmStorage.add(filmOne); - Map> filmRecommendations = filmLikeStorage.getUsersAndFilmLikes(); + Map> filmRecommendations = filmStorage.getUsersAndFilmLikes(); assertThat(filmRecommendations) .isNotNull() From d07f2012bacfa94d3dd5a11d8ba737d580e7f121 Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Wed, 7 Feb 2024 14:18:43 +0300 Subject: [PATCH 3/6] =?UTF-8?q?style:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=83=D0=B5=D0=BC=D1=8B=D0=B9=20=D0=B8=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/yandex/practicum/filmorate/dao/impl/ReviewDbStorage.java | 2 -- 1 file changed, 2 deletions(-) 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 c9bf84d0..b4059024 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 @@ -18,8 +18,6 @@ import java.util.List; import java.util.Objects; -import static ru.yandex.practicum.filmorate.model.ReviewLike.LIKE; - @Repository @RequiredArgsConstructor @Slf4j From acf1cb21a5eed4bd3a328894073d71f7be05a0d9 Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Thu, 8 Feb 2024 09:09:45 +0300 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D1=8B=20=D1=81=20=D0=BB=D0=B0=D0=B9=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D1=84=D0=B8=D0=BB=D1=8C=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/filmorate/dao/FilmStorage.java | 4 +- .../filmorate/dao/impl/FilmDbStorage.java | 4 +- .../service/impl/FilmServiceImpl.java | 4 +- .../filmorate/storage/FilmDbStorageTest.java | 44 +++++++++---------- .../filmorate/storage/UserDbStorageTest.java | 6 +-- 5 files changed, 31 insertions(+), 31 deletions(-) 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 596b4a10..8f74cf35 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmStorage.java @@ -9,9 +9,9 @@ public interface FilmStorage extends Dao { - void addLike(long filmId, long userId); + void addLikeToFilm(long filmId, long userId); - void removeLike(long filmId, long userId); + void removeLikeFromFilm(long filmId, long userId); Map> getUsersAndFilmLikes(); 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 df95e242..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 @@ -222,13 +222,13 @@ public Collection findCommonFilms(long userId, long friendId) { } @Override - public void addLike(final long filmId, final long userId) { + 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 removeLike(long filmId, long userId) { + 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); } 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 0614a9ae..c711084c 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 @@ -108,7 +108,7 @@ public FilmDto getFilmById(final long filmId) { public FilmDto likeFilm(final long filmId, final long userId) { filmStorage.findById(filmId); userStorage.findById(userId); - filmStorage.addLike(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)); @@ -126,7 +126,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); - filmStorage.removeLike(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/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java index 0419518b..81a389a4 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/FilmDbStorageTest.java @@ -244,7 +244,7 @@ void testAddLike() { filmDbStorage.add(film); userStorage.add(user); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); @@ -259,13 +259,13 @@ void testAddAndRemoveLike() { filmDbStorage.add(film); userStorage.add(user); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); Film storedFilm = filmDbStorage.findById(film.getId()); long likes = storedFilm.getLikes(); assertEquals(1, likes); - filmDbStorage.removeLike(film.getId(), user.getId()); + filmDbStorage.removeLikeFromFilm(film.getId(), user.getId()); Film updatedFilm = filmDbStorage.findById(film.getId()); long updatedLikes = updatedFilm.getLikes(); @@ -283,7 +283,7 @@ void testFindAllWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -304,7 +304,7 @@ void testFindByIdWithAllFields() { film.getGenres().add(genre1); film.getGenres().add(genre2); filmDbStorage.add(film); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -345,7 +345,7 @@ void testMostPopularFilmsWithSpecifiedGenreAndYear() { film.getGenres().add(genre2); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -364,7 +364,7 @@ void testMostPopularFilmsWithSpecifiedYearWithoutGenre() { userStorage.add(user); film.setReleaseDate(LocalDate.of(1999, 1, 1)); filmDbStorage.add(film); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -388,7 +388,7 @@ void testMostPopularFilmsWithSpecifiedGenreWithoutYear() { film.getGenres().add(genre2); filmDbStorage.add(film); - filmDbStorage.addLike(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); film.setLikes(1); @@ -507,12 +507,12 @@ void testMostPopularFilmsWithoutSpecifiedGenreAndYear() { filmDbStorage.add(film); filmDbStorage.add(film2); - filmDbStorage.addLike(film.getId(), user.getId()); - filmDbStorage.addLike(film.getId(), user2.getId()); - filmDbStorage.addLike(film.getId(), user3.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film.getId(), user3.getId()); - filmDbStorage.addLike(film2.getId(), user.getId()); - filmDbStorage.addLike(film2.getId(), user2.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user.getId()); + filmDbStorage.addLikeToFilm(film2.getId(), user2.getId()); film.setLikes(3); film2.setLikes(2); @@ -539,9 +539,9 @@ void testMostPopularFilmsWithoutSpecifiedGenreAndYearOneFilmWithoutLikes() { filmDbStorage.add(film); filmDbStorage.add(film2); - filmDbStorage.addLike(film.getId(), user.getId()); - filmDbStorage.addLike(film.getId(), user2.getId()); - filmDbStorage.addLike(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); @@ -583,7 +583,7 @@ public void findFilmsByDirectorSortByLikes() { directorStorage.add(director); filmDbStorage.add(film); filmDbStorage.add(film2); - filmDbStorage.addLike(1, 1); + filmDbStorage.addLikeToFilm(1, 1); System.out.println(film.getId()); System.out.println(film2.getId()); @@ -617,9 +617,9 @@ public void findCommonFilms() { filmDbStorage.add(film2); userStorage.add(user); userStorage.add(user2); - filmDbStorage.addLike(film.getId(), user.getId()); - filmDbStorage.addLike(film2.getId(), user.getId()); - filmDbStorage.addLike(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()); @@ -638,8 +638,8 @@ public void findEmptyCommonFilms() { filmDbStorage.add(film2); userStorage.add(user); userStorage.add(user2); - filmDbStorage.addLike(film.getId(), user.getId()); - filmDbStorage.addLike(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/UserDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java index 56033797..178f3dd5 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/UserDbStorageTest.java @@ -373,9 +373,9 @@ void testGetRecommendationsList() { filmStorage.add(filmOne); filmStorage.add(filmTwo); - filmStorage.addLike(filmOne.getId(), user.getId()); - filmStorage.addLike(filmOne.getId(), anotherUser.getId()); - filmStorage.addLike(filmTwo.getId(), anotherUser.getId()); + filmStorage.addLikeToFilm(filmOne.getId(), user.getId()); + filmStorage.addLikeToFilm(filmOne.getId(), anotherUser.getId()); + filmStorage.addLikeToFilm(filmTwo.getId(), anotherUser.getId()); Map> filmRecommendations = filmStorage.getUsersAndFilmLikes(); From ba1d6553248f641a073c13ec3cc772e98eeb326c Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Thu, 8 Feb 2024 09:10:35 +0300 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B0=D0=B5=D1=82=D1=80=D1=8B=20=D0=B2=20addDislikeToRev?= =?UTF-8?q?iew?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/filmorate/service/impl/ReviewServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c679f1c0..698f12b0 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 @@ -144,7 +144,7 @@ public ReviewDto addLikeToReview(final long id, final long userId) { @Transactional public ReviewDto addDislikeToReview(long id, long userId) { findReviewAndUserInDb(id, userId); - reviewStorage.addDislikeToReview(1, 1, DISLIKE.toString()); + reviewStorage.addDislikeToReview(id, userId, DISLIKE.toString()); log.info("Пользователь с id '{}' поставил дизлайк отзыву с id '{}'", userId, id); return toDto(reviewStorage.findById(id)); } From 14699f59f54076b6d9d2832b729f5f675aa6ffd4 Mon Sep 17 00:00:00 2001 From: vvbakhanovich Date: Thu, 8 Feb 2024 09:56:08 +0300 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=82=D0=B8=D0=BF?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B9=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8/=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReviewController.java | 9 ++-- .../filmorate/dao/ReviewStorage.java | 4 +- .../filmorate/dao/impl/ReviewDbStorage.java | 33 ++++++++---- .../filmorate/service/ReviewService.java | 8 +-- .../service/impl/ReviewServiceImpl.java | 54 ++++--------------- .../storage/ReviewDbStorageTest.java | 8 +-- 6 files changed, 46 insertions(+), 70 deletions(-) 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 c8a31fb5..fd58f98c 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/ReviewStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/ReviewStorage.java index c6857de7..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 reviewId, long userId, String type); + void addLikeOrDislikeToReview(long reviewId, long userId, String type); - void addDislikeToReview(long reviewId, long userId, String type); + void deleteLikeOrDislikeFromReview(final long reviewId, final long userId, final String type); } 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 b4059024..fd07dabe 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 @@ -10,6 +10,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; @@ -95,27 +96,39 @@ public List findAllLimitBy(final int count) { } @Override - public void addLikeToReview(final long id, final long userId, final String type) { - addLike(id, userId, type); - 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(final long id, final long userId, final String type) { - deleteLike(id, userId, type); - 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 addLike(final long reviewId, final long userId, final String type) { + 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 void deleteLike(final long reviewId, final long userId, final String 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 = ?"; - jdbcTemplate.update(sql, reviewId, userId, 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/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/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/impl/ReviewServiceImpl.java index 698f12b0..9bf0e1d2 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 @@ -20,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 @@ -118,69 +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, 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, 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(1, 1, DISLIKE.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.addDislikeToReview(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/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java index cef2be52..bfefc864 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/storage/ReviewDbStorageTest.java @@ -255,7 +255,7 @@ public void updateReview() { public void addLikeToReview() { reviewStorage.add(review1); - reviewStorage.addLikeToReview(1, 1, ReviewLike.LIKE.toString()); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(2, storedReview.getUseful()); } @@ -266,7 +266,7 @@ public void addLikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addLikeToReview(1, 1, ReviewLike.LIKE.toString()); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.LIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -276,7 +276,7 @@ public void addLikeToReviewNegativeUseful() { public void addDislikeToReview() { reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(0, storedReview.getUseful()); } @@ -287,7 +287,7 @@ public void addDislikeToReviewNegativeUseful() { review1.setUseful(-1); reviewStorage.add(review1); - reviewStorage.addDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); + reviewStorage.addLikeOrDislikeToReview(1, 1, ReviewLike.DISLIKE.toString()); Review storedReview = reviewStorage.findById(1); assertEquals(-2, storedReview.getUseful()); }