From 10ac2ef308d4dd9dc9ce8a28fb87a8544f3ca4e7 Mon Sep 17 00:00:00 2001 From: FoxInc Date: Thu, 4 Apr 2024 02:47:31 +0500 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BB=D1=8C=D0=BC=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 - .../filmorate/FilmorateApplication.java | 3 +- .../storage/film/dao/FilmDbStorage.java | 7 +-- .../storage/user/dao/UserDbStorage.java | 13 +++++- src/main/resources/data.sql | 24 +++++----- src/main/resources/schema.sql | 4 +- .../controller/FilmDbStorageTest.java | 31 +++++++++++-- .../controller/UserDbStorageTest.java | 46 ++++++++++++++++--- 8 files changed, 98 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 6369ad3..ddbafba 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,6 @@ org.springframework.boot spring-boot-starter-validation - provided diff --git a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java index 843905e..2e4a618 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java +++ b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java @@ -8,5 +8,4 @@ public class FilmorateApplication { public static void main(String[] args) { SpringApplication.run(FilmorateApplication.class, args); } - -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/dao/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/dao/FilmDbStorage.java index fef81ec..4f8d10c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/dao/FilmDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/dao/FilmDbStorage.java @@ -56,10 +56,9 @@ public Film addFilm(Film film) { if (film.getGenres() != null) { updateGenreForFilm(filmId, film.getGenres()); } - Film newFilm = getFilmById(filmId); log.info("Film added: {}.", newFilm); - return getFilmById(filmId); + return newFilm; } @Override @@ -135,7 +134,6 @@ public Collection getPopular(Integer count) { "LEFT JOIN RATING AS R ON R.RATING_ID = F.RATING " + "LEFT JOIN USER_FILM AS UF ON F.FILM_ID = UF.FILM_ID " + "GROUP BY F.FILM_ID " + - "HAVING LIKES > 0 " + "ORDER BY LIKES DESC " + "LIMIT ?;"; Collection films = jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), count); @@ -167,6 +165,9 @@ private Film makeFilm(ResultSet rs) throws SQLException { } private void updateGenreForFilm(Integer filmId, List genres) { + String sqlDelete = "DELETE FROM FILM_GENRE WHERE FILM_ID=? "; + jdbcTemplate.update(sqlDelete, filmId); + if (genres != null && !genres.isEmpty()) { String sqlInsert = "MERGE INTO FILM_GENRE (FILM_ID, GENRE_ID) VALUES (?, ?) "; jdbcTemplate.batchUpdate(sqlInsert, new BatchPreparedStatementSetter() { diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java index 0a70922..822c1e2 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java @@ -30,11 +30,15 @@ public UserDbStorage(JdbcTemplate jdbcTemplate) { @Override public User addUser(User user) { - SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate) + SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate) .withTableName("USERS") .usingGeneratedKeyColumns("USER_ID"); + checkUserName(user); User newUser = getUserById(simpleJdbcInsert.executeAndReturnKey(toMap(user)).intValue()); log.info("User added. user{}.", newUser); + if (user.getName() == null || user.getName().isEmpty() || user.getName().isBlank()) { + user.setName(user.getLogin()); + } return newUser; } @@ -42,6 +46,7 @@ public User addUser(User user) { public User updateUser(User user) { Integer userId = user.getId(); checkUserExist(userId); + checkUserName(user); String updateSql = "UPDATE USERS SET EMAIL=?, LOGIN=?, NAME=?, BIRTHDAY=? WHERE USER_ID=?;"; jdbcTemplate.update(updateSql, user.getEmail(), @@ -144,6 +149,12 @@ private User makeUser(ResultSet rs) throws SQLException { .build(); } + private void checkUserName(User user) { + if (user.getName() == null || user.getName().isBlank()) { + user.setName(user.getLogin()); + } + } + public Map toMap(User user) { Map values = new HashMap<>(); values.put("EMAIL", user.getEmail()); diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 5a68ff1..cfd9d5e 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,12 +1,14 @@ -MERGE INTO RATING (RATING_ID, RATING_NAME) VALUES (1, 'G'); -MERGE INTO RATING (RATING_ID, RATING_NAME) VALUES (2, 'PG'); -MERGE INTO RATING (RATING_ID, RATING_NAME) VALUES (3, 'PG-13'); -MERGE INTO RATING (RATING_ID, RATING_NAME) VALUES (4, 'R'); -MERGE INTO RATING (RATING_ID, RATING_NAME) VALUES (5, 'NC-17'); +MERGE INTO RATING (RATING_ID, RATING_NAME) + VALUES (1, 'G'), + (2, 'PG'), + (3, 'PG-13'), + (4, 'R'), + (5, 'NC-17'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (1, 'Комедия'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (2, 'Драма'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (3, 'Мультфильм'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (4, 'Триллер'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (5, 'Документальный'); -MERGE INTO GENRE (GENRE_ID, GENRE_NAME) VALUES (6, 'Боевик'); \ No newline at end of file +MERGE INTO GENRE (GENRE_ID, GENRE_NAME) + VALUES (1, 'Комедия'), + (2, 'Драма'), + (3, 'Мультфильм'), + (4, 'Триллер'), + (5, 'Документальный'), + (6, 'Боевик'); diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 2ff929a..7aa397a 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -18,8 +18,8 @@ CREATE TABLE IF NOT EXISTS FILMS CREATE TABLE IF NOT EXISTS USERS ( USER_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - EMAIL VARCHAR(255) NOT NULL, - LOGIN VARCHAR(50) NOT NULL, + EMAIL VARCHAR(255) NOT NULL UNIQUE, + LOGIN VARCHAR(50) NOT NULL UNIQUE, NAME VARCHAR(50), BIRTHDAY DATE NOT NULL diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmDbStorageTest.java index f3d0bb1..df2d6dc 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmDbStorageTest.java @@ -73,19 +73,40 @@ public void addLikeTest() { public void deleteLikeTest() { User user = userDbStorage.addUser(User.builder().email("user2@mail.ru").login("User2").name("User2").birthday(LocalDate.of(1980, 12, 12)).build()); + User user2 = userDbStorage.addUser(User.builder().email("user3@mail.ru").login("User3").name("User3").birthday(LocalDate.of(1980, 12, 12)).build()); + Film newFilm1 = filmDbStorage.addFilm(createDefaultFilm()); + Film newFilm2 = filmDbStorage.addFilm(createDefaultFilm()); - Film newFilm = filmDbStorage.addFilm(createDefaultFilm()); + filmDbStorage.addLike(newFilm1.getId(), user.getId()); + filmDbStorage.addLike(newFilm2.getId(), user.getId()); + filmDbStorage.addLike(newFilm2.getId(), user2.getId()); - filmDbStorage.addLike(newFilm.getId(), user.getId()); + List likes = new ArrayList<>(filmDbStorage.getPopular(1)); - List likes = new ArrayList<>(filmDbStorage.getPopular(10)); + assertTrue(likes.contains(newFilm2)); + + filmDbStorage.deleteLike(newFilm2.getId(), user.getId()); + filmDbStorage.deleteLike(newFilm2.getId(), user2.getId()); + + likes = new ArrayList<>(filmDbStorage.getPopular(1)); + + assertFalse(likes.contains(newFilm2)); + assertTrue(likes.contains(newFilm1)); + } + + @Test + public void deleteFilmTest() { + + Film newFilm = filmDbStorage.addFilm(createDefaultFilm()); + + List likes = new ArrayList<>(filmDbStorage.getAllFilms()); assertTrue(likes.contains(newFilm)); - filmDbStorage.deleteLike(newFilm.getId(), user.getId()); + filmDbStorage.deleteFilm(newFilm.getId()); - likes = new ArrayList<>(filmDbStorage.getPopular(10)); + likes = new ArrayList<>(filmDbStorage.getAllFilms()); assertFalse(likes.contains(newFilm)); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/UserDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/UserDbStorageTest.java index c8ea2d6..cccddb3 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/UserDbStorageTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/UserDbStorageTest.java @@ -9,10 +9,7 @@ import ru.yandex.practicum.filmorate.storage.user.UserStorage; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.*; @@ -108,10 +105,47 @@ public void commonFriendsTest() { assertTrue(list2.contains(user3.getId())); } + @Test + public void deleteUserTest() { + User user1 = userDbStorage.addUser(createDefaultUser()); + User user2 = userDbStorage.addUser(createDefaultUser()); + + userDbStorage.addFriend(user1.getId(), user2.getId()); + + userDbStorage.addFriend(user2.getId(), user1.getId()); + + List friends1 = new ArrayList<>(userDbStorage.getFriends((user1.getId()))); + Set list1 = friends1.stream().map(User::getId).collect(Collectors.toCollection(HashSet::new)); + + assertEquals(1, list1.size()); + userDbStorage.deleteUser(user2.getId()); + + friends1 = new ArrayList<>(userDbStorage.getFriends((user1.getId()))); + list1 = friends1.stream().map(User::getId).collect(Collectors.toCollection(HashSet::new)); + + List users = new ArrayList<>(userDbStorage.getAllUsers()); + Set list2 = users.stream().map(User::getId).collect(Collectors.toCollection(HashSet::new)); + + assertFalse(list2.contains(user2.getId())); + assertEquals(0, list1.size()); + assertFalse(list1.contains(user2.getId())); + } + private User createDefaultUser() { + int leftLimit = 97; // letter 'a' + int rightLimit = 122; // letter 'z' + int targetStringLength = 10; + Random random = new Random(); + StringBuilder buffer = new StringBuilder(targetStringLength); + for (int i = 0; i < targetStringLength; i++) { + int randomLimitedInt = leftLimit + (int) + (random.nextFloat() * (rightLimit - leftLimit + 1)); + buffer.append((char) randomLimitedInt); + } + String generatedString = buffer.toString(); return User.builder() - .email("user@mail.ru") - .login("User") + .email(String.format("%s@mail.ru", generatedString)) + .login(String.format("%s@mail.ru", generatedString)) .name("User") .birthday(LocalDate.of(2005, 8, 15)) .build(); From d324fc61311519a1195e59f0ea1dbc299af8d3a0 Mon Sep 17 00:00:00 2001 From: FoxInc Date: Sat, 6 Apr 2024 15:47:03 +0500 Subject: [PATCH 2/3] fix: check username --- .../practicum/filmorate/storage/user/dao/UserDbStorage.java | 5 +---- src/main/resources/schema.sql | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java index 822c1e2..649b607 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/dao/UserDbStorage.java @@ -36,9 +36,6 @@ public User addUser(User user) { checkUserName(user); User newUser = getUserById(simpleJdbcInsert.executeAndReturnKey(toMap(user)).intValue()); log.info("User added. user{}.", newUser); - if (user.getName() == null || user.getName().isEmpty() || user.getName().isBlank()) { - user.setName(user.getLogin()); - } return newUser; } @@ -150,7 +147,7 @@ private User makeUser(ResultSet rs) throws SQLException { } private void checkUserName(User user) { - if (user.getName() == null || user.getName().isBlank()) { + if (user.getName().isBlank()) { user.setName(user.getLogin()); } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 7aa397a..d893b5f 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -18,8 +18,8 @@ CREATE TABLE IF NOT EXISTS FILMS CREATE TABLE IF NOT EXISTS USERS ( USER_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - EMAIL VARCHAR(255) NOT NULL UNIQUE, - LOGIN VARCHAR(50) NOT NULL UNIQUE, + EMAIL VARCHAR(255) CHECK (user_email <> '') NOT NULL UNIQUE, + LOGIN VARCHAR(50) CHECK (user_login <> '') NOT NULL UNIQUE, NAME VARCHAR(50), BIRTHDAY DATE NOT NULL From d2bf2edebc77000445ee6fff131c6bb1d8b444eb Mon Sep 17 00:00:00 2001 From: FoxInc Date: Sun, 7 Apr 2024 22:18:59 +0500 Subject: [PATCH 3/3] fix: schema fix --- src/main/resources/schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index d893b5f..ac19e80 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -18,8 +18,8 @@ CREATE TABLE IF NOT EXISTS FILMS CREATE TABLE IF NOT EXISTS USERS ( USER_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - EMAIL VARCHAR(255) CHECK (user_email <> '') NOT NULL UNIQUE, - LOGIN VARCHAR(50) CHECK (user_login <> '') NOT NULL UNIQUE, + EMAIL VARCHAR(255) CHECK (EMAIL <> '') NOT NULL UNIQUE, + LOGIN VARCHAR(50) CHECK (LOGIN <> '') NOT NULL UNIQUE, NAME VARCHAR(50), BIRTHDAY DATE NOT NULL