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..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 @@ -30,9 +30,10 @@ 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); return newUser; @@ -42,6 +43,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 +146,12 @@ private User makeUser(ResultSet rs) throws SQLException { .build(); } + private void checkUserName(User user) { + if (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..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) NOT NULL, - LOGIN VARCHAR(50) NOT NULL, + EMAIL VARCHAR(255) CHECK (EMAIL <> '') NOT NULL UNIQUE, + LOGIN VARCHAR(50) CHECK (LOGIN <> '') 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();