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();