From f8de1a7a7139688960c9e1166fdcbb17b4636b2f Mon Sep 17 00:00:00 2001 From: Just Roma Date: Mon, 20 Jan 2025 18:16:32 +0500 Subject: [PATCH 1/7] Sprint 11 --- .../filmorate/controller/FilmController.java | 75 ++------------- .../filmorate/controller/UserController.java | 80 ++-------------- .../filmorate/service/FilmService.java | 33 +++++++ .../filmorate/service/IdGenerator.java | 12 +++ .../filmorate/service/UserService.java | 27 ++++++ .../filmorate/storage/film/FilmStorage.java | 19 ++++ .../storage/film/InMemoryFilmStorage.java | 90 ++++++++++++++++++ .../storage/user/InMemoryUserStorage.java | 93 +++++++++++++++++++ .../filmorate/storage/user/UserStorage.java | 20 ++++ 9 files changed, 311 insertions(+), 138 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/UserService.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java index 9d5b989..a570fc9 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -2,94 +2,35 @@ import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.filmorate.exception.NotFoundException; -import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.service.FilmService; -import java.time.LocalDate; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; @Slf4j @RestController @RequestMapping("/films") public class FilmController { - private final Map films = new HashMap<>(); + + @Autowired + private FilmService filmService; @GetMapping public Collection getAll() { - log.debug("GET, all films"); - return films.values(); + return filmService.getAll(); } @PostMapping public Film create(@Valid @RequestBody Film film) { - log.debug("POST, create film {}", film); - validateReleaseDate(film); - film.setId(getNextId()); - films.put(film.getId(), film); - return film; + return filmService.create(film); } - @PutMapping public Film update(@Valid @RequestBody Film filmUpdate) { - log.debug("PUT, update film {}", filmUpdate); - Integer id = validateUpdate(filmUpdate); - Film oldFilm = films.get(id); - String newName = filmUpdate.getName(); - if (!newName.equals(oldFilm.getName())) oldFilm.setName(newName); - if (filmUpdate.getDescription() != null) { - String newDescription = filmUpdate.getDescription(); - if (!newDescription.equals(oldFilm.getDescription())) oldFilm.setDescription(newDescription); - } - LocalDate newReleaseDate = filmUpdate.getReleaseDate(); - if (!newReleaseDate.equals(oldFilm.getReleaseDate())) oldFilm.setReleaseDate(newReleaseDate); - - if (filmUpdate.getDuration() != null) { - Integer newDuration = filmUpdate.getDuration(); - if (!newDuration.equals(oldFilm.getDuration())) oldFilm.setDuration(newDuration); - } - return oldFilm; - } - - - private void validateReleaseDate(Film film) { - log.debug("validateReleaseDate start for {}", film); - LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); - if (film.getReleaseDate().isBefore(birthdayFilm)) { - String msg = "дата релиза — не раньше 28 декабря 1895 года"; - log.error(msg); - throw new ValidationException(msg); - } + return filmService.update(filmUpdate); } - private Integer validateUpdate(Film film) { - log.debug("validateUpdate start for {}", film); - String newName = film.getName(); - if (film.getId() == null) { - String msg = "Id должен быть указан"; - log.error(msg); - throw new ValidationException(msg); - } - Integer id = film.getId(); - if (!films.containsKey(id)) { - String msg = "Фильм с id = " + id + " не найден"; - log.error(msg); - throw new NotFoundException(msg); - } - validateReleaseDate(film); - return id; - } - private int getNextId() { - int currentMaxId = films.keySet() - .stream() - .mapToInt(id -> id) - .max() - .orElse(0); - return ++currentMaxId; - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index 44b05db..4391f6c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -2,99 +2,37 @@ import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.filmorate.exception.NotFoundException; -import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.service.UserService; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; @Slf4j @RestController @RequestMapping("/users") public class UserController { - private final Map users = new HashMap<>(); + + @Autowired + private UserService userService; @GetMapping public Collection getAll() { - log.debug("GET, all users"); - return users.values(); + return userService.getAll(); } @PostMapping public User create(@Valid @RequestBody User user) { - log.debug("POST, create user {}", user); - cloneSearchEmail(user); - user.setId(getNextId()); - checkUserName(user); - users.put(user.getId(), user); - return user; + return userService.create(user); } @PutMapping public User update(@Valid @RequestBody User newUser) { - log.debug("PUT, update User {}", newUser); - Integer id = validateUpdate(newUser); - User oldUser = users.get(id); - String newEmail = newUser.getEmail(); - String newLogin = newUser.getLogin(); - oldUser.setName(newUser.getName()); - if (newUser.getBirthday() != null) oldUser.setBirthday(newUser.getBirthday()); - if (!oldUser.getEmail().equals(newEmail)) oldUser.setEmail(newEmail); - if (!oldUser.getLogin().equals(newLogin)) oldUser.setLogin(newLogin); - return oldUser; - } - - private void cloneSearchEmail(User user) { - log.debug("cloneSearchEmail start for {}", user); - String newEmail = user.getEmail(); - for (User userMap : users.values()) { - if (userMap.getEmail().equals(newEmail)) { - String msg = "Этот Email уже используется"; - log.error(msg); - throw new ValidationException(msg); - } - } - } - - private void checkUserName(User user) { - if (user.getName() == null) { - user.setName(user.getLogin()); - } + return userService.update(newUser); } - private Integer validateUpdate(User newUser) { - log.debug("validateUpdate start for {}", newUser); - checkUserName(newUser); - String newEmail = newUser.getEmail(); - if (newUser.getId() == null) { - String msg = "Id должен быть указан"; - log.error(msg); - throw new ValidationException(msg); - } - Integer id = newUser.getId(); - if (!users.containsKey(id)) { - String msg = "Пользователь с id = " + newUser.getId() + " не найден"; - log.error(msg); - throw new NotFoundException(msg); - } - if (!newEmail.equals(users.get(id).getEmail())) { - cloneSearchEmail(newUser); - } - return id; - } - - - private int getNextId() { - int currentMaxId = users.keySet() - .stream() - .mapToInt(id -> id) - .max() - .orElse(0); - return ++currentMaxId; - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java new file mode 100644 index 0000000..a48f73b --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -0,0 +1,33 @@ +package ru.yandex.practicum.filmorate.service; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; + +import java.util.Collection; + +@RequiredArgsConstructor +@Service +public class FilmService { + + private InMemoryFilmStorage inMemoryFilmStorage; + + public Collection getAll() { + return inMemoryFilmStorage.getAll(); + } + + public Film create(Film film) { + return inMemoryFilmStorage.create(film); + } + + public Film update(Film filmUpdate) { + return inMemoryFilmStorage.update(filmUpdate); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java b/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java new file mode 100644 index 0000000..88ab2cb --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java @@ -0,0 +1,12 @@ +package ru.yandex.practicum.filmorate.service; + +import org.springframework.stereotype.Service; + +@Service +public class IdGenerator { + private int id; + + public int getNextId() { + return id++; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java new file mode 100644 index 0000000..3a6619c --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -0,0 +1,27 @@ +package ru.yandex.practicum.filmorate.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; + +import java.util.Collection; + +@RequiredArgsConstructor +@Service +public class UserService { + + private InMemoryUserStorage inMemoryUserStorage; + + public Collection getAll() { + return inMemoryUserStorage.getAll(); + } + + public User create(User user) { + return inMemoryUserStorage.create(user); + } + + public User update(User newUser) { + return inMemoryUserStorage.update(newUser); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java new file mode 100644 index 0000000..8ee4e4a --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java @@ -0,0 +1,19 @@ +package ru.yandex.practicum.filmorate.storage.film; + +import ru.yandex.practicum.filmorate.model.Film; + +import java.util.Collection; + +public interface FilmStorage { + + Collection getAll(); + + Film create(Film film); + + Film update(Film filmUpdate); + + void validateReleaseDate(Film film); + + Integer validateUpdate(Film film); + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java new file mode 100644 index 0000000..2248ba2 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -0,0 +1,90 @@ +package ru.yandex.practicum.filmorate.storage.film; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.service.IdGenerator; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@RequiredArgsConstructor +@Component +public class InMemoryFilmStorage implements FilmStorage { + + private final IdGenerator idGenerator; + private final Map films = new HashMap<>(); + + @Override + public Collection getAll() { +// log.debug("GET, all films"); + return films.values(); + } + + @Override + public Film create(Film film) { +// log.debug("POST, create film {}", film); + validateReleaseDate(film); + film.setId(idGenerator.getNextId()); + films.put(film.getId(), film); + return film; + } + + @Override + public Film update(Film filmUpdate) { +// log.debug("PUT, update film {}", filmUpdate); + Integer id = validateUpdate(filmUpdate); + Film oldFilm = films.get(id); + String newName = filmUpdate.getName(); + if (!newName.equals(oldFilm.getName())) oldFilm.setName(newName); + if (filmUpdate.getDescription() != null) { + String newDescription = filmUpdate.getDescription(); + if (!newDescription.equals(oldFilm.getDescription())) oldFilm.setDescription(newDescription); + } + LocalDate newReleaseDate = filmUpdate.getReleaseDate(); + if (!newReleaseDate.equals(oldFilm.getReleaseDate())) oldFilm.setReleaseDate(newReleaseDate); + + if (filmUpdate.getDuration() != null) { + Integer newDuration = filmUpdate.getDuration(); + if (!newDuration.equals(oldFilm.getDuration())) oldFilm.setDuration(newDuration); + } + return oldFilm; + } + + @Override + public void validateReleaseDate(Film film) { +// log.debug("validateReleaseDate start for {}", film); + LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); + if (film.getReleaseDate().isBefore(birthdayFilm)) { + String msg = "дата релиза — не раньше 28 декабря 1895 года"; +// log.error(msg); + throw new ValidationException(msg); + } + + } + + @Override + public Integer validateUpdate(Film film) { +// log.debug("validateUpdate start for {}", film); + String newName = film.getName(); + if (film.getId() == null) { + String msg = "Id должен быть указан"; +// log.error(msg); + throw new ValidationException(msg); + } + Integer id = film.getId(); + if (!films.containsKey(id)) { + String msg = "Фильм с id = " + id + " не найден"; +// log.error(msg); + throw new NotFoundException(msg); + } + validateReleaseDate(film); + return id; + } + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java new file mode 100644 index 0000000..ef48476 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -0,0 +1,93 @@ +package ru.yandex.practicum.filmorate.storage.user; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.service.IdGenerator; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@RequiredArgsConstructor +@Component +public class InMemoryUserStorage implements UserStorage { + + private final IdGenerator idGenerator; + private final Map users = new HashMap<>(); + + @Override + public Collection getAll() { +// log.debug("GET, all users"); + return users.values(); + } + + @Override + public User create(User user) { +// log.debug("POST, create user {}", user); + cloneSearchEmail(user); + user.setId(idGenerator.getNextId()); + checkOrAddUserName(user); + users.put(user.getId(), user); + return user; + } + + @Override + public User update(User newUser) { +// log.debug("PUT, update User {}", newUser); + Integer id = validateUpdate(newUser); + User oldUser = users.get(id); + String newEmail = newUser.getEmail(); + String newLogin = newUser.getLogin(); + oldUser.setName(newUser.getName()); + if (newUser.getBirthday() != null) oldUser.setBirthday(newUser.getBirthday()); + if (!oldUser.getEmail().equals(newEmail)) oldUser.setEmail(newEmail); + if (!oldUser.getLogin().equals(newLogin)) oldUser.setLogin(newLogin); + return oldUser; + } + + @Override + public void cloneSearchEmail(User user) { +// log.debug("cloneSearchEmail start for {}", user); + String newEmail = user.getEmail(); + for (User userMap : users.values()) { + if (userMap.getEmail().equals(newEmail)) { + String msg = "Этот Email уже используется"; +// log.error(msg); + throw new ValidationException(msg); + } + } + } + + @Override + public void checkOrAddUserName(User user) { + if (user.getName() == null) { + user.setName(user.getLogin()); + } + } + + @Override + public Integer validateUpdate(User newUser) { +// log.debug("validateUpdate start for {}", newUser); + checkOrAddUserName(newUser); + String newEmail = newUser.getEmail(); + if (newUser.getId() == null) { + String msg = "Id должен быть указан"; +// log.error(msg); + throw new ValidationException(msg); + } + Integer id = newUser.getId(); + if (!users.containsKey(id)) { + String msg = "Пользователь с id = " + newUser.getId() + " не найден"; +// log.error(msg); + throw new NotFoundException(msg); + } + if (!newEmail.equals(users.get(id).getEmail())) { + cloneSearchEmail(newUser); + } + return id; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java new file mode 100644 index 0000000..966975e --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java @@ -0,0 +1,20 @@ +package ru.yandex.practicum.filmorate.storage.user; + +import ru.yandex.practicum.filmorate.model.User; + +import java.util.Collection; + +public interface UserStorage { + + Collection getAll(); + + User create(User user); + + User update(User newUser); + + void cloneSearchEmail(User user); + + void checkOrAddUserName(User user); + + Integer validateUpdate(User newUser); +} From 25a6f50debe732789c139ebc0b4310089bd4b09f Mon Sep 17 00:00:00 2001 From: Just Roma Date: Wed, 22 Jan 2025 14:43:28 +0500 Subject: [PATCH 2/7] Sprint 11 add service --- .../filmorate/controller/ErrorHandler.java | 43 ++++++++++ .../filmorate/exception/ErrorResponse.java | 19 +++++ .../practicum/filmorate/model/Film.java | 6 ++ .../practicum/filmorate/model/User.java | 5 ++ .../filmorate/service/FilmService.java | 24 ++++-- .../filmorate/service/UserService.java | 18 ++++ .../filmorate/storage/film/FilmStorage.java | 11 +++ .../storage/film/InMemoryFilmStorage.java | 52 +++++++++++- .../storage/user/InMemoryUserStorage.java | 84 ++++++++++++++++++- .../filmorate/storage/user/UserStorage.java | 24 ++++-- 10 files changed, 266 insertions(+), 20 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java new file mode 100644 index 0000000..5ddd22f --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java @@ -0,0 +1,43 @@ +package ru.yandex.practicum.filmorate.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.Map; + +@RestControllerAdvice +public class ErrorHandler { + + // во всех обработчиках замените формат ответа на ErrorResponse + // добавьте коды ошибок + +// @ExceptionHandler +// @ResponseStatus(HttpStatus.FORBIDDEN) +// public Map handleHappinessOverflow(final HappinessOverflowException e) { +// return Map.of( +// "error", "Осторожно, вы так избалуете питомца!", +// "description : Текущий уровень счастья: ", e.getHappinessLevel().toString() +// ); +// } +// +// @ExceptionHandler +// @ResponseStatus(HttpStatus.BAD_REQUEST) +// public Map handleIncorrectParameter(final IncorrectParameterException e) { +// return Map.of( +// "error", "Ошибка с входным параметром.", +// "description", e.getMessage() +// ); +// } +// +// // реализуйте обработчик UnauthorizedUserException +// @ExceptionHandler +// @ResponseStatus(HttpStatus.UNAUTHORIZED) +// public Map handleUnauthorizedUser(final UnauthorizedUserException e) { +// return Map.of( +// "error", "Питомец даёт себя гладить только хозяину.", +// "description : Владелец - ", e.getOwner() + " , а пытается погладить " + e.getUser() +// ); +// } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java new file mode 100644 index 0000000..7a3ecd1 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java @@ -0,0 +1,19 @@ +package ru.yandex.practicum.filmorate.exception; + +class ErrorResponse { + private final String error; + private final String description; + + public ErrorResponse(String error, String description) { + this.error = error; + this.description = description; + } + + public String getError() { + return error; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java index d1a5b3a..cf65d8e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -8,6 +8,7 @@ import lombok.Data; import java.time.LocalDate; +import java.util.Set; @Builder @Data @@ -23,4 +24,9 @@ public class Film { @Positive @NotNull private Integer duration; + private Set likes; + + public int getLikesSize() { + return likes.size(); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java index f478a22..39b3971 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -8,10 +8,12 @@ import lombok.Data; import java.time.LocalDate; +import java.util.Set; @Builder @Data public class User { + private Integer id; @NotNull @NotBlank @@ -24,4 +26,7 @@ public class User { @Past @NotNull private LocalDate birthday; + private Set friends; + + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index a48f73b..d307a8d 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -1,15 +1,11 @@ package ru.yandex.practicum.filmorate.service; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; @@ -18,6 +14,7 @@ public class FilmService { private InMemoryFilmStorage inMemoryFilmStorage; + private InMemoryUserStorage inMemoryUserStorage; public Collection getAll() { return inMemoryFilmStorage.getAll(); @@ -30,4 +27,19 @@ public Film create(Film film) { public Film update(Film filmUpdate) { return inMemoryFilmStorage.update(filmUpdate); } + + public Film addLike(int filmId, int userId) { + User user = inMemoryUserStorage.getUserById(userId); + Film film = inMemoryFilmStorage.getFilmById(filmId); + return inMemoryFilmStorage.addLike(film, user); + } + + public Film removeLike(int filmId, int userId) { + return inMemoryFilmStorage.removeLike(filmId, userId); + } + + public Collection getFilmsByLike(Integer sizeFilms) { + return inMemoryFilmStorage.getFilmsByLike(sizeFilms); + } + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 3a6619c..ce94987 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -24,4 +24,22 @@ public User create(User user) { public User update(User newUser) { return inMemoryUserStorage.update(newUser); } + + public User addToFriend(int userId, int friendsId) { + return inMemoryUserStorage.addToFriend(userId, friendsId); + } + + public User removeFriends(int userId, int friendsId) { + return inMemoryUserStorage.removeFriends(userId, friendsId); + } + + public Collection getFriendsUser(int userId) { + return inMemoryUserStorage.getFriendsUser(userId); + } + + public Collection getMutualFriends(int userId, int friendsId) { + return inMemoryUserStorage.getMutualFriends(userId, friendsId); + } + + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java index 8ee4e4a..12f127c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java @@ -1,6 +1,7 @@ package ru.yandex.practicum.filmorate.storage.film; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; @@ -8,10 +9,20 @@ public interface FilmStorage { Collection getAll(); + Film getFilmById(int id); + Film create(Film film); Film update(Film filmUpdate); + Film addLike(Film film, User user); + + Film removeLike(Integer filmId, Integer userId); + + Collection getFilmsByLike(Integer sizeFilms); + + void validateFilmId(Integer id); + void validateReleaseDate(Film film); Integer validateUpdate(Film film); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java index 2248ba2..57cbc8c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -1,17 +1,16 @@ package ru.yandex.practicum.filmorate.storage.film; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.IdGenerator; import java.time.LocalDate; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; @RequiredArgsConstructor @Component @@ -26,6 +25,12 @@ public Collection getAll() { return films.values(); } + @Override + public Film getFilmById(int id) { + validateFilmId(id); + return films.get(id); + } + @Override public Film create(Film film) { // log.debug("POST, create film {}", film); @@ -56,6 +61,45 @@ public Film update(Film filmUpdate) { return oldFilm; } + @Override + public Film addLike(Film film, User user) { + film.getLikes().add(user.getId()); + int id = film.getId(); + films.put(id, film); + return films.get(id); + } + + @Override + public Film removeLike(Integer filmId, Integer userId) { + validateFilmId(filmId); + Film film = films.get(filmId); + film.getLikes().remove(userId); + films.put(filmId, film); + return films.get(filmId); + } + + @Override + public Collection getFilmsByLike(Integer sizeFilms) { + + List filmsSortedByLikes = films.values() + .stream() + .sorted(Comparator.comparingInt(Film::getLikesSize)) + .collect(Collectors.toCollection(ArrayList::new)); + + List returnSortedFilms = new ArrayList<>(); + + for (int i = 0; i < sizeFilms; i++) { + if (filmsSortedByLikes.size() < i + 1) break; + returnSortedFilms.add(filmsSortedByLikes.get(i)); + } + return returnSortedFilms; + } + + @Override + public void validateFilmId(Integer id) { + if (!films.containsKey(id)) throw new NotFoundException("Фильм с id=%d не найден"); + } + @Override public void validateReleaseDate(Film film) { // log.debug("validateReleaseDate start for {}", film); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index ef48476..a70fe0f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -1,16 +1,13 @@ package ru.yandex.practicum.filmorate.storage.user; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.IdGenerator; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @RequiredArgsConstructor @Component @@ -25,6 +22,13 @@ public Collection getAll() { return users.values(); } + @Override + public User getUserById(int id) { + validateUserId(id); + return users.get(id); + } + + @Override public User create(User user) { // log.debug("POST, create user {}", user); @@ -49,6 +53,78 @@ public User update(User newUser) { return oldUser; } + @Override + public User addToFriend(int userId, int friendsId) { + validateUserId(userId); + validateUserId(friendsId); + + User user = users.get(userId); + User userFriends = users.get(friendsId); + + user.getFriends().add(friendsId); + userFriends.getFriends().add(userId); + + users.put(userId, user); + users.put(friendsId, userFriends); + + return userFriends; + } + + @Override + public User removeFriends(int userId, int friendsId) { + validateUserId(userId); + validateUserId(friendsId); + + User user = users.get(userId); + User userFriends = users.get(friendsId); + + user.getFriends().remove(friendsId); + userFriends.getFriends().remove(userId); + + users.put(userId, user); + users.put(friendsId, userFriends); + + return userFriends; + } + + @Override + public Collection getFriendsUser(int userId) { + validateUserId(userId); + User user = users.get(userId); + Set friendsId = user.getFriends(); + List userFriends = new ArrayList<>(); + + for (int id : friendsId) { + userFriends.add(users.get(id)); + } + return userFriends; + } + + @Override + public Collection getMutualFriends(int userId, int friendsId) { + validateUserId(userId); + validateUserId(friendsId); + + User user1 = users.get(userId); + User user2 = users.get(friendsId); + + Set user1FriendsId = user1.getFriends(); + Set user2FriendsId = user2.getFriends(); + List mutualFriends = new ArrayList<>(); + + for (int id1 : user1FriendsId) { + for (int id2 : user2FriendsId) { + if (id1 == id2) mutualFriends.add(users.get(id1)); + } + } + return mutualFriends; + } + + @Override + public void validateUserId(int id) { + if (!users.containsKey(id)) throw new NotFoundException("Пользователь с id=%d не найден"); + } + @Override public void cloneSearchEmail(User user) { // log.debug("cloneSearchEmail start for {}", user); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java index 966975e..bde0707 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java @@ -6,15 +6,27 @@ public interface UserStorage { - Collection getAll(); + Collection getAll(); - User create(User user); + User getUserById(int id); - User update(User newUser); + User create(User user); - void cloneSearchEmail(User user); + User update(User newUser); - void checkOrAddUserName(User user); + User addToFriend(int userId, int friendsId); - Integer validateUpdate(User newUser); + User removeFriends(int userId, int friendsId); + + Collection getFriendsUser(int userId); + + Collection getMutualFriends(int userId, int friendsId); + + void validateUserId(int id); + + void cloneSearchEmail(User user); + + void checkOrAddUserName(User user); + + Integer validateUpdate(User newUser); } From d93077172822466b1671003d95b928dbef80aff9 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Fri, 24 Jan 2025 15:05:04 +0500 Subject: [PATCH 3/7] Sprint 11 add ErrorHandler --- pom.xml | 5 + .../filmorate/controller/ErrorHandler.java | 52 ++++----- .../filmorate/controller/FilmController.java | 17 +++ .../filmorate/controller/UserController.java | 24 +++- .../filmorate/exception/ErrorResponse.java | 2 +- .../InternalServerErrorException.java | 7 ++ .../practicum/filmorate/model/Film.java | 5 +- .../practicum/filmorate/model/User.java | 2 - .../filmorate/service/FilmService.java | 17 ++- .../filmorate/service/IdGenerator.java | 2 +- .../filmorate/service/UserService.java | 10 +- .../filmorate/storage/film/FilmStorage.java | 8 +- .../storage/film/InMemoryFilmStorage.java | 104 ++++++++++++++---- .../storage/user/InMemoryUserStorage.java | 94 ++++++++++------ .../filmorate/storage/user/UserStorage.java | 8 +- src/main/resources/application.properties | 2 +- 16 files changed, 249 insertions(+), 110 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/InternalServerErrorException.java diff --git a/pom.xml b/pom.xml index 33d0052..ba41373 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,11 @@ org.springframework.boot spring-boot-starter-web + + org.zalando + logbook-spring-boot-starter + 3.7.2 + org.springframework.boot spring-boot-starter-validation diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java index 5ddd22f..bc6006f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java @@ -4,40 +4,30 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; - -import java.util.Map; +import ru.yandex.practicum.filmorate.exception.ErrorResponse; +import ru.yandex.practicum.filmorate.exception.InternalServerErrorException; +import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.exception.ValidationException; @RestControllerAdvice public class ErrorHandler { - // во всех обработчиках замените формат ответа на ErrorResponse - // добавьте коды ошибок + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handleNotFoundException(final NotFoundException e) { + return new ErrorResponse("Error", e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleValidationException(final ValidationException e) { + return new ErrorResponse("Error", e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ErrorResponse handleInternalServerErrorException(final InternalServerErrorException e) { + return new ErrorResponse("Error", e.getMessage()); + } -// @ExceptionHandler -// @ResponseStatus(HttpStatus.FORBIDDEN) -// public Map handleHappinessOverflow(final HappinessOverflowException e) { -// return Map.of( -// "error", "Осторожно, вы так избалуете питомца!", -// "description : Текущий уровень счастья: ", e.getHappinessLevel().toString() -// ); -// } -// -// @ExceptionHandler -// @ResponseStatus(HttpStatus.BAD_REQUEST) -// public Map handleIncorrectParameter(final IncorrectParameterException e) { -// return Map.of( -// "error", "Ошибка с входным параметром.", -// "description", e.getMessage() -// ); -// } -// -// // реализуйте обработчик UnauthorizedUserException -// @ExceptionHandler -// @ResponseStatus(HttpStatus.UNAUTHORIZED) -// public Map handleUnauthorizedUser(final UnauthorizedUserException e) { -// return Map.of( -// "error", "Питомец даёт себя гладить только хозяину.", -// "description : Владелец - ", e.getOwner() + " , а пытается погладить " + e.getUser() -// ); -// } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java index a570fc9..4ac580f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -8,6 +8,8 @@ import ru.yandex.practicum.filmorate.service.FilmService; import java.util.Collection; +import java.util.Map; +import java.util.Set; @Slf4j @RestController @@ -22,6 +24,11 @@ public Collection getAll() { return filmService.getAll(); } + @GetMapping("/popular") + public Collection getFilmsByLike(@RequestParam(defaultValue = "10") int sizeFilms) { + return filmService.getFilmsByLike(sizeFilms); + } + @PostMapping public Film create(@Valid @RequestBody Film film) { return filmService.create(film); @@ -32,5 +39,15 @@ public Film update(@Valid @RequestBody Film filmUpdate) { return filmService.update(filmUpdate); } + @PutMapping("/{filmId}/like/{userId}") + public Map> addLike(@PathVariable int filmId, @PathVariable int userId) { + return filmService.addLike(filmId, userId); + } + + @DeleteMapping("/{filmId}/like/{userId}") + public void removeLike(@PathVariable int filmId, @PathVariable int userId) { + filmService.removeLike(filmId, userId); + } + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index 4391f6c..e5ea3c9 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -6,9 +6,10 @@ import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; -import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; +import java.util.Map; +import java.util.Set; @Slf4j @RestController @@ -23,16 +24,35 @@ public Collection getAll() { return userService.getAll(); } + @GetMapping("/{userId}/friends") + public Collection getFriendsUser(@PathVariable int userId) { + return userService.getFriendsUser(userId); + } + + @GetMapping("/{userId}/friends/common/{friendsId}") + public Collection getMutualFriends(@PathVariable int userId, @PathVariable int friendsId) { + return userService.getMutualFriends(userId, friendsId); + } + @PostMapping public User create(@Valid @RequestBody User user) { return userService.create(user); } - @PutMapping public User update(@Valid @RequestBody User newUser) { return userService.update(newUser); } + @PutMapping("/{userId}/friends/{friendsId}") + public Map> addToFriend(@PathVariable int userId, @PathVariable int friendsId) { + return userService.addToFriend(userId, friendsId); + } + + @DeleteMapping("/{userId}/friends/{friendsId}") + public void removeFriend(@PathVariable int userId, @PathVariable int friendsId) { + userService.removeFriend(userId, friendsId); + } + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java index 7a3ecd1..8ab2e8f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java @@ -1,6 +1,6 @@ package ru.yandex.practicum.filmorate.exception; -class ErrorResponse { +public class ErrorResponse { private final String error; private final String description; diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/InternalServerErrorException.java b/src/main/java/ru/yandex/practicum/filmorate/exception/InternalServerErrorException.java new file mode 100644 index 0000000..f368cda --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/InternalServerErrorException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.filmorate.exception; + +public class InternalServerErrorException extends RuntimeException { + public InternalServerErrorException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java index cf65d8e..50984e9 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -24,9 +24,6 @@ public class Film { @Positive @NotNull private Integer duration; - private Set likes; + private int likes; - public int getLikesSize() { - return likes.size(); - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java index 39b3971..39cb290 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -26,7 +26,5 @@ public class User { @Past @NotNull private LocalDate birthday; - private Set friends; - } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index d307a8d..ca1f72a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -1,6 +1,7 @@ package ru.yandex.practicum.filmorate.service; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.User; @@ -8,12 +9,16 @@ import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; +import java.util.Map; +import java.util.Set; @RequiredArgsConstructor @Service public class FilmService { + @Autowired private InMemoryFilmStorage inMemoryFilmStorage; + @Autowired private InMemoryUserStorage inMemoryUserStorage; public Collection getAll() { @@ -28,14 +33,14 @@ public Film update(Film filmUpdate) { return inMemoryFilmStorage.update(filmUpdate); } - public Film addLike(int filmId, int userId) { - User user = inMemoryUserStorage.getUserById(userId); - Film film = inMemoryFilmStorage.getFilmById(filmId); - return inMemoryFilmStorage.addLike(film, user); + public Map> addLike(int filmId, int userId) { + inMemoryUserStorage.validateUserId(userId); + return inMemoryFilmStorage.addLike(filmId, userId); } - public Film removeLike(int filmId, int userId) { - return inMemoryFilmStorage.removeLike(filmId, userId); + public void removeLike(int filmId, int userId) { + inMemoryUserStorage.validateUserId(userId); + inMemoryFilmStorage.removeLike(filmId, userId); } public Collection getFilmsByLike(Integer sizeFilms) { diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java b/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java index 88ab2cb..d1d5ed3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java @@ -4,7 +4,7 @@ @Service public class IdGenerator { - private int id; + private int id = 1; public int getNextId() { return id++; diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index ce94987..01c7a3b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -1,16 +1,20 @@ package ru.yandex.practicum.filmorate.service; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; +import java.util.Map; +import java.util.Set; @RequiredArgsConstructor @Service public class UserService { + @Autowired private InMemoryUserStorage inMemoryUserStorage; public Collection getAll() { @@ -25,12 +29,12 @@ public User update(User newUser) { return inMemoryUserStorage.update(newUser); } - public User addToFriend(int userId, int friendsId) { + public Map> addToFriend(int userId, int friendsId) { return inMemoryUserStorage.addToFriend(userId, friendsId); } - public User removeFriends(int userId, int friendsId) { - return inMemoryUserStorage.removeFriends(userId, friendsId); + public void removeFriend(int userId, int friendsId) { + inMemoryUserStorage.removeFriend(userId, friendsId); } public Collection getFriendsUser(int userId) { diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java index 12f127c..2587ebe 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java @@ -4,6 +4,8 @@ import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; +import java.util.Map; +import java.util.Set; public interface FilmStorage { @@ -15,14 +17,16 @@ public interface FilmStorage { Film update(Film filmUpdate); - Film addLike(Film film, User user); + Map> addLike(int filmId, int userId); - Film removeLike(Integer filmId, Integer userId); + void removeLike(Integer filmId, Integer userId); Collection getFilmsByLike(Integer sizeFilms); void validateFilmId(Integer id); + boolean checkFilmsLikes(int id); + void validateReleaseDate(Film film); Integer validateUpdate(Film film); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java index 57cbc8c..f500445 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -1,23 +1,24 @@ package ru.yandex.practicum.filmorate.storage.film; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.IdGenerator; import java.time.LocalDate; import java.util.*; -import java.util.stream.Collectors; @RequiredArgsConstructor @Component public class InMemoryFilmStorage implements FilmStorage { + @Autowired private final IdGenerator idGenerator; private final Map films = new HashMap<>(); + private final Map> filmsLikes = new HashMap<>(); @Override public Collection getAll() { @@ -62,44 +63,103 @@ public Film update(Film filmUpdate) { } @Override - public Film addLike(Film film, User user) { - film.getLikes().add(user.getId()); - int id = film.getId(); - films.put(id, film); - return films.get(id); + public Map> addLike(int filmId, int userId) { + validateFilmId(filmId); + + if (checkFilmsLikes(filmId)) { + Set likes = filmsLikes.get(filmId); + + if (likes.add(userId)) { + addLikeFilm(filmId); + } + filmsLikes.put(filmId, likes); + } else { + addLikeFilm(filmId); + + Set likes = new HashSet<>(); + likes.add(userId); + filmsLikes.put(filmId, likes); + } + + return Map.of(films.get(filmId), filmsLikes.get(filmId)); } @Override - public Film removeLike(Integer filmId, Integer userId) { + public void removeLike(Integer filmId, Integer userId) { validateFilmId(filmId); - Film film = films.get(filmId); - film.getLikes().remove(userId); - films.put(filmId, film); - return films.get(filmId); + + if (checkFilmsLikes(filmId)) { + Set likes = filmsLikes.get(filmId); + likes.remove(userId); + removeLikeFilm(filmId); + if (likes.isEmpty()) { + filmsLikes.remove(filmId); + } else { + filmsLikes.put(filmId, likes); + } + } } @Override public Collection getFilmsByLike(Integer sizeFilms) { - - List filmsSortedByLikes = films.values() + Set returnFilms = new HashSet<>(); + + if (filmsLikes.isEmpty()) { + for (Film film : films.values()) { + if (returnFilms.size() == sizeFilms) break; + returnFilms.add(film); + } + return returnFilms; + } + List sortedFilmByLike = films.values() .stream() - .sorted(Comparator.comparingInt(Film::getLikesSize)) - .collect(Collectors.toCollection(ArrayList::new)); + .sorted(Comparator.comparingInt(Film::getLikes)) + .toList(); + + sortedFilmByLike = sortedFilmByLike.reversed(); + for (Film fim : sortedFilmByLike) { + if (returnFilms.size() == sizeFilms) break; + returnFilms.add(fim); + } - List returnSortedFilms = new ArrayList<>(); + if (returnFilms.size() == sortedFilmByLike.size()) return returnFilms; - for (int i = 0; i < sizeFilms; i++) { - if (filmsSortedByLikes.size() < i + 1) break; - returnSortedFilms.add(filmsSortedByLikes.get(i)); + for (Film film : films.values()) { + if (returnFilms.size() == sizeFilms) break; + returnFilms.add(film); } - return returnSortedFilms; + return returnFilms; } @Override public void validateFilmId(Integer id) { - if (!films.containsKey(id)) throw new NotFoundException("Фильм с id=%d не найден"); + if (!films.containsKey(id)) throw new NotFoundException("Фильм с id: " + id + " не найден"); } + @Override + public boolean checkFilmsLikes(int id) { + return filmsLikes.containsKey(id); + } + + private void addLikeFilm(int filmId) { + Film film = films.get(filmId); + + Integer like = film.getLikes() + 1; + film.setLikes(like); + films.put(filmId, film); + } + + private void removeLikeFilm(int filmId) { + Film film = films.get(filmId); + int like = film.getLikes(); + + if (like != 0) { + film.setLikes(like - 1); + films.put(filmId, film); + } + } + + @Override public void validateReleaseDate(Film film) { // log.debug("validateReleaseDate start for {}", film); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index a70fe0f..4a32066 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -1,7 +1,9 @@ package ru.yandex.practicum.filmorate.storage.user; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.exception.InternalServerErrorException; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.User; @@ -13,8 +15,10 @@ @Component public class InMemoryUserStorage implements UserStorage { + @Autowired private final IdGenerator idGenerator; private final Map users = new HashMap<>(); + private final Map> userFriends = new HashMap<>(); @Override public Collection getAll() { @@ -54,50 +58,72 @@ public User update(User newUser) { } @Override - public User addToFriend(int userId, int friendsId) { + public Map> addToFriend(int userId, int friendsId) { validateUserId(userId); validateUserId(friendsId); - User user = users.get(userId); - User userFriends = users.get(friendsId); - - user.getFriends().add(friendsId); - userFriends.getFriends().add(userId); - - users.put(userId, user); - users.put(friendsId, userFriends); + if (checkUserFriends(userId)) { + Set friendsIds = userFriends.get(userId); + friendsIds.add(friendsId); + userFriends.put(userId, friendsIds); + } else { + Set friendsIds = new HashSet<>(); + friendsIds.add(friendsId); + userFriends.put(userId, friendsIds); + } - return userFriends; + if (checkUserFriends(friendsId)) { + Set friendsIds = userFriends.get(friendsId); + friendsIds.add(userId); + userFriends.put(friendsId, friendsIds); + } else { + Set friendsIds = new HashSet<>(); + friendsIds.add(userId); + userFriends.put(friendsId, friendsIds); + } + return Map.of(users.get(userId), userFriends.get(userId), + users.get(friendsId), userFriends.get(friendsId)); } @Override - public User removeFriends(int userId, int friendsId) { + public void removeFriend(int userId, int friendsId) { validateUserId(userId); validateUserId(friendsId); - User user = users.get(userId); - User userFriends = users.get(friendsId); - - user.getFriends().remove(friendsId); - userFriends.getFriends().remove(userId); - - users.put(userId, user); - users.put(friendsId, userFriends); + if (checkUserFriends(userId)) { + Set friendsIds = userFriends.get(userId); + friendsIds.remove(friendsId); + if (friendsIds.isEmpty()) { + userFriends.remove(userId); + } else { + userFriends.put(userId, friendsIds); + } + } - return userFriends; + if (checkUserFriends(friendsId)) { + Set friendsIds = userFriends.get(friendsId); + friendsIds.remove(userId); + if (friendsIds.isEmpty()) { + userFriends.remove(friendsId); + } else { + userFriends.put(friendsId, friendsIds); + } + } } @Override public Collection getFriendsUser(int userId) { validateUserId(userId); - User user = users.get(userId); - Set friendsId = user.getFriends(); - List userFriends = new ArrayList<>(); - - for (int id : friendsId) { - userFriends.add(users.get(id)); + Set friendsIds = userFriends.get(userId); + List friends = new ArrayList<>(); + if (!checkUserFriends(userId)) { + return friends; + } + + for (int id : friendsIds) { + friends.add(users.get(id)); } - return userFriends; + return friends; } @Override @@ -105,11 +131,8 @@ public Collection getMutualFriends(int userId, int friendsId) { validateUserId(userId); validateUserId(friendsId); - User user1 = users.get(userId); - User user2 = users.get(friendsId); - - Set user1FriendsId = user1.getFriends(); - Set user2FriendsId = user2.getFriends(); + Set user1FriendsId = userFriends.get(userId); + Set user2FriendsId = userFriends.get(friendsId); List mutualFriends = new ArrayList<>(); for (int id1 : user1FriendsId) { @@ -122,7 +145,12 @@ public Collection getMutualFriends(int userId, int friendsId) { @Override public void validateUserId(int id) { - if (!users.containsKey(id)) throw new NotFoundException("Пользователь с id=%d не найден"); + if (!users.containsKey(id)) throw new NotFoundException("Пользователь с id: " + id + " не найден"); + } + + @Override + public boolean checkUserFriends(int id) { + return userFriends.containsKey(id); } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java index bde0707..872ca0a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java @@ -3,6 +3,8 @@ import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; +import java.util.Map; +import java.util.Set; public interface UserStorage { @@ -14,9 +16,9 @@ public interface UserStorage { User update(User newUser); - User addToFriend(int userId, int friendsId); + Map> addToFriend(int userId, int friendsId); - User removeFriends(int userId, int friendsId); + void removeFriend(int userId, int friendsId); Collection getFriendsUser(int userId); @@ -24,6 +26,8 @@ public interface UserStorage { void validateUserId(int id); + boolean checkUserFriends(int id); + void cloneSearchEmail(User user); void checkOrAddUserName(User user); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..147f265 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1 @@ - +logging.level.org.zalando.logbook= TRACE From ec24d188c3efd70e5439aa1ab3ce650be40f78fc Mon Sep 17 00:00:00 2001 From: Just Roma Date: Fri, 24 Jan 2025 16:11:47 +0500 Subject: [PATCH 4/7] Sprint 11 final editor --- .../practicum/filmorate/model/Film.java | 1 - .../practicum/filmorate/model/User.java | 1 - .../filmorate/service/FilmService.java | 3 +- .../filmorate/service/IdGenerator.java | 12 ------ .../filmorate/service/UserService.java | 2 +- .../filmorate/storage/film/FilmStorage.java | 1 - .../storage/film/InMemoryFilmStorage.java | 41 +++++++++++-------- .../storage/user/InMemoryUserStorage.java | 33 ++++++++------- .../filmorate/controller/FilmTest.java | 17 ++++---- .../filmorate/controller/UserTest.java | 15 ++++--- 10 files changed, 61 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java index 50984e9..478d9e3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -8,7 +8,6 @@ import lombok.Data; import java.time.LocalDate; -import java.util.Set; @Builder @Data diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java index 39cb290..7622f2d 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -8,7 +8,6 @@ import lombok.Data; import java.time.LocalDate; -import java.util.Set; @Builder @Data diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index ca1f72a..b7482c1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; @@ -40,7 +39,7 @@ public Map> addLike(int filmId, int userId) { public void removeLike(int filmId, int userId) { inMemoryUserStorage.validateUserId(userId); - inMemoryFilmStorage.removeLike(filmId, userId); + inMemoryFilmStorage.removeLike(filmId, userId); } public Collection getFilmsByLike(Integer sizeFilms) { diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java b/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java deleted file mode 100644 index d1d5ed3..0000000 --- a/src/main/java/ru/yandex/practicum/filmorate/service/IdGenerator.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.yandex.practicum.filmorate.service; - -import org.springframework.stereotype.Service; - -@Service -public class IdGenerator { - private int id = 1; - - public int getNextId() { - return id++; - } -} diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 01c7a3b..e6aad6a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -34,7 +34,7 @@ public Map> addToFriend(int userId, int friendsId) { } public void removeFriend(int userId, int friendsId) { - inMemoryUserStorage.removeFriend(userId, friendsId); + inMemoryUserStorage.removeFriend(userId, friendsId); } public Collection getFriendsUser(int userId) { diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java index 2587ebe..6ab9fd4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java @@ -1,7 +1,6 @@ package ru.yandex.practicum.filmorate.storage.film; import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; import java.util.Map; diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java index f500445..c61d9a6 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -1,28 +1,33 @@ package ru.yandex.practicum.filmorate.storage.film; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.service.IdGenerator; import java.time.LocalDate; import java.util.*; +@Slf4j @RequiredArgsConstructor @Component public class InMemoryFilmStorage implements FilmStorage { - @Autowired - private final IdGenerator idGenerator; private final Map films = new HashMap<>(); private final Map> filmsLikes = new HashMap<>(); + private int id = 1; + + public int getNextId() { + return id++; + } + + @Override public Collection getAll() { -// log.debug("GET, all films"); + log.debug("GET, all films"); return films.values(); } @@ -34,16 +39,16 @@ public Film getFilmById(int id) { @Override public Film create(Film film) { -// log.debug("POST, create film {}", film); + log.debug("POST, create film {}", film); validateReleaseDate(film); - film.setId(idGenerator.getNextId()); + film.setId(getNextId()); films.put(film.getId(), film); return film; } @Override public Film update(Film filmUpdate) { -// log.debug("PUT, update film {}", filmUpdate); + log.debug("PUT, update film {}", filmUpdate); Integer id = validateUpdate(filmUpdate); Film oldFilm = films.get(id); String newName = filmUpdate.getName(); @@ -102,7 +107,7 @@ public void removeLike(Integer filmId, Integer userId) { @Override public Collection getFilmsByLike(Integer sizeFilms) { - Set returnFilms = new HashSet<>(); + List returnFilms = new ArrayList<>(); if (filmsLikes.isEmpty()) { for (Film film : films.values()) { @@ -115,11 +120,11 @@ public Collection getFilmsByLike(Integer sizeFilms) { .stream() .sorted(Comparator.comparingInt(Film::getLikes)) .toList(); - sortedFilmByLike = sortedFilmByLike.reversed(); - for (Film fim : sortedFilmByLike) { + + for (Film film : sortedFilmByLike) { if (returnFilms.size() == sizeFilms) break; - returnFilms.add(fim); + returnFilms.add(film); } if (returnFilms.size() == sortedFilmByLike.size()) return returnFilms; @@ -144,7 +149,7 @@ public boolean checkFilmsLikes(int id) { private void addLikeFilm(int filmId) { Film film = films.get(filmId); - Integer like = film.getLikes() + 1; + int like = film.getLikes() + 1; film.setLikes(like); films.put(filmId, film); } @@ -162,11 +167,11 @@ private void removeLikeFilm(int filmId) { @Override public void validateReleaseDate(Film film) { -// log.debug("validateReleaseDate start for {}", film); + log.debug("validateReleaseDate start for {}", film); LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); if (film.getReleaseDate().isBefore(birthdayFilm)) { String msg = "дата релиза — не раньше 28 декабря 1895 года"; -// log.error(msg); + log.error(msg); throw new ValidationException(msg); } @@ -174,17 +179,17 @@ public void validateReleaseDate(Film film) { @Override public Integer validateUpdate(Film film) { -// log.debug("validateUpdate start for {}", film); + log.debug("validateUpdate start for {}", film); String newName = film.getName(); if (film.getId() == null) { String msg = "Id должен быть указан"; -// log.error(msg); + log.error(msg); throw new ValidationException(msg); } Integer id = film.getId(); if (!films.containsKey(id)) { String msg = "Фильм с id = " + id + " не найден"; -// log.error(msg); + log.error(msg); throw new NotFoundException(msg); } validateReleaseDate(film); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index 4a32066..3106eb1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -1,28 +1,31 @@ package ru.yandex.practicum.filmorate.storage.user; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import ru.yandex.practicum.filmorate.exception.InternalServerErrorException; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.User; -import ru.yandex.practicum.filmorate.service.IdGenerator; import java.util.*; +@Slf4j @RequiredArgsConstructor @Component public class InMemoryUserStorage implements UserStorage { - @Autowired - private final IdGenerator idGenerator; private final Map users = new HashMap<>(); private final Map> userFriends = new HashMap<>(); + private int id = 1; + + public int getNextId() { + return id++; + } + @Override public Collection getAll() { -// log.debug("GET, all users"); + log.debug("GET, all users"); return users.values(); } @@ -35,9 +38,9 @@ public User getUserById(int id) { @Override public User create(User user) { -// log.debug("POST, create user {}", user); + log.debug("POST, create user {}", user); cloneSearchEmail(user); - user.setId(idGenerator.getNextId()); + user.setId(getNextId()); checkOrAddUserName(user); users.put(user.getId(), user); return user; @@ -45,7 +48,7 @@ public User create(User user) { @Override public User update(User newUser) { -// log.debug("PUT, update User {}", newUser); + log.debug("PUT, update User {}", newUser); Integer id = validateUpdate(newUser); User oldUser = users.get(id); String newEmail = newUser.getEmail(); @@ -118,7 +121,7 @@ public Collection getFriendsUser(int userId) { List friends = new ArrayList<>(); if (!checkUserFriends(userId)) { return friends; - } + } for (int id : friendsIds) { friends.add(users.get(id)); @@ -155,12 +158,12 @@ public boolean checkUserFriends(int id) { @Override public void cloneSearchEmail(User user) { -// log.debug("cloneSearchEmail start for {}", user); + log.debug("cloneSearchEmail start for {}", user); String newEmail = user.getEmail(); for (User userMap : users.values()) { if (userMap.getEmail().equals(newEmail)) { String msg = "Этот Email уже используется"; -// log.error(msg); + log.error(msg); throw new ValidationException(msg); } } @@ -175,18 +178,18 @@ public void checkOrAddUserName(User user) { @Override public Integer validateUpdate(User newUser) { -// log.debug("validateUpdate start for {}", newUser); + log.debug("validateUpdate start for {}", newUser); checkOrAddUserName(newUser); String newEmail = newUser.getEmail(); if (newUser.getId() == null) { String msg = "Id должен быть указан"; -// log.error(msg); + log.error(msg); throw new ValidationException(msg); } Integer id = newUser.getId(); if (!users.containsKey(id)) { String msg = "Пользователь с id = " + newUser.getId() + " не найден"; -// log.error(msg); + log.error(msg); throw new NotFoundException(msg); } if (!newEmail.equals(users.get(id).getEmail())) { diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java index 245a172..997cd4c 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; import java.time.LocalDate; import java.util.Set; @@ -23,11 +24,11 @@ public class FilmTest { validator = validatorFactory.usingContext().getValidator(); } - private FilmController filmController; + private InMemoryFilmStorage inMemoryFilmStorage; @BeforeEach public void setUp() { - filmController = new FilmController(); + inMemoryFilmStorage = new InMemoryFilmStorage(); } @@ -77,11 +78,11 @@ public void whenFilmReleaseDateBeforeBirthdayFilmsThrowValidationException() { .description("Super description") .releaseDate(LocalDate.of(1895, 12, 27)) .build(); - assertThrows(ValidationException.class, () -> filmController.create(film)); + assertThrows(ValidationException.class, () -> inMemoryFilmStorage.create(film)); film.setName("Fork"); film.setReleaseDate(LocalDate.of(1895, 12, 28)); - assertDoesNotThrow(() -> filmController.create(film)); + assertDoesNotThrow(() -> inMemoryFilmStorage.create(film)); } // продолжительность фильма должна быть положительным числом. @@ -112,7 +113,7 @@ public void filmCreate() { .build(); Set> violation = validator.validate(film); assertEquals(0, violation.size()); - assertDoesNotThrow(() -> filmController.create(film)); + assertDoesNotThrow(() -> inMemoryFilmStorage.create(film)); } // Правильный сценарий обновления @@ -127,7 +128,7 @@ public void filmUpdate() { .build(); Set> violation = validator.validate(film); assertEquals(0, violation.size()); - assertDoesNotThrow(() -> filmController.create(film)); + assertDoesNotThrow(() -> inMemoryFilmStorage.create(film)); // обновляем film.setId(1); @@ -137,8 +138,8 @@ public void filmUpdate() { film.setDuration(2); Set> violation2 = validator.validate(film); assertEquals(0, violation2.size()); - assertDoesNotThrow(() -> filmController.update(film)); - Film createdFilm = filmController.update(film); + assertDoesNotThrow(() -> inMemoryFilmStorage.update(film)); + Film createdFilm = inMemoryFilmStorage.update(film); assertEquals(film.toString(), createdFilm.toString()); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java index de62f53..a67b37c 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java @@ -6,7 +6,9 @@ import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.time.LocalDate; import java.util.Set; @@ -23,11 +25,12 @@ public class UserTest { validator = validatorFactory.usingContext().getValidator(); } - private UserController userController; + @Autowired + private InMemoryUserStorage inMemoryUserStorage; @BeforeEach public void setUp() { - userController = new UserController(); + inMemoryUserStorage = new InMemoryUserStorage(); } // электронная почта не может быть пустой и должна содержать символ @; @@ -92,7 +95,7 @@ public void whenUserNameNullLoginEqualName() { .build(); Set> violationGod = validator.validate(user); assertEquals(0, violationGod.size()); - User createdUser = userController.create(user); + User createdUser = inMemoryUserStorage.create(user); assertEquals(createdUser.getName(), user.getLogin()); } @@ -122,7 +125,7 @@ public void createUser() { .build(); Set> violation = validator.validate(user); assertEquals(0, violation.size()); - assertDoesNotThrow(() -> userController.create(user)); + assertDoesNotThrow(() -> inMemoryUserStorage.create(user)); } @@ -137,7 +140,7 @@ public void updateUser() { .build(); Set> violation = validator.validate(user); assertEquals(0, violation.size()); - assertDoesNotThrow(() -> userController.create(user)); + assertDoesNotThrow(() -> inMemoryUserStorage.create(user)); // обновляем user.setId(1); @@ -147,7 +150,7 @@ public void updateUser() { user.setBirthday(LocalDate.of(2023, 12, 12)); Set> violation2 = validator.validate(user); assertEquals(0, violation2.size()); - User createdUser = userController.update(user); + User createdUser = inMemoryUserStorage.update(user); assertEquals(user.toString(), createdUser.toString()); From 62acb5e6775eac744f7cbc654d5d6e16ff6fcfbf Mon Sep 17 00:00:00 2001 From: Just Roma Date: Sat, 25 Jan 2025 20:34:37 +0500 Subject: [PATCH 5/7] Sprint 11 final 2 editor --- .../filmorate/controller/FilmController.java | 6 +- .../filmorate/controller/UserController.java | 6 +- .../filmorate/service/FilmService.java | 8 +- .../filmorate/service/UserService.java | 4 +- .../filmorate/storage/film/FilmStorage.java | 8 -- .../storage/film/InMemoryFilmStorage.java | 66 ++++++++++------ .../storage/user/InMemoryUserStorage.java | 79 +++++++++---------- .../filmorate/storage/user/UserStorage.java | 8 -- .../filmorate/controller/FilmTest.java | 4 +- .../filmorate/controller/UserTest.java | 2 - 10 files changed, 91 insertions(+), 100 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java index 4ac580f..b66662b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -1,8 +1,8 @@ package ru.yandex.practicum.filmorate.controller; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.service.FilmService; @@ -13,11 +13,11 @@ @Slf4j @RestController +@RequiredArgsConstructor @RequestMapping("/films") public class FilmController { - @Autowired - private FilmService filmService; + private final FilmService filmService; @GetMapping public Collection getAll() { diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index e5ea3c9..7111058 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -1,8 +1,8 @@ package ru.yandex.practicum.filmorate.controller; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; @@ -14,10 +14,10 @@ @Slf4j @RestController @RequestMapping("/users") +@RequiredArgsConstructor public class UserController { - @Autowired - private UserService userService; + private final UserService userService; @GetMapping public Collection getAll() { diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index b7482c1..5faf8a5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -1,7 +1,6 @@ package ru.yandex.practicum.filmorate.service; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; @@ -15,10 +14,7 @@ @Service public class FilmService { - @Autowired - private InMemoryFilmStorage inMemoryFilmStorage; - @Autowired - private InMemoryUserStorage inMemoryUserStorage; + private final InMemoryFilmStorage inMemoryFilmStorage; public Collection getAll() { return inMemoryFilmStorage.getAll(); @@ -33,12 +29,10 @@ public Film update(Film filmUpdate) { } public Map> addLike(int filmId, int userId) { - inMemoryUserStorage.validateUserId(userId); return inMemoryFilmStorage.addLike(filmId, userId); } public void removeLike(int filmId, int userId) { - inMemoryUserStorage.validateUserId(userId); inMemoryFilmStorage.removeLike(filmId, userId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index e6aad6a..b6a5d6c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -1,7 +1,6 @@ package ru.yandex.practicum.filmorate.service; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; @@ -14,8 +13,7 @@ @Service public class UserService { - @Autowired - private InMemoryUserStorage inMemoryUserStorage; + private final InMemoryUserStorage inMemoryUserStorage; public Collection getAll() { return inMemoryUserStorage.getAll(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java index 6ab9fd4..9bca9ca 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java @@ -22,12 +22,4 @@ public interface FilmStorage { Collection getFilmsByLike(Integer sizeFilms); - void validateFilmId(Integer id); - - boolean checkFilmsLikes(int id); - - void validateReleaseDate(Film film); - - Integer validateUpdate(Film film); - } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java index c61d9a6..d823092 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -6,6 +6,7 @@ import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.time.LocalDate; import java.util.*; @@ -15,8 +16,11 @@ @Component public class InMemoryFilmStorage implements FilmStorage { + private final InMemoryUserStorage inMemoryUserStorage; + private final Map films = new HashMap<>(); private final Map> filmsLikes = new HashMap<>(); + LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); private int id = 1; @@ -27,7 +31,7 @@ public int getNextId() { @Override public Collection getAll() { - log.debug("GET, all films"); + log.info("GET, all films"); return films.values(); } @@ -39,7 +43,7 @@ public Film getFilmById(int id) { @Override public Film create(Film film) { - log.debug("POST, create film {}", film); + log.info("POST, create film {}", film); validateReleaseDate(film); film.setId(getNextId()); films.put(film.getId(), film); @@ -48,27 +52,36 @@ public Film create(Film film) { @Override public Film update(Film filmUpdate) { - log.debug("PUT, update film {}", filmUpdate); + log.info("PUT, update film {}", filmUpdate); Integer id = validateUpdate(filmUpdate); Film oldFilm = films.get(id); String newName = filmUpdate.getName(); - if (!newName.equals(oldFilm.getName())) oldFilm.setName(newName); + if (!newName.equals(oldFilm.getName())) { + oldFilm.setName(newName); + } if (filmUpdate.getDescription() != null) { String newDescription = filmUpdate.getDescription(); - if (!newDescription.equals(oldFilm.getDescription())) oldFilm.setDescription(newDescription); + if (!newDescription.equals(oldFilm.getDescription())) { + oldFilm.setDescription(newDescription); + } } LocalDate newReleaseDate = filmUpdate.getReleaseDate(); - if (!newReleaseDate.equals(oldFilm.getReleaseDate())) oldFilm.setReleaseDate(newReleaseDate); + if (!newReleaseDate.equals(oldFilm.getReleaseDate())) { + oldFilm.setReleaseDate(newReleaseDate); + } if (filmUpdate.getDuration() != null) { Integer newDuration = filmUpdate.getDuration(); - if (!newDuration.equals(oldFilm.getDuration())) oldFilm.setDuration(newDuration); + if (!newDuration.equals(oldFilm.getDuration())) { + oldFilm.setDuration(newDuration); + } } return oldFilm; } @Override public Map> addLike(int filmId, int userId) { + inMemoryUserStorage.validateUserId(userId); validateFilmId(filmId); if (checkFilmsLikes(filmId)) { @@ -91,6 +104,7 @@ public Map> addLike(int filmId, int userId) { @Override public void removeLike(Integer filmId, Integer userId) { + inMemoryUserStorage.validateUserId(userId); validateFilmId(filmId); if (checkFilmsLikes(filmId)) { @@ -111,7 +125,9 @@ public Collection getFilmsByLike(Integer sizeFilms) { if (filmsLikes.isEmpty()) { for (Film film : films.values()) { - if (returnFilms.size() == sizeFilms) break; + if (returnFilms.size() == sizeFilms) { + break; + } returnFilms.add(film); } return returnFilms; @@ -123,11 +139,15 @@ public Collection getFilmsByLike(Integer sizeFilms) { sortedFilmByLike = sortedFilmByLike.reversed(); for (Film film : sortedFilmByLike) { - if (returnFilms.size() == sizeFilms) break; + if (returnFilms.size() == sizeFilms) { + break; + } returnFilms.add(film); } - if (returnFilms.size() == sortedFilmByLike.size()) return returnFilms; + if (returnFilms.size() == sortedFilmByLike.size()) { + return returnFilms; + } for (Film film : films.values()) { if (returnFilms.size() == sizeFilms) break; @@ -136,21 +156,21 @@ public Collection getFilmsByLike(Integer sizeFilms) { return returnFilms; } - @Override - public void validateFilmId(Integer id) { - if (!films.containsKey(id)) throw new NotFoundException("Фильм с id: " + id + " не найден"); + private void validateFilmId(Integer id) { + if (!films.containsKey(id)) { + throw new NotFoundException("Фильм с id: " + id + " не найден"); + } } - @Override - public boolean checkFilmsLikes(int id) { + + private boolean checkFilmsLikes(int id) { return filmsLikes.containsKey(id); } private void addLikeFilm(int filmId) { Film film = films.get(filmId); - int like = film.getLikes() + 1; - film.setLikes(like); + film.setLikes(film.getLikes() + 1); films.put(filmId, film); } @@ -164,11 +184,8 @@ private void removeLikeFilm(int filmId) { } } - - @Override - public void validateReleaseDate(Film film) { - log.debug("validateReleaseDate start for {}", film); - LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); + private void validateReleaseDate(Film film) { + log.info("validateReleaseDate start for {}", film); if (film.getReleaseDate().isBefore(birthdayFilm)) { String msg = "дата релиза — не раньше 28 декабря 1895 года"; log.error(msg); @@ -177,9 +194,8 @@ public void validateReleaseDate(Film film) { } - @Override - public Integer validateUpdate(Film film) { - log.debug("validateUpdate start for {}", film); + private Integer validateUpdate(Film film) { + log.info("validateUpdate start for {}", film); String newName = film.getName(); if (film.getId() == null) { String msg = "Id должен быть указан"; diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index 3106eb1..3612e1e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -25,7 +25,7 @@ public int getNextId() { @Override public Collection getAll() { - log.debug("GET, all users"); + log.info("GET, all users"); return users.values(); } @@ -38,7 +38,7 @@ public User getUserById(int id) { @Override public User create(User user) { - log.debug("POST, create user {}", user); + log.info("POST, create user {}", user); cloneSearchEmail(user); user.setId(getNextId()); checkOrAddUserName(user); @@ -48,15 +48,22 @@ public User create(User user) { @Override public User update(User newUser) { - log.debug("PUT, update User {}", newUser); + log.info("PUT, update User {}", newUser); Integer id = validateUpdate(newUser); User oldUser = users.get(id); String newEmail = newUser.getEmail(); String newLogin = newUser.getLogin(); oldUser.setName(newUser.getName()); - if (newUser.getBirthday() != null) oldUser.setBirthday(newUser.getBirthday()); - if (!oldUser.getEmail().equals(newEmail)) oldUser.setEmail(newEmail); - if (!oldUser.getLogin().equals(newLogin)) oldUser.setLogin(newLogin); + + if (newUser.getBirthday() != null) { + oldUser.setBirthday(newUser.getBirthday()); + } + if (!oldUser.getEmail().equals(newEmail)) { + oldUser.setEmail(newEmail); + } + if (!oldUser.getLogin().equals(newLogin)) { + oldUser.setLogin(newLogin); + } return oldUser; } @@ -66,9 +73,7 @@ public Map> addToFriend(int userId, int friendsId) { validateUserId(friendsId); if (checkUserFriends(userId)) { - Set friendsIds = userFriends.get(userId); - friendsIds.add(friendsId); - userFriends.put(userId, friendsIds); + userFriends.get(userId).add(friendsId); } else { Set friendsIds = new HashSet<>(); friendsIds.add(friendsId); @@ -76,9 +81,7 @@ public Map> addToFriend(int userId, int friendsId) { } if (checkUserFriends(friendsId)) { - Set friendsIds = userFriends.get(friendsId); - friendsIds.add(userId); - userFriends.put(friendsId, friendsIds); + userFriends.get(friendsId).add(userId); } else { Set friendsIds = new HashSet<>(); friendsIds.add(userId); @@ -94,22 +97,20 @@ public void removeFriend(int userId, int friendsId) { validateUserId(friendsId); if (checkUserFriends(userId)) { - Set friendsIds = userFriends.get(userId); - friendsIds.remove(friendsId); - if (friendsIds.isEmpty()) { + Set friendsIds1 = userFriends.get(userId); + friendsIds1.remove(friendsId); + if (friendsIds1.isEmpty()) { userFriends.remove(userId); } else { - userFriends.put(userId, friendsIds); + userFriends.put(userId, friendsIds1); } - } - if (checkUserFriends(friendsId)) { - Set friendsIds = userFriends.get(friendsId); - friendsIds.remove(userId); - if (friendsIds.isEmpty()) { + Set friendsIds2 = userFriends.get(friendsId); + friendsIds2.remove(userId); + if (friendsIds2.isEmpty()) { userFriends.remove(friendsId); } else { - userFriends.put(friendsId, friendsIds); + userFriends.put(friendsId, friendsIds2); } } } @@ -134,31 +135,30 @@ public Collection getMutualFriends(int userId, int friendsId) { validateUserId(userId); validateUserId(friendsId); - Set user1FriendsId = userFriends.get(userId); - Set user2FriendsId = userFriends.get(friendsId); - List mutualFriends = new ArrayList<>(); + List mutualId = new ArrayList<>(userFriends.get(userId)); + mutualId.retainAll(userFriends.get(friendsId)); - for (int id1 : user1FriendsId) { - for (int id2 : user2FriendsId) { - if (id1 == id2) mutualFriends.add(users.get(id1)); - } + List mutualFriends = new ArrayList<>(); + for (Integer id : mutualId) { + mutualFriends.add(users.get(id)); } return mutualFriends; } @Override public void validateUserId(int id) { - if (!users.containsKey(id)) throw new NotFoundException("Пользователь с id: " + id + " не найден"); + if (!users.containsKey(id)) { + throw new NotFoundException("Пользователь с id: " + id + " не найден"); + } } - @Override - public boolean checkUserFriends(int id) { + private boolean checkUserFriends(int id) { return userFriends.containsKey(id); } - @Override - public void cloneSearchEmail(User user) { - log.debug("cloneSearchEmail start for {}", user); + + private void cloneSearchEmail(User user) { + log.info("cloneSearchEmail start for {}", user); String newEmail = user.getEmail(); for (User userMap : users.values()) { if (userMap.getEmail().equals(newEmail)) { @@ -169,16 +169,15 @@ public void cloneSearchEmail(User user) { } } - @Override - public void checkOrAddUserName(User user) { + + private void checkOrAddUserName(User user) { if (user.getName() == null) { user.setName(user.getLogin()); } } - @Override - public Integer validateUpdate(User newUser) { - log.debug("validateUpdate start for {}", newUser); + private Integer validateUpdate(User newUser) { + log.info("validateUpdate start for {}", newUser); checkOrAddUserName(newUser); String newEmail = newUser.getEmail(); if (newUser.getId() == null) { diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java index 872ca0a..cc4c3e9 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java @@ -25,12 +25,4 @@ public interface UserStorage { Collection getMutualFriends(int userId, int friendsId); void validateUserId(int id); - - boolean checkUserFriends(int id); - - void cloneSearchEmail(User user); - - void checkOrAddUserName(User user); - - Integer validateUpdate(User newUser); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java index 997cd4c..2785f5a 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmTest.java @@ -9,6 +9,7 @@ import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; +import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.time.LocalDate; import java.util.Set; @@ -28,7 +29,8 @@ public class FilmTest { @BeforeEach public void setUp() { - inMemoryFilmStorage = new InMemoryFilmStorage(); + InMemoryUserStorage inMemoryUserStorage = new InMemoryUserStorage(); + inMemoryFilmStorage = new InMemoryFilmStorage(inMemoryUserStorage); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java index a67b37c..49f4f6d 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/controller/UserTest.java @@ -6,7 +6,6 @@ import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; @@ -25,7 +24,6 @@ public class UserTest { validator = validatorFactory.usingContext().getValidator(); } - @Autowired private InMemoryUserStorage inMemoryUserStorage; @BeforeEach From b153fe70ff5f298077fd56d937bd4d842458bf8c Mon Sep 17 00:00:00 2001 From: Just Roma Date: Sat, 25 Jan 2025 20:36:39 +0500 Subject: [PATCH 6/7] Sprint 11 final 2 editor --- .../java/ru/yandex/practicum/filmorate/service/FilmService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index 5faf8a5..2c49ed0 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -4,7 +4,6 @@ import org.springframework.stereotype.Service; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; -import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; import java.util.Collection; import java.util.Map; From bb6647742b118354b3012aeaade501999379886c Mon Sep 17 00:00:00 2001 From: Just Roma Date: Sun, 26 Jan 2025 17:08:06 +0500 Subject: [PATCH 7/7] Sprint 11 final 3 editor --- .../storage/film/InMemoryFilmStorage.java | 46 +++---------------- .../storage/user/InMemoryUserStorage.java | 4 -- 2 files changed, 6 insertions(+), 44 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java index d823092..d02895f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java @@ -10,6 +10,7 @@ import java.time.LocalDate; import java.util.*; +import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @@ -20,7 +21,7 @@ public class InMemoryFilmStorage implements FilmStorage { private final Map films = new HashMap<>(); private final Map> filmsLikes = new HashMap<>(); - LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); + private final LocalDate birthdayFilm = LocalDate.of(1895, 12, 28); private int id = 1; @@ -90,7 +91,6 @@ public Map> addLike(int filmId, int userId) { if (likes.add(userId)) { addLikeFilm(filmId); } - filmsLikes.put(filmId, likes); } else { addLikeFilm(filmId); @@ -113,47 +113,17 @@ public void removeLike(Integer filmId, Integer userId) { removeLikeFilm(filmId); if (likes.isEmpty()) { filmsLikes.remove(filmId); - } else { - filmsLikes.put(filmId, likes); } } } @Override public Collection getFilmsByLike(Integer sizeFilms) { - List returnFilms = new ArrayList<>(); - - if (filmsLikes.isEmpty()) { - for (Film film : films.values()) { - if (returnFilms.size() == sizeFilms) { - break; - } - returnFilms.add(film); - } - return returnFilms; - } - List sortedFilmByLike = films.values() + return films.values() .stream() - .sorted(Comparator.comparingInt(Film::getLikes)) - .toList(); - sortedFilmByLike = sortedFilmByLike.reversed(); - - for (Film film : sortedFilmByLike) { - if (returnFilms.size() == sizeFilms) { - break; - } - returnFilms.add(film); - } - - if (returnFilms.size() == sortedFilmByLike.size()) { - return returnFilms; - } - - for (Film film : films.values()) { - if (returnFilms.size() == sizeFilms) break; - returnFilms.add(film); - } - return returnFilms; + .sorted(Comparator.comparing(Film::getLikes).reversed()) + .limit(sizeFilms) + .collect(Collectors.toList()); } private void validateFilmId(Integer id) { @@ -169,9 +139,7 @@ private boolean checkFilmsLikes(int id) { private void addLikeFilm(int filmId) { Film film = films.get(filmId); - film.setLikes(film.getLikes() + 1); - films.put(filmId, film); } private void removeLikeFilm(int filmId) { @@ -180,7 +148,6 @@ private void removeLikeFilm(int filmId) { if (like != 0) { film.setLikes(like - 1); - films.put(filmId, film); } } @@ -196,7 +163,6 @@ private void validateReleaseDate(Film film) { private Integer validateUpdate(Film film) { log.info("validateUpdate start for {}", film); - String newName = film.getName(); if (film.getId() == null) { String msg = "Id должен быть указан"; log.error(msg); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index 3612e1e..a91fc77 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -101,16 +101,12 @@ public void removeFriend(int userId, int friendsId) { friendsIds1.remove(friendsId); if (friendsIds1.isEmpty()) { userFriends.remove(userId); - } else { - userFriends.put(userId, friendsIds1); } Set friendsIds2 = userFriends.get(friendsId); friendsIds2.remove(userId); if (friendsIds2.isEmpty()) { userFriends.remove(friendsId); - } else { - userFriends.put(friendsId, friendsIds2); } } }