From 974eae13329ed88e8967719afbfe41ef6d9095cc Mon Sep 17 00:00:00 2001 From: Evstafev Date: Fri, 25 Apr 2025 11:30:20 +0700 Subject: [PATCH 1/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../filmorate/controller/FilmController.java | 95 +++++++------- .../filmorate/controller/UserController.java | 120 ++++++++++-------- .../controller/ValidateController.java | 3 + .../filmorate/exception/ErrorHandler.java | 58 ++++++--- .../filmorate/exception/ErrorIsNull.java | 9 ++ .../filmorate/exception/ErrorResponse.java | 15 +++ .../exception/ValidationErrorResponse.java | 2 +- .../filmorate/exception/Violation.java | 13 -- .../practicum/filmorate/model/DataModel.java | 11 ++ .../practicum/filmorate/model/Film.java | 14 +- .../practicum/filmorate/model/User.java | 11 +- .../filmorate/service/FilmService.java | 107 ++++++++++++++++ .../filmorate/service/UserService.java | 106 ++++++++++++++++ .../filmorate/storage/FilmStorage.java | 28 ++++ .../storage/InMemoryFilmStorage.java | 66 ++++++++++ .../storage/InMemoryUserStorage.java | 76 +++++++++++ .../practicum/filmorate/storage/Storage.java | 38 ++++++ .../filmorate/storage/UserStorage.java | 26 ++++ src/main/resources/application.yaml | 5 + .../filmorate/FilmControllerTest.java | 4 +- 21 files changed, 681 insertions(+), 131 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/Violation.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/FilmService.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/FilmStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java create mode 100644 src/main/resources/application.yaml diff --git a/pom.xml b/pom.xml index d9cee64..2e002aa 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,11 @@ 3.3.3 test + + org.zalando + logbook-spring-boot-starter + 3.7.2 + 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 f8170bd..cb47831 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -1,72 +1,79 @@ package ru.yandex.practicum.filmorate.controller; import jakarta.validation.Valid; -import jakarta.validation.ValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.service.FilmService; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; + @RestController @RequestMapping("/films") public class FilmController { - private final ValidateController validateController = new ValidateController(); - private final Map films = new HashMap<>(); - private final Logger log = LoggerFactory.getLogger(FilmController.class); + private final Logger logger = LoggerFactory.getLogger(FilmController.class); + FilmService filmService; + + @Autowired + public FilmController(FilmService filmService) { + this.filmService = filmService; + } + + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public Film getFilmId(@RequestBody @PathVariable long id) { + logger.info("вывод пользователя по ID"); + return filmService.getFilmId(id); + } @GetMapping - public ResponseEntity> filmAll() { - log.info("вывод списка фильмов"); - return ResponseEntity.ok(films.values()); + @ResponseStatus(HttpStatus.OK) + public Collection getFilmAll() { + logger.info("вывод списка фильмов"); + return filmService.getAll(); } @PostMapping - public ResponseEntity create(@Valid @RequestBody Film film) { - validateController.validateFilm(film); - film.setId(getNextId()); - films.put(film.getId(), film); - log.info("фильм добавлен id: " + film.getId()); - return ResponseEntity.status(HttpStatus.CREATED).body(film); + @ResponseStatus(HttpStatus.CREATED) + public Film create(@Valid @RequestBody Film film) { + logger.info("Фильм добавлен"); + return filmService.create(film); + } + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public void delete(@RequestBody @PathVariable long id) { + logger.info("Удаление id=" + id); + filmService.delete(id); } @PutMapping - public ResponseEntity update(@Valid @RequestBody Film newFilm) { - if (newFilm.getId() == null) { - log.warn("ID пустой"); - throw new ValidationException("пользователь с таким ID не найден"); - // изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman - // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ID пустой"); - } - if (!films.containsKey(newFilm.getId())) { - log.warn("пользователь с таким ID не найден"); - // изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman - // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("пользователь с таким ID не найден"); - throw new ValidationException("пользователь с таким ID не найден"); - } - validateController.validateFilm(newFilm); - Film oldFilm = films.get(newFilm.getId()); - oldFilm.setName(newFilm.getName()); - oldFilm.setDescription(newFilm.getDescription()); - oldFilm.setReleaseDate(newFilm.getReleaseDate()); - oldFilm.setDuration(newFilm.getDuration()); - log.info("запись фильма обновлена"); - return ResponseEntity.ok(oldFilm); + @ResponseStatus(HttpStatus.OK) + public Film update(@RequestBody Film newFilm) { + logger.info("запись фильма обновлена"); + return filmService.update(newFilm); } - private long getNextId() { - long currentMaxId = films.keySet() - .stream() - .mapToLong(id -> id) - .max() - .orElse(0); - return ++currentMaxId; + @PutMapping("/{id}/like/{userId}") + @ResponseStatus(HttpStatus.OK) + public Collection likeAdd(@RequestBody @PathVariable long id, @PathVariable long userId) { + return filmService.likeAdd(id, userId); + } + + @DeleteMapping("/{id}/like/{userId}") + @ResponseStatus(HttpStatus.OK) + public Collection LikeDelete(@RequestBody @PathVariable long id, @PathVariable long userId) { + return filmService.likeDelete(id, userId); + } + @GetMapping("/popular") + @ResponseStatus(HttpStatus.OK) + public Collection getPopular(@RequestBody @RequestParam (defaultValue = "10") int count){ + return filmService.getPopular(count); } } 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 8b30820..daf6468 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -2,80 +2,96 @@ import jakarta.validation.Valid; -import jakarta.validation.ValidationException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; + import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.service.UserService; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; + @RestController @RequestMapping("/users") public class UserController { - private final ValidateController validate = new ValidateController(); - private final Map users = new HashMap<>(); + private final UserService userService; + + private final Logger logger = LoggerFactory.getLogger(UserController.class); + + @Autowired + public UserController(UserService userService) { + this.userService = userService; + } + + - private final Logger log = LoggerFactory.getLogger(UserController.class); + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public User getUserId(@PathVariable @RequestBody long id){ + logger.info("вывод пользователя по ID"); + return userService.getUserId(id); + } + + @GetMapping + @ResponseStatus(HttpStatus.OK) + public Collection userAll() { + logger.info("вывод списка пользователей"); + return userService.getAll(); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public User create(@Valid @RequestBody User user) { + logger.info("Пользователь добавлен"); + return userService.create(user); + } - @GetMapping //запрос всех пользователей - public ResponseEntity> usersAll() { + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public void delete(@RequestBody @PathVariable long id) { + logger.info("Удаление id=" + id); + userService.delete(id); + } - log.info("вывод списка пользователей"); - return ResponseEntity.ok(users.values()); + @PutMapping + @ResponseStatus(HttpStatus.OK) + public User update(@RequestBody User newUser) { + logger.info("запись пользователя обновлена"); + return userService.update(newUser); } - @PostMapping //добавление нового пользователя - public ResponseEntity create(@Valid @RequestBody User user) { - validate.validateUser(user); - - if (users.containsValue(user)) { - log.warn("ошибка добавления пользователя, такой пользователь уже есть"); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ошибка добавления пользователя, такой пользователь уже есть"); - } - user.setId(getNextId()); - users.put(user.getId(), user); - log.info("пользователь создан id: " + user.getId()); - return ResponseEntity.status(HttpStatus.CREATED).body(user); //отрпавляем ответ с статусом и телом + @PutMapping ("/{id}/friends/{friendsId}") + @ResponseStatus(HttpStatus.OK) + public Collection friendsAdd(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + logger.info("добавили в друзья"); + return userService.friendsAdd (id, friendsId); } - @PutMapping //обновление пользователя - public ResponseEntity update(@Valid @RequestBody User newUser) { - if (newUser.getId() == null) { - log.warn("ID пустой"); - throw new ValidationException(" ID пустой"); - // изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman - // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ID пустой"); - } - if (!users.containsKey(newUser.getId())) { - log.warn("пользователь с таким ID не найден"); - throw new ValidationException("пользователь с таким ID не найден"); - // изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman - // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("пользователь с таким ID не найден"); - } - validate.validateUser(newUser); - User oldUser = users.get(newUser.getId()); - oldUser.setEmail(newUser.getEmail()); - oldUser.setLogin(newUser.getLogin()); - oldUser.setBirthday(newUser.getBirthday()); - oldUser.setName(newUser.getName()); - log.info("пользователь изменен"); - return ResponseEntity.ok(oldUser); + @DeleteMapping ("/{id}/friends/{friendsId}") + @ResponseStatus(HttpStatus.OK) + public Collection friendsDelete(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + logger.info("удалили из друзей"); + return userService.friendsDelete (id, friendsId); } - private long getNextId() { - long currentMaxId = users.keySet() - .stream() - .mapToLong(id -> id) - .max() - .orElse(0); - return ++currentMaxId; + @GetMapping("/{id}/friends") + @ResponseStatus(HttpStatus.OK) + public Collection friendsGetList (@RequestBody @PathVariable long id){ + logger.info("показывает список друзей"); + return userService.friendsGetList(id); + } + @GetMapping("/{id}/friends/common/{otherId}") + @ResponseStatus(HttpStatus.OK) + public Collection friendsGetCommonList (@PathVariable long id, @PathVariable long otherId){ + logger.info("показывает список друзей"); + return userService.friendsGetCommonList(id, otherId); } + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java index 2f427cc..b6f8f98 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java @@ -2,6 +2,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; import ru.yandex.practicum.filmorate.exception.ValidationException; import ru.yandex.practicum.filmorate.exception.ValidationNullException; import ru.yandex.practicum.filmorate.model.Film; @@ -9,10 +10,12 @@ import java.time.LocalDate; +@Component public class ValidateController { private final Logger log = LoggerFactory.getLogger(ValidateController.class); + public void validateFilm(Film film) { final LocalDate FILM_DATE = LocalDate.of(1895, 12, 28); diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java index 2503b8f..2516b62 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java @@ -1,38 +1,63 @@ package ru.yandex.practicum.filmorate.exception; + import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.List; import java.util.stream.Collectors; -/// взято с просторов интернета вывод сообщений при ошибки -@ControllerAdvice +@RestControllerAdvice public class ErrorHandler { + private final Logger logger = LoggerFactory.getLogger(ErrorHandler.class); + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) +public ErrorResponse handlerIsNull (final ErrorIsNull e){ + logger.warn(e.getMessage()); + return new ErrorResponse("error",e.getMessage()); +} + + @ExceptionHandler + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ErrorResponse handleThrowbla (final Throwable e){ + logger.warn(e.getMessage()); + return new ErrorResponse("error", "Произошла непредвиденная ошибка.") ; + } - private final Logger log = LoggerFactory.getLogger(ErrorHandler.class); + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handlerValidationException(final ValidationException e) { + logger.warn(e.getMessage()); + return new ErrorResponse("error", e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handlerValidationNullException(final ValidationNullException e) { + logger.warn(e.getMessage()); + return new ErrorResponse("error", e.getMessage()); + } - @ResponseBody @ExceptionHandler(ConstraintViolationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ValidationErrorResponse onConstraintValidationException( ConstraintViolationException e ) { - final List violations = e.getConstraintViolations().stream() + final List violations = e.getConstraintViolations().stream() .map( - violation -> new Violation( - violation.getPropertyPath().toString(), - violation.getMessage() + error -> new ErrorResponse( + error.getPropertyPath().toString(), + error.getMessage() ) ) - .peek(violation -> log.warn(violation.getMessage())) + .peek(error -> logger.warn(error.getDescription())) .collect(Collectors.toList()); return new ValidationErrorResponse(violations); @@ -40,14 +65,15 @@ public ValidationErrorResponse onConstraintValidationException( @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) - @ResponseBody public ValidationErrorResponse onMethodArgumentNotValidException( MethodArgumentNotValidException e ) { - final List violations = e.getBindingResult().getFieldErrors().stream() - .map(error -> new Violation(error.getField(), error.getDefaultMessage())) - .peek(error -> log.warn(error.getFieldName() + " = " + error.getMessage())) + final List violations = e.getBindingResult().getFieldErrors().stream() + .map(error -> new ErrorResponse(error.getField(), error.getDefaultMessage())) + .peek(error -> logger.warn(error.getError() + " = " + error.getDescription())) .collect(Collectors.toList()); return new ValidationErrorResponse(violations); } -} \ No newline at end of file +} + + diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java new file mode 100644 index 0000000..1f5ba7d --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.filmorate.exception; + +public class ErrorIsNull extends NullPointerException { + + public ErrorIsNull(String message){ + super(message); + } + +} 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..2973fe2 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java @@ -0,0 +1,15 @@ +package ru.yandex.practicum.filmorate.exception; + +import lombok.Getter; + +public class ErrorResponse { + @Getter + String error; + @Getter + String description; + +public ErrorResponse (String error, String description){ + this.error=error; + this.description=description; +} +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java index 81443f2..1f20830 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java @@ -9,7 +9,7 @@ @Getter @RequiredArgsConstructor public class ValidationErrorResponse { - private final List violations; + private final List violations; } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/Violation.java b/src/main/java/ru/yandex/practicum/filmorate/exception/Violation.java deleted file mode 100644 index 3455b04..0000000 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/Violation.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.yandex.practicum.filmorate.exception; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -// взято с просторов интернета вывод сообщений при ошибки - -@Getter -@RequiredArgsConstructor -public class Violation { - private final String fieldName; - private final String message; - -} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java new file mode 100644 index 0000000..1f3102c --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java @@ -0,0 +1,11 @@ +package ru.yandex.practicum.filmorate.model; + + +import java.util.Set; + +public class DataModel { + private Long id; + + private String name; + + } 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 63c7732..7aca27b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -5,6 +5,7 @@ import lombok.*; import java.time.LocalDate; +import java.util.Set; /** * Film. @@ -13,7 +14,7 @@ @Setter @ToString @AllArgsConstructor -public class Film { +public class Film extends DataModel implements Comparable { private Long id; @@ -32,4 +33,15 @@ public class Film { @Positive(message = "неверное значение") @Min(1) private int duration; + + + private Set likesId; + + @Override + public int compareTo(Film o) { + if (o.getLikesId()==null){ + return 0; + } + return (int)(o.getLikesId().size()-this.getLikesId().size()); + } } \ No newline at end of file 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 4ffa7ed..5ee2462 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -5,13 +5,15 @@ import lombok.*; import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; @Setter @Getter @ToString @AllArgsConstructor -@EqualsAndHashCode(exclude = {"id", "name", "birthday"}) -public class User { +@EqualsAndHashCode(exclude = {"id", "name", "birthday"}, callSuper = false) +public class User extends DataModel { private Long id; @@ -29,4 +31,7 @@ public class User { @Past(message = "дата из будущего") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate birthday; -} + + private Set friendsId ; + + } 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..074e3ae --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -0,0 +1,107 @@ +package ru.yandex.practicum.filmorate.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.stereotype.Service; +import ru.yandex.practicum.filmorate.controller.ValidateController; +import ru.yandex.practicum.filmorate.exception.ErrorIsNull; +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.storage.FilmStorage; +import ru.yandex.practicum.filmorate.storage.InMemoryFilmStorage; +import ru.yandex.practicum.filmorate.storage.UserStorage; + +import java.util.Collection; +import java.util.Comparator; +import java.util.stream.Collectors; + +@Service +public class FilmService { + + private final FilmStorage filmStorage; + + private final UserStorage userStorage; + private final ValidateController validateController; + private final Logger logger = LoggerFactory.getLogger(FilmService.class); + + @Autowired + public FilmService(FilmStorage filmStorage, UserStorage userStorage, ValidateController validateController) { + this.filmStorage = filmStorage; + this.userStorage=userStorage; + this.validateController=validateController; + + } + + public Film create(Film film) { + validateController.validateFilm(film); + Film returnFilm = filmStorage.create(film); + logger.info("Фильм добавлен id: " + returnFilm.getId()); + return returnFilm; + } + + public Film getFilmId (long id){ + Film getFilm = filmStorage.getId(id); + if (getFilm==null){ + throw new ErrorIsNull("нет такого id"); + } + logger.info("поиск по id="+id); + return getFilm; + } + + public Collection getAll(){ + logger.info("Вернули список"); + Collection returnAll = filmStorage.getAll(); + if (returnAll.isEmpty()){ + throw new ErrorIsNull("список пуст"); + } + return returnAll; + } + + public void delete(long id){ + Film delFilm= filmStorage.delete(id); + if (delFilm==null) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("удаление id="+id); + } + + public Film update (Film newFilm){ + + if (newFilm.getId() == null) { + logger.warn("ID пустой"); + throw new ValidationException("ID фильма пустой"); + } + Film oldFilm = filmStorage.getId(newFilm.getId()); + + if (oldFilm==null) { + logger.warn("фильм с таким ID не найден"); + throw new ErrorIsNull("фильм с таким ID не найден"); + } + validateController.validateFilm(newFilm); + logger.info("запись фильма обновлена"); + return filmStorage.update(newFilm); + } + + public Collection likeAdd (long id, long userId){ + getFilmId(id); + userStorage.getId(userId); + + return filmStorage.setLikeId(id, userId); + } + + public Collection likeDelete (long id, long userId){ + getFilmId(id); + return filmStorage.delLikesId(id, userId); + } + +public Collection getPopular (int count){ + + return getAll().stream() + .sorted(Film::compareTo) + .limit(count) + .collect(Collectors.toList()); +} +} 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..38fba84 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -0,0 +1,106 @@ +package ru.yandex.practicum.filmorate.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.yandex.practicum.filmorate.controller.ValidateController; +import ru.yandex.practicum.filmorate.exception.ErrorIsNull; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.User; +import ru.yandex.practicum.filmorate.storage.UserStorage; + +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class UserService { + + private final UserStorage userStorage; + private final ValidateController validateController; + private final Logger logger = LoggerFactory.getLogger(FilmService.class); + + @Autowired + public UserService(UserStorage userStorage, ValidateController validateController) { + this.userStorage = userStorage; + this.validateController = validateController; + } + + public Collection friendsAdd(long id, long friendsId) { + getUserId(id); + getUserId(friendsId); + return userStorage.setFriendsId(id, friendsId); + + } + + public Collection friendsDelete(long id, long friendsId) { + getUserId(id); + getUserId(friendsId); + return userStorage.delFriendsId(id, friendsId); + } + + public Collection friendsGetList(long id) { + getUserId(id); + return userStorage.getFriendsId(id); + } + + public User create(User user) { + validateController.validateUser(user); + User returnUser = userStorage.create(user); + logger.info("пользователь добавлен id: " + returnUser.getId()); + return returnUser; + } + + + + public Collection getAll() { + logger.info("Вернули список"); + Collection returnAll = userStorage.getAll(); + if (returnAll.isEmpty()) { + throw new ErrorIsNull("список пуст"); + } + return returnAll; + } + + public User getUserId(long id) { + User getUser = userStorage.getId(id); + if (getUser == null) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("поиск по id=" + id); + return getUser; + } + + public void delete(long id) { + User delUser = userStorage.delete(id); + if (delUser == null) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("удаление id=" + id); + } + + public User update(User newUser) { + + if (newUser.getId() == null) { + logger.warn("ID пустой"); + throw new ValidationException("ID пользователя пустой"); + } + User oldUser = userStorage.getId(newUser.getId()); + + if (oldUser == null) { + logger.warn("пользователь с таким ID не найден"); + throw new ErrorIsNull("пользователь с таким ID не найден"); + } + validateController.validateUser(newUser); + logger.info("запись пользователя обновлена"); + return userStorage.update(newUser); + } + + public Collection friendsGetCommonList(long id, long otherId){ + Collection userList1 = friendsGetList(id); + Collection userList2 = friendsGetList(otherId); + + return userList1.stream().filter(userList2::contains).collect(Collectors.toList()); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java new file mode 100644 index 0000000..0374dec --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java @@ -0,0 +1,28 @@ +package ru.yandex.practicum.filmorate.storage; + +import ru.yandex.practicum.filmorate.model.DataModel; +import ru.yandex.practicum.filmorate.model.Film; + + +import java.util.Collection; + + +public interface FilmStorage { + + + T create (T data); + + T update (T data); + + T delete(long id); + + T getId (long id); + Collection getAll (); + + Collection getLikeId(long id); + + Collection setLikeId(long id, long userId); + + Collection delLikesId(long id, long userId); + + } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java new file mode 100644 index 0000000..6ce82c5 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java @@ -0,0 +1,66 @@ +package ru.yandex.practicum.filmorate.storage; + +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Film; + +import java.util.Collection; +import java.util.Set; + +@Component +public class InMemoryFilmStorage extends Storage implements FilmStorage { + + + + + public Film create(Film film) { + film.setId(getNextId()); + + dataMap.put(film.getId(), film); + logger.info("Фильм добавлен id: " + film.getId()); + return film; + } + + + public Film update(Film newFilm) { + Film oldFilm = dataMap.get(newFilm.getId()); + oldFilm.setName(newFilm.getName()); + oldFilm.setDescription(newFilm.getDescription()); + oldFilm.setReleaseDate(newFilm.getReleaseDate()); + oldFilm.setDuration(newFilm.getDuration()); + // if (!newFilm.getLikesId().isEmpty()){ + oldFilm.setLikesId(newFilm.getLikesId()); + logger.info("Запись фильма обновлена"); + return oldFilm; + } + + public Collection getLikeId(long id){ + Film getLikes = dataMap.get(id); + return getLikes.getLikesId(); + } + + public Collection setLikeId(long id, long userId) { + Film getLikes = dataMap.get(id); + getLikes.getLikesId().add(userId); + // newLikesList.add(userId); + // getLikes.setLikesId(newLikesList); + return getLikes.getLikesId(); + } + + public Collection delLikesId(long id, long userId){ + Film getLikes = dataMap.get(id); + Set newLikesList = getLikes.getLikesId(); + newLikesList.remove(id); + getLikes.setLikesId(newLikesList); + return newLikesList; + } + + private long getNextId() { + long currentMaxId = dataMap.keySet() + .stream() + .mapToLong(id -> id) + .max() + .orElse(0); + return ++currentMaxId; + + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java new file mode 100644 index 0000000..3db9d82 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -0,0 +1,76 @@ +package ru.yandex.practicum.filmorate.storage; + +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.User; + +import java.util.Collection; +import java.util.Set; + + +@Component +public class InMemoryUserStorage extends Storage implements UserStorage { + + + + public User create(User user) { + user.setId(getNextId()); + dataMap.put(user.getId(), user); + logger.info("Пользователь добавлен id: " + user.getId()); + return user; + } + + + public User update(User newUser) { + User oldUser = dataMap.get(newUser.getId()); + oldUser.setName(newUser.getName()); + oldUser.setEmail(newUser.getEmail()); + oldUser.setLogin(newUser.getLogin()); + oldUser.setBirthday(newUser.getBirthday()); + oldUser.setFriendsId(newUser.getFriendsId()); + logger.info("Запись пользователя обновлена"); + return oldUser; + } + + public Collection getFriendsId(long id){ + User getFriends = dataMap.get(id); + return getFriends.getFriendsId(); + } + + public Collection setFriendsId(long id, long friendsId) { + User getFriends = dataMap.get(id); //добавление в друзья + + Set newFriendsList = getFriends.getFriendsId(); + newFriendsList.add(friendsId); + getFriends.setFriendsId(newFriendsList); + User getFriendsTo = dataMap.get(friendsId); //зеркальное добавление в друзья + Set newFriendsListTo = getFriendsTo.getFriendsId(); + newFriendsListTo.add(id); + getFriendsTo.setFriendsId(newFriendsListTo); + return newFriendsList; + } + public Collection delFriendsId(long id, long friendsId){ + User getFriends = dataMap.get(id); //удаление из друзей + Set newFriendsList = getFriends.getFriendsId(); + newFriendsList.remove(friendsId); + getFriends.setFriendsId(newFriendsList); + + User getFriendsTo = dataMap.get(friendsId); //удаление из друзей + Set newFriendsListTo = getFriendsTo.getFriendsId(); + newFriendsListTo.remove(id); + getFriendsTo.setFriendsId(newFriendsListTo); + + return newFriendsList; + } + + + + private long getNextId() { + long currentMaxId = dataMap.keySet() + .stream() + .mapToLong(id -> id) + .max() + .orElse(0); + return ++currentMaxId; + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java new file mode 100644 index 0000000..7a70176 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java @@ -0,0 +1,38 @@ +package ru.yandex.practicum.filmorate.storage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.yandex.practicum.filmorate.exception.ErrorIsNull; +import ru.yandex.practicum.filmorate.model.DataModel; +import ru.yandex.practicum.filmorate.model.Film; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class Storage { + protected final Map dataMap = new HashMap<>(); +protected final Logger logger = LoggerFactory.getLogger(Storage.class); + + + public T delete(long id) { + T delData = dataMap.remove(id); + return delData; + } + + public T getId(long id) { + if (!dataMap.containsKey(id)){ + throw new ErrorIsNull("нет такого id");} + logger.info("Вернули по id="+ id); + return dataMap.get(id); + } + + public Collection getAll() { + logger.info("Вернули список"); + return dataMap.values(); + } + + + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java new file mode 100644 index 0000000..a14e86a --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -0,0 +1,26 @@ +package ru.yandex.practicum.filmorate.storage; + + +import ru.yandex.practicum.filmorate.model.DataModel; + + +import java.util.Collection; + +public interface UserStorage { + + T create (T data); + + T update (T data); + + T delete(long id); + + T getId (long id); + + public Collection getAll(); + + Collection getFriendsId(long id); + + Collection setFriendsId(long id, long userId); + + Collection delFriendsId(long id, long userId); +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..94c6c3e --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,5 @@ +logging: + level: + org: + zalando: + logbook: TRACE \ No newline at end of file diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java index cf7b4b2..892b01b 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java @@ -10,6 +10,8 @@ import ru.yandex.practicum.filmorate.model.Film; import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; public class FilmControllerTest { @@ -19,7 +21,7 @@ public class FilmControllerTest { @BeforeEach void setUp() { - film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20); + film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20,{1,1}); } @Test From c93c6411edae970cda19753df1f65b512364bac3 Mon Sep 17 00:00:00 2001 From: Evstafev Date: Fri, 25 Apr 2025 11:59:51 +0700 Subject: [PATCH 2/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/filmorate/controller/UserController.java | 6 +++--- .../practicum/filmorate/service/UserService.java | 10 ++++++---- .../filmorate/storage/InMemoryUserStorage.java | 6 +++--- .../practicum/filmorate/storage/UserStorage.java | 6 +++--- 4 files changed, 15 insertions(+), 13 deletions(-) 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 daf6468..3507ad4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -68,21 +68,21 @@ public User update(@RequestBody User newUser) { @PutMapping ("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsAdd(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + public Collection friendsAdd(@PathVariable long id,@PathVariable long friendsId){ logger.info("добавили в друзья"); return userService.friendsAdd (id, friendsId); } @DeleteMapping ("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsDelete(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + public Collection friendsDelete(@PathVariable long id,@PathVariable long friendsId){ logger.info("удалили из друзей"); return userService.friendsDelete (id, friendsId); } @GetMapping("/{id}/friends") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetList (@RequestBody @PathVariable long id){ + public Collection friendsGetList (@PathVariable long id){ logger.info("показывает список друзей"); return userService.friendsGetList(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 38fba84..022548a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -11,7 +11,6 @@ import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; -import java.util.Set; import java.util.stream.Collectors; @Service @@ -30,19 +29,19 @@ public UserService(UserStorage userStorage, ValidateController validateCon public Collection friendsAdd(long id, long friendsId) { getUserId(id); getUserId(friendsId); - return userStorage.setFriendsId(id, friendsId); + return userStorage.setFriendId(id, friendsId); } public Collection friendsDelete(long id, long friendsId) { getUserId(id); getUserId(friendsId); - return userStorage.delFriendsId(id, friendsId); + return userStorage.delFriendId(id, friendsId); } public Collection friendsGetList(long id) { getUserId(id); - return userStorage.getFriendsId(id); + return userStorage.getFriendId(id); } public User create(User user) { @@ -98,6 +97,9 @@ public User update(User newUser) { } public Collection friendsGetCommonList(long id, long otherId){ + // if (friendsGetList(id)==null || friendsGetList(otherId)==null){ + // throw new ErrorIsNull("нет общих друзей"); + // } Collection userList1 = friendsGetList(id); Collection userList2 = friendsGetList(otherId); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 3db9d82..4cb9dd5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -32,12 +32,12 @@ public User update(User newUser) { return oldUser; } - public Collection getFriendsId(long id){ + public Collection getFriendId(long id){ User getFriends = dataMap.get(id); return getFriends.getFriendsId(); } - public Collection setFriendsId(long id, long friendsId) { + public Collection setFriendId(long id, long friendsId) { User getFriends = dataMap.get(id); //добавление в друзья Set newFriendsList = getFriends.getFriendsId(); @@ -49,7 +49,7 @@ public Collection setFriendsId(long id, long friendsId) { getFriendsTo.setFriendsId(newFriendsListTo); return newFriendsList; } - public Collection delFriendsId(long id, long friendsId){ + public Collection delFriendId(long id, long friendsId){ User getFriends = dataMap.get(id); //удаление из друзей Set newFriendsList = getFriends.getFriendsId(); newFriendsList.remove(friendsId); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index a14e86a..93f0428 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -18,9 +18,9 @@ public interface UserStorage { public Collection getAll(); - Collection getFriendsId(long id); + Collection getFriendId(long id); - Collection setFriendsId(long id, long userId); + Collection setFriendId(long id, long userId); - Collection delFriendsId(long id, long userId); + Collection delFriendId(long id, long userId); } From 998c27f7d5f085f91c796e1791fa701c3772ea61 Mon Sep 17 00:00:00 2001 From: Evstafev Date: Fri, 25 Apr 2025 11:59:51 +0700 Subject: [PATCH 3/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/controller/UserController.java | 6 +++--- .../ru/yandex/practicum/filmorate/model/Film.java | 3 ++- .../ru/yandex/practicum/filmorate/model/User.java | 2 +- .../practicum/filmorate/service/UserService.java | 10 ++++++---- .../filmorate/storage/InMemoryUserStorage.java | 6 +++--- .../practicum/filmorate/storage/UserStorage.java | 6 +++--- .../practicum/filmorate/FilmControllerTest.java | 3 ++- .../practicum/filmorate/UserControllerTest.java | 5 ++++- .../yandex/practicum/filmorate/ValidateTest.java | 14 ++++++++------ 9 files changed, 32 insertions(+), 23 deletions(-) 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 daf6468..3507ad4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -68,21 +68,21 @@ public User update(@RequestBody User newUser) { @PutMapping ("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsAdd(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + public Collection friendsAdd(@PathVariable long id,@PathVariable long friendsId){ logger.info("добавили в друзья"); return userService.friendsAdd (id, friendsId); } @DeleteMapping ("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsDelete(@RequestBody @PathVariable long id,@PathVariable long friendsId){ + public Collection friendsDelete(@PathVariable long id,@PathVariable long friendsId){ logger.info("удалили из друзей"); return userService.friendsDelete (id, friendsId); } @GetMapping("/{id}/friends") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetList (@RequestBody @PathVariable long id){ + public Collection friendsGetList (@PathVariable long id){ logger.info("показывает список друзей"); return userService.friendsGetList(id); } 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 7aca27b..686e851 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -5,6 +5,7 @@ import lombok.*; import java.time.LocalDate; +import java.util.HashSet; import java.util.Set; /** @@ -35,7 +36,7 @@ public class Film extends DataModel implements Comparable { private int duration; - private Set likesId; + private Set likesId = new HashSet<>(); @Override public int compareTo(Film o) { 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 5ee2462..0fcd8f6 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -32,6 +32,6 @@ public class User extends DataModel { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate birthday; - private Set friendsId ; + private Set friendsId = new HashSet<>() ; } 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 38fba84..022548a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -11,7 +11,6 @@ import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; -import java.util.Set; import java.util.stream.Collectors; @Service @@ -30,19 +29,19 @@ public UserService(UserStorage userStorage, ValidateController validateCon public Collection friendsAdd(long id, long friendsId) { getUserId(id); getUserId(friendsId); - return userStorage.setFriendsId(id, friendsId); + return userStorage.setFriendId(id, friendsId); } public Collection friendsDelete(long id, long friendsId) { getUserId(id); getUserId(friendsId); - return userStorage.delFriendsId(id, friendsId); + return userStorage.delFriendId(id, friendsId); } public Collection friendsGetList(long id) { getUserId(id); - return userStorage.getFriendsId(id); + return userStorage.getFriendId(id); } public User create(User user) { @@ -98,6 +97,9 @@ public User update(User newUser) { } public Collection friendsGetCommonList(long id, long otherId){ + // if (friendsGetList(id)==null || friendsGetList(otherId)==null){ + // throw new ErrorIsNull("нет общих друзей"); + // } Collection userList1 = friendsGetList(id); Collection userList2 = friendsGetList(otherId); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 3db9d82..4cb9dd5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -32,12 +32,12 @@ public User update(User newUser) { return oldUser; } - public Collection getFriendsId(long id){ + public Collection getFriendId(long id){ User getFriends = dataMap.get(id); return getFriends.getFriendsId(); } - public Collection setFriendsId(long id, long friendsId) { + public Collection setFriendId(long id, long friendsId) { User getFriends = dataMap.get(id); //добавление в друзья Set newFriendsList = getFriends.getFriendsId(); @@ -49,7 +49,7 @@ public Collection setFriendsId(long id, long friendsId) { getFriendsTo.setFriendsId(newFriendsListTo); return newFriendsList; } - public Collection delFriendsId(long id, long friendsId){ + public Collection delFriendId(long id, long friendsId){ User getFriends = dataMap.get(id); //удаление из друзей Set newFriendsList = getFriends.getFriendsId(); newFriendsList.remove(friendsId); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index a14e86a..93f0428 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -18,9 +18,9 @@ public interface UserStorage { public Collection getAll(); - Collection getFriendsId(long id); + Collection getFriendId(long id); - Collection setFriendsId(long id, long userId); + Collection setFriendId(long id, long userId); - Collection delFriendsId(long id, long userId); + Collection delFriendId(long id, long userId); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java index 892b01b..c2b6b9c 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java @@ -18,10 +18,11 @@ public class FilmControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); Film film; + Set testList = new HashSet<>(){}; @BeforeEach void setUp() { - film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20,{1,1}); + film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20,testList); } @Test diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java index 973cfa7..f40c767 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java @@ -9,6 +9,8 @@ import ru.yandex.practicum.filmorate.model.User; import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; public class UserControllerTest { @@ -16,10 +18,11 @@ public class UserControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); User user; + Set testList = new HashSet<>(){}; @BeforeEach void setUp() { - user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3)); + user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3),testList); } @Test diff --git a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java index de8c47f..93ceee7 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java @@ -10,6 +10,7 @@ import ru.yandex.practicum.filmorate.model.User; import java.time.LocalDate; +import java.util.HashSet; import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -19,6 +20,7 @@ public class ValidateTest { private Validator validator; + Set testList = new HashSet<>(){}; @BeforeEach void setUp() { @@ -27,14 +29,14 @@ void setUp() { @Test void validatorUserOk() { - User user = new User(1L, "name@yabex.ru", "log", "name", LocalDate.now().minusYears(3)); + User user = new User(1L, "name@yabex.ru", "log", "name", LocalDate.now().minusYears(3), testList); Set> violations = validator.validate(user); assertTrue(violations.isEmpty()); } @Test void validatorUserTest() { - User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3)); + User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3),testList); Set> violations = validator.validate(user); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(2); @@ -44,7 +46,7 @@ void validatorUserTest() { @Test void validatorUserNotNull() { - User user = new User(1L, null, null, "name", null); + User user = new User(1L, null, null, "name", null, testList); Set> violations = validator.validate(user); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(3); @@ -54,7 +56,7 @@ void validatorUserNotNull() { @Test void validatorFilmOk() { - Film film = new Film(1L, "kino", "kino o kine", LocalDate.of(1990, 02, 22), 25); + Film film = new Film(1L, "kino", "kino o kine", LocalDate.of(1990, 02, 22), 25, testList); Set> violations = validator.validate(film); assertTrue(violations.isEmpty()); } @@ -62,7 +64,7 @@ void validatorFilmOk() { @Test void validatorFilmTest() { Film film = new Film(1L, "kino", Strings.repeat("*", 220), - LocalDate.now().plusYears(3), 2); + LocalDate.now().plusYears(3), 2, testList); Set> violations = validator.validate(film); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(2); @@ -73,7 +75,7 @@ void validatorFilmTest() { @Test void validatorFilmNotNull() { Film film = new Film(1L, null, null, - null, 2); + null, 2, testList); Set> violations = validator.validate(film); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(3); From a9c40a3fee3096d8482e3bd153ba03d091bbe23b Mon Sep 17 00:00:00 2001 From: Evstafev Date: Sun, 27 Apr 2025 14:14:02 +0700 Subject: [PATCH 4/8] =?UTF-8?q?=D0=A2=D0=97=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/FilmorateApplication.java | 1 - .../filmorate/controller/FilmController.java | 11 ++-- .../filmorate/controller/UserController.java | 31 +++++------ .../controller/ValidateController.java | 2 - .../filmorate/exception/ErrorHandler.java | 17 +++--- .../filmorate/exception/ErrorIsNull.java | 3 +- .../filmorate/exception/ErrorResponse.java | 13 ++--- .../exception/ValidationErrorResponse.java | 1 - .../practicum/filmorate/model/DataModel.java | 5 +- .../practicum/filmorate/model/Film.java | 8 ++- .../practicum/filmorate/model/User.java | 7 ++- .../filmorate/service/FilmService.java | 54 +++++++++---------- .../filmorate/service/UserService.java | 18 +++---- .../filmorate/storage/FilmStorage.java | 22 ++++---- .../storage/InMemoryFilmStorage.java | 29 +++++----- .../storage/InMemoryUserStorage.java | 45 ++++++++-------- .../practicum/filmorate/storage/Storage.java | 23 ++++---- .../filmorate/storage/UserStorage.java | 4 +- .../filmorate/FilmControllerTest.java | 6 +-- .../filmorate/UserControllerTest.java | 12 ++++- .../practicum/filmorate/ValidateTest.java | 5 +- 21 files changed, 145 insertions(+), 172 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java index 8616407..3f2baca 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java +++ b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java @@ -1,6 +1,5 @@ package ru.yandex.practicum.filmorate; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; 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 cb47831..15a4881 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -11,7 +11,6 @@ import java.util.Collection; - @RestController @RequestMapping("/films") public class FilmController { @@ -26,7 +25,7 @@ public FilmController(FilmService filmService) { @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public Film getFilmId(@RequestBody @PathVariable long id) { + public Film getFilmId(@PathVariable long id) { logger.info("вывод пользователя по ID"); return filmService.getFilmId(id); } @@ -47,7 +46,7 @@ public Film create(@Valid @RequestBody Film film) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@RequestBody @PathVariable long id) { + public void delete(@PathVariable long id) { logger.info("Удаление id=" + id); filmService.delete(id); } @@ -61,19 +60,19 @@ public Film update(@RequestBody Film newFilm) { @PutMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection likeAdd(@RequestBody @PathVariable long id, @PathVariable long userId) { + public Collection likeAdd(@PathVariable long id, @PathVariable long userId) { return filmService.likeAdd(id, userId); } @DeleteMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection LikeDelete(@RequestBody @PathVariable long id, @PathVariable long userId) { + public Collection LikeDelete(@PathVariable long id, @PathVariable long userId) { return filmService.likeDelete(id, userId); } @GetMapping("/popular") @ResponseStatus(HttpStatus.OK) - public Collection getPopular(@RequestBody @RequestParam (defaultValue = "10") int count){ + public Collection getPopular(@RequestParam(defaultValue = "10") int count) { return filmService.getPopular(count); } } 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 3507ad4..5b881b6 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -2,20 +2,16 @@ import jakarta.validation.Valid; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; - - import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; import java.util.Collection; - @RestController @RequestMapping("/users") public class UserController { @@ -29,13 +25,11 @@ public UserController(UserService userService) { this.userService = userService; } - - @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public User getUserId(@PathVariable @RequestBody long id){ + public User getUserId(@PathVariable long id) { logger.info("вывод пользователя по ID"); - return userService.getUserId(id); + return userService.getUserId(id); } @GetMapping @@ -54,7 +48,7 @@ public User create(@Valid @RequestBody User user) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@RequestBody @PathVariable long id) { + public void delete(@PathVariable long id) { logger.info("Удаление id=" + id); userService.delete(id); } @@ -66,32 +60,31 @@ public User update(@RequestBody User newUser) { return userService.update(newUser); } - @PutMapping ("/{id}/friends/{friendsId}") + @PutMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsAdd(@PathVariable long id,@PathVariable long friendsId){ + public Collection friendsAdd(@PathVariable long id, @PathVariable long friendsId) { logger.info("добавили в друзья"); - return userService.friendsAdd (id, friendsId); + return userService.friendsAdd(id, friendsId); } - @DeleteMapping ("/{id}/friends/{friendsId}") + @DeleteMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsDelete(@PathVariable long id,@PathVariable long friendsId){ + public Collection friendsDelete(@PathVariable long id, @PathVariable long friendsId) { logger.info("удалили из друзей"); - return userService.friendsDelete (id, friendsId); + return userService.friendsDelete(id, friendsId); } @GetMapping("/{id}/friends") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetList (@PathVariable long id){ + public Collection friendsGetList(@PathVariable long id) { logger.info("показывает список друзей"); return userService.friendsGetList(id); } @GetMapping("/{id}/friends/common/{otherId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetCommonList (@PathVariable long id, @PathVariable long otherId){ + public Collection friendsGetCommonList(@PathVariable long id, @PathVariable long otherId) { logger.info("показывает список друзей"); return userService.friendsGetCommonList(id, otherId); } - -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java index b6f8f98..8c4d32f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java @@ -15,7 +15,6 @@ public class ValidateController { private final Logger log = LoggerFactory.getLogger(ValidateController.class); - public void validateFilm(Film film) { final LocalDate FILM_DATE = LocalDate.of(1895, 12, 28); @@ -99,7 +98,6 @@ public void validateUser(User user) { log.warn("введена дата из будущего"); throw new ValidationException("введена дата из будущего"); } - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java index 2516b62..a8404af 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java @@ -1,6 +1,5 @@ package ru.yandex.practicum.filmorate.exception; - import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,16 +18,16 @@ public class ErrorHandler { @ExceptionHandler @ResponseStatus(HttpStatus.NOT_FOUND) -public ErrorResponse handlerIsNull (final ErrorIsNull e){ - logger.warn(e.getMessage()); - return new ErrorResponse("error",e.getMessage()); -} + public ErrorResponse handlerIsNull(final ErrorIsNull e) { + logger.warn(e.getMessage()); + return new ErrorResponse("error", e.getMessage()); + } @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ErrorResponse handleThrowbla (final Throwable e){ + public ErrorResponse handleThrowbla(final Throwable e) { logger.warn(e.getMessage()); - return new ErrorResponse("error", "Произошла непредвиденная ошибка.") ; + return new ErrorResponse("error", "Произошла непредвиденная ошибка."); } @ExceptionHandler @@ -74,6 +73,4 @@ public ValidationErrorResponse onMethodArgumentNotValidException( .collect(Collectors.toList()); return new ValidationErrorResponse(violations); } -} - - +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java index 1f5ba7d..6692ef0 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java @@ -2,8 +2,7 @@ public class ErrorIsNull extends NullPointerException { - public ErrorIsNull(String message){ + public ErrorIsNull(String message) { super(message); } - } 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 2973fe2..9d8ec03 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java @@ -2,14 +2,15 @@ import lombok.Getter; +@Getter public class ErrorResponse { - @Getter + String error; - @Getter + String description; -public ErrorResponse (String error, String description){ - this.error=error; - this.description=description; -} + public ErrorResponse(String error, String description) { + this.error = error; + this.description = description; + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java index 1f20830..4615672 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java @@ -5,7 +5,6 @@ import java.util.List; -// взято с просторов интернета вывод сообщений при ошибки @Getter @RequiredArgsConstructor public class ValidationErrorResponse { diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java index 1f3102c..14c6581 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java @@ -1,11 +1,8 @@ package ru.yandex.practicum.filmorate.model; - -import java.util.Set; - public class DataModel { private Long id; private String name; - } +} 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 686e851..f5f6eb5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.LocalDate; -import java.util.HashSet; import java.util.Set; /** @@ -35,14 +34,13 @@ public class Film extends DataModel implements Comparable { @Min(1) private int duration; - - private Set likesId = new HashSet<>(); + private Set likesId ; @Override public int compareTo(Film o) { - if (o.getLikesId()==null){ + if (o.getLikesId() == null) { return 0; } - return (int)(o.getLikesId().size()-this.getLikesId().size()); + return o.getLikesId().size() - this.getLikesId().size(); } } \ No newline at end of file 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 0fcd8f6..c8dd66e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.LocalDate; -import java.util.HashSet; import java.util.Set; @Setter @@ -21,7 +20,6 @@ public class User extends DataModel { @Email(message = "email не соотвествует формату") private String email; - @NotNull(message = "логин не заполнен") private String login; @@ -32,6 +30,7 @@ public class User extends DataModel { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate birthday; - private Set friendsId = new HashSet<>() ; + private Set friendsId; + - } +} 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 074e3ae..e9aea22 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -11,11 +11,9 @@ import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.FilmStorage; -import ru.yandex.practicum.filmorate.storage.InMemoryFilmStorage; import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; -import java.util.Comparator; import java.util.stream.Collectors; @Service @@ -28,10 +26,10 @@ public class FilmService { private final Logger logger = LoggerFactory.getLogger(FilmService.class); @Autowired - public FilmService(FilmStorage filmStorage, UserStorage userStorage, ValidateController validateController) { + public FilmService(FilmStorage filmStorage, UserStorage userStorage, ValidateController validateController) { this.filmStorage = filmStorage; - this.userStorage=userStorage; - this.validateController=validateController; + this.userStorage = userStorage; + this.validateController = validateController; } @@ -42,66 +40,66 @@ public Film create(Film film) { return returnFilm; } - public Film getFilmId (long id){ + public Film getFilmId(long id) { Film getFilm = filmStorage.getId(id); - if (getFilm==null){ + if (getFilm == null) { throw new ErrorIsNull("нет такого id"); } - logger.info("поиск по id="+id); + logger.info("поиск по id=" + id); return getFilm; } - public Collection getAll(){ + public Collection getAll() { logger.info("Вернули список"); - Collection returnAll = filmStorage.getAll(); - if (returnAll.isEmpty()){ + Collection returnAll = filmStorage.getAll(); + if (returnAll.isEmpty()) { throw new ErrorIsNull("список пуст"); } return returnAll; } - public void delete(long id){ - Film delFilm= filmStorage.delete(id); - if (delFilm==null) { - throw new ErrorIsNull("нет такого id"); - } - logger.info("удаление id="+id); + public void delete(long id) { + Film delFilm = filmStorage.delete(id); + if (delFilm == null) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("удаление id=" + id); } - public Film update (Film newFilm){ + public Film update(Film newFilm) { if (newFilm.getId() == null) { logger.warn("ID пустой"); throw new ValidationException("ID фильма пустой"); - } + } Film oldFilm = filmStorage.getId(newFilm.getId()); - if (oldFilm==null) { + if (oldFilm == null) { logger.warn("фильм с таким ID не найден"); - throw new ErrorIsNull("фильм с таким ID не найден"); + throw new ErrorIsNull("фильм с таким ID не найден"); } validateController.validateFilm(newFilm); logger.info("запись фильма обновлена"); return filmStorage.update(newFilm); } - public Collection likeAdd (long id, long userId){ + public Collection likeAdd(long id, long userId) { getFilmId(id); - userStorage.getId(userId); - - return filmStorage.setLikeId(id, userId); + userStorage.getId(userId); + return filmStorage.setLikeId(id, userId); } - public Collection likeDelete (long id, long userId){ + public Collection likeDelete(long id, long userId) { getFilmId(id); + userStorage.getId(userId); return filmStorage.delLikesId(id, userId); } -public Collection getPopular (int count){ + public Collection getPopular(int count) { return getAll().stream() .sorted(Film::compareTo) .limit(count) .collect(Collectors.toList()); -} + } } 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 022548a..1ecaa82 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -11,6 +11,7 @@ import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; +import java.util.List; import java.util.stream.Collectors; @Service @@ -39,9 +40,10 @@ public Collection friendsDelete(long id, long friendsId) { return userStorage.delFriendId(id, friendsId); } - public Collection friendsGetList(long id) { + public Collection friendsGetList(long id) { getUserId(id); - return userStorage.getFriendId(id); + + return userStorage.getFriendId(id).stream().map(this::getUserId).collect(Collectors.toList()); } public User create(User user) { @@ -51,8 +53,6 @@ public User create(User user) { return returnUser; } - - public Collection getAll() { logger.info("Вернули список"); Collection returnAll = userStorage.getAll(); @@ -96,13 +96,9 @@ public User update(User newUser) { return userStorage.update(newUser); } - public Collection friendsGetCommonList(long id, long otherId){ - // if (friendsGetList(id)==null || friendsGetList(otherId)==null){ - // throw new ErrorIsNull("нет общих друзей"); - // } - Collection userList1 = friendsGetList(id); - Collection userList2 = friendsGetList(otherId); - + public List friendsGetCommonList(long id, long otherId) { + Collection userList1 = friendsGetList(id); + Collection userList2 = friendsGetList(otherId); return userList1.stream().filter(userList2::contains).collect(Collectors.toList()); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java index 0374dec..38ac22e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java @@ -1,28 +1,24 @@ package ru.yandex.practicum.filmorate.storage; import ru.yandex.practicum.filmorate.model.DataModel; -import ru.yandex.practicum.filmorate.model.Film; - import java.util.Collection; - public interface FilmStorage { + T create(T data); - T create (T data); - - T update (T data); + T update(T data); - T delete(long id); + T delete(long id); - T getId (long id); - Collection getAll (); + T getId(long id); - Collection getLikeId(long id); + Collection getAll(); - Collection setLikeId(long id, long userId); + Collection getLikeId(long id); - Collection delLikesId(long id, long userId); + Collection setLikeId(long id, long userId); - } + Collection delLikesId(long id, long userId); +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java index 6ce82c5..34a6772 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java @@ -4,49 +4,52 @@ import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; +import java.util.HashSet; import java.util.Set; @Component public class InMemoryFilmStorage extends Storage implements FilmStorage { - - public Film create(Film film) { film.setId(getNextId()); - + if (film.getLikesId() == null) { + film.setLikesId(new HashSet<>() { + }); + } dataMap.put(film.getId(), film); logger.info("Фильм добавлен id: " + film.getId()); - return film; + return film; } - public Film update(Film newFilm) { Film oldFilm = dataMap.get(newFilm.getId()); oldFilm.setName(newFilm.getName()); oldFilm.setDescription(newFilm.getDescription()); oldFilm.setReleaseDate(newFilm.getReleaseDate()); oldFilm.setDuration(newFilm.getDuration()); - // if (!newFilm.getLikesId().isEmpty()){ + + if (newFilm.getLikesId() == null) { + newFilm.setLikesId(new HashSet<>() { + }); + } oldFilm.setLikesId(newFilm.getLikesId()); logger.info("Запись фильма обновлена"); return oldFilm; } - public Collection getLikeId(long id){ + public Collection getLikeId(long id) { Film getLikes = dataMap.get(id); - return getLikes.getLikesId(); + return getLikes.getLikesId(); } - public Collection setLikeId(long id, long userId) { + public Collection setLikeId(long id, long userId) { Film getLikes = dataMap.get(id); - getLikes.getLikesId().add(userId); - // newLikesList.add(userId); - // getLikes.setLikesId(newLikesList); + getLikes.getLikesId().add(userId); return getLikes.getLikesId(); } - public Collection delLikesId(long id, long userId){ + public Collection delLikesId(long id, long userId) { Film getLikes = dataMap.get(id); Set newLikesList = getLikes.getLikesId(); newLikesList.remove(id); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 4cb9dd5..6cb3bfa 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -1,21 +1,21 @@ package ru.yandex.practicum.filmorate.storage; import org.springframework.stereotype.Component; -import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.User; -import java.util.Collection; -import java.util.Set; - +import java.util.*; @Component public class InMemoryUserStorage extends Storage implements UserStorage { - public User create(User user) { user.setId(getNextId()); - dataMap.put(user.getId(), user); + if (user.getFriendsId() == null) { + user.setFriendsId(new HashSet<>() { + }); + } + dataMap.put(user.getId(), user); logger.info("Пользователь добавлен id: " + user.getId()); return user; } @@ -32,38 +32,37 @@ public User update(User newUser) { return oldUser; } - public Collection getFriendId(long id){ + public Collection getFriendId(long id) { User getFriends = dataMap.get(id); - return getFriends.getFriendsId(); + return getFriends.getFriendsId(); } public Collection setFriendId(long id, long friendsId) { - User getFriends = dataMap.get(id); //добавление в друзья - + User getFriends = dataMap.get(id); //добавление в друзья Set newFriendsList = getFriends.getFriendsId(); newFriendsList.add(friendsId); getFriends.setFriendsId(newFriendsList); + User getFriendsTo = dataMap.get(friendsId); //зеркальное добавление в друзья - Set newFriendsListTo = getFriendsTo.getFriendsId(); + Set newFriendsListTo = getFriendsTo.getFriendsId(); newFriendsListTo.add(id); getFriendsTo.setFriendsId(newFriendsListTo); return newFriendsList; } - public Collection delFriendId(long id, long friendsId){ - User getFriends = dataMap.get(id); //удаление из друзей - Set newFriendsList = getFriends.getFriendsId(); - newFriendsList.remove(friendsId); - getFriends.setFriendsId(newFriendsList); - - User getFriendsTo = dataMap.get(friendsId); //удаление из друзей - Set newFriendsListTo = getFriendsTo.getFriendsId(); - newFriendsListTo.remove(id); - getFriendsTo.setFriendsId(newFriendsListTo); - return newFriendsList; - } + public Collection delFriendId(long id, long friendsId) { + User getFriends = dataMap.get(id); //удаление из друзей + Set newFriendsList = getFriends.getFriendsId(); + newFriendsList.remove(friendsId); + getFriends.setFriendsId(newFriendsList); + User getFriendsTo = dataMap.get(friendsId); //удаление из друзей + Set newFriendsListTo = getFriendsTo.getFriendsId(); + newFriendsListTo.remove(id); + getFriendsTo.setFriendsId(newFriendsListTo); + return newFriendsList; + } private long getNextId() { long currentMaxId = dataMap.keySet() diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java index 7a70176..1be99fc 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java @@ -4,35 +4,30 @@ import org.slf4j.LoggerFactory; import ru.yandex.practicum.filmorate.exception.ErrorIsNull; import ru.yandex.practicum.filmorate.model.DataModel; -import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; -public class Storage { +public class Storage { protected final Map dataMap = new HashMap<>(); -protected final Logger logger = LoggerFactory.getLogger(Storage.class); + protected final Logger logger = LoggerFactory.getLogger(Storage.class); public T delete(long id) { - T delData = dataMap.remove(id); - return delData; + return dataMap.remove(id); } public T getId(long id) { - if (!dataMap.containsKey(id)){ - throw new ErrorIsNull("нет такого id");} - logger.info("Вернули по id="+ id); + if (!dataMap.containsKey(id)) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("Вернули по id=" + id); return dataMap.get(id); - } + } public Collection getAll() { logger.info("Вернули список"); return dataMap.values(); - } - - - + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index 93f0428..68e5350 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -1,9 +1,7 @@ package ru.yandex.practicum.filmorate.storage; - import ru.yandex.practicum.filmorate.model.DataModel; - import java.util.Collection; public interface UserStorage { @@ -16,7 +14,7 @@ public interface UserStorage { T getId (long id); - public Collection getAll(); + Collection getAll(); Collection getFriendId(long id); diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java index c2b6b9c..748c4ae 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java @@ -18,11 +18,12 @@ public class FilmControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); Film film; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { - film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20,testList); + film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20, testList); } @Test @@ -101,5 +102,4 @@ public void filmIs0Duration() { Assertions.assertEquals("продолжительность <= 0", exception.getMessage()); } - } diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java index f40c767..752a33e 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java @@ -18,11 +18,12 @@ public class UserControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); User user; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { - user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3),testList); + user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3), testList); } @Test @@ -95,4 +96,11 @@ public void userFutureBirthday() { Assertions.assertEquals("введена дата из будущего", exception.getMessage()); } + @Test + public void UserFriends (){ + User user1 = new User(1L, "ya1@yandex.ru", "login1", "name1", LocalDate.now().minusYears(3), testList); + User user2 = new User(2L, "ya2@yandex.ru", "login2", "name2", LocalDate.now().minusYears(3), testList); + user1.getFriendsId().add(2L); + Assertions.assertEquals(2, user1.getFriendsId().stream().toList().get(0)); + } } diff --git a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java index 93ceee7..a37520e 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java @@ -20,7 +20,8 @@ public class ValidateTest { private Validator validator; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { @@ -36,7 +37,7 @@ void validatorUserOk() { @Test void validatorUserTest() { - User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3),testList); + User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3), testList); Set> violations = validator.validate(user); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(2); From f115269f375686eeb55447cea5a79ad5ae090534 Mon Sep 17 00:00:00 2001 From: Evstafev Date: Sun, 27 Apr 2025 14:14:02 +0700 Subject: [PATCH 5/8] =?UTF-8?q?=D0=A2=D0=97=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/FilmorateApplication.java | 1 - .../filmorate/controller/FilmController.java | 11 ++-- .../filmorate/controller/UserController.java | 31 +++++------ .../controller/ValidateController.java | 2 - .../filmorate/exception/ErrorHandler.java | 17 +++--- .../filmorate/exception/ErrorIsNull.java | 3 +- .../filmorate/exception/ErrorResponse.java | 13 ++--- .../exception/ValidationErrorResponse.java | 1 - .../practicum/filmorate/model/DataModel.java | 5 +- .../practicum/filmorate/model/Film.java | 8 ++- .../practicum/filmorate/model/User.java | 7 ++- .../filmorate/service/FilmService.java | 54 +++++++++---------- .../filmorate/service/UserService.java | 18 +++---- .../filmorate/storage/FilmStorage.java | 22 ++++---- .../storage/InMemoryFilmStorage.java | 29 +++++----- .../storage/InMemoryUserStorage.java | 45 ++++++++-------- .../practicum/filmorate/storage/Storage.java | 23 ++++---- .../filmorate/storage/UserStorage.java | 4 +- .../filmorate/FilmControllerTest.java | 6 +-- .../filmorate/UserControllerTest.java | 12 ++++- .../practicum/filmorate/ValidateTest.java | 5 +- 21 files changed, 145 insertions(+), 172 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java index 8616407..3f2baca 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java +++ b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java @@ -1,6 +1,5 @@ package ru.yandex.practicum.filmorate; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; 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 cb47831..350386f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -11,7 +11,6 @@ import java.util.Collection; - @RestController @RequestMapping("/films") public class FilmController { @@ -26,7 +25,7 @@ public FilmController(FilmService filmService) { @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public Film getFilmId(@RequestBody @PathVariable long id) { + public Film getFilmId(@PathVariable long id) { logger.info("вывод пользователя по ID"); return filmService.getFilmId(id); } @@ -47,7 +46,7 @@ public Film create(@Valid @RequestBody Film film) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@RequestBody @PathVariable long id) { + public void delete(@PathVariable long id) { logger.info("Удаление id=" + id); filmService.delete(id); } @@ -61,19 +60,19 @@ public Film update(@RequestBody Film newFilm) { @PutMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection likeAdd(@RequestBody @PathVariable long id, @PathVariable long userId) { + public Collection likeAdd(@PathVariable long id, @PathVariable long userId) { return filmService.likeAdd(id, userId); } @DeleteMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection LikeDelete(@RequestBody @PathVariable long id, @PathVariable long userId) { + public Collection likeDelete(@PathVariable long id, @PathVariable long userId) { return filmService.likeDelete(id, userId); } @GetMapping("/popular") @ResponseStatus(HttpStatus.OK) - public Collection getPopular(@RequestBody @RequestParam (defaultValue = "10") int count){ + public Collection getPopular(@RequestParam(defaultValue = "10") int count) { return filmService.getPopular(count); } } 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 3507ad4..5b881b6 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -2,20 +2,16 @@ import jakarta.validation.Valid; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; - - import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; import java.util.Collection; - @RestController @RequestMapping("/users") public class UserController { @@ -29,13 +25,11 @@ public UserController(UserService userService) { this.userService = userService; } - - @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public User getUserId(@PathVariable @RequestBody long id){ + public User getUserId(@PathVariable long id) { logger.info("вывод пользователя по ID"); - return userService.getUserId(id); + return userService.getUserId(id); } @GetMapping @@ -54,7 +48,7 @@ public User create(@Valid @RequestBody User user) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@RequestBody @PathVariable long id) { + public void delete(@PathVariable long id) { logger.info("Удаление id=" + id); userService.delete(id); } @@ -66,32 +60,31 @@ public User update(@RequestBody User newUser) { return userService.update(newUser); } - @PutMapping ("/{id}/friends/{friendsId}") + @PutMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsAdd(@PathVariable long id,@PathVariable long friendsId){ + public Collection friendsAdd(@PathVariable long id, @PathVariable long friendsId) { logger.info("добавили в друзья"); - return userService.friendsAdd (id, friendsId); + return userService.friendsAdd(id, friendsId); } - @DeleteMapping ("/{id}/friends/{friendsId}") + @DeleteMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsDelete(@PathVariable long id,@PathVariable long friendsId){ + public Collection friendsDelete(@PathVariable long id, @PathVariable long friendsId) { logger.info("удалили из друзей"); - return userService.friendsDelete (id, friendsId); + return userService.friendsDelete(id, friendsId); } @GetMapping("/{id}/friends") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetList (@PathVariable long id){ + public Collection friendsGetList(@PathVariable long id) { logger.info("показывает список друзей"); return userService.friendsGetList(id); } @GetMapping("/{id}/friends/common/{otherId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetCommonList (@PathVariable long id, @PathVariable long otherId){ + public Collection friendsGetCommonList(@PathVariable long id, @PathVariable long otherId) { logger.info("показывает список друзей"); return userService.friendsGetCommonList(id, otherId); } - -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java index b6f8f98..8c4d32f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java @@ -15,7 +15,6 @@ public class ValidateController { private final Logger log = LoggerFactory.getLogger(ValidateController.class); - public void validateFilm(Film film) { final LocalDate FILM_DATE = LocalDate.of(1895, 12, 28); @@ -99,7 +98,6 @@ public void validateUser(User user) { log.warn("введена дата из будущего"); throw new ValidationException("введена дата из будущего"); } - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java index 2516b62..a8404af 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorHandler.java @@ -1,6 +1,5 @@ package ru.yandex.practicum.filmorate.exception; - import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,16 +18,16 @@ public class ErrorHandler { @ExceptionHandler @ResponseStatus(HttpStatus.NOT_FOUND) -public ErrorResponse handlerIsNull (final ErrorIsNull e){ - logger.warn(e.getMessage()); - return new ErrorResponse("error",e.getMessage()); -} + public ErrorResponse handlerIsNull(final ErrorIsNull e) { + logger.warn(e.getMessage()); + return new ErrorResponse("error", e.getMessage()); + } @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ErrorResponse handleThrowbla (final Throwable e){ + public ErrorResponse handleThrowbla(final Throwable e) { logger.warn(e.getMessage()); - return new ErrorResponse("error", "Произошла непредвиденная ошибка.") ; + return new ErrorResponse("error", "Произошла непредвиденная ошибка."); } @ExceptionHandler @@ -74,6 +73,4 @@ public ValidationErrorResponse onMethodArgumentNotValidException( .collect(Collectors.toList()); return new ValidationErrorResponse(violations); } -} - - +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java index 1f5ba7d..6692ef0 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorIsNull.java @@ -2,8 +2,7 @@ public class ErrorIsNull extends NullPointerException { - public ErrorIsNull(String message){ + public ErrorIsNull(String message) { super(message); } - } 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 2973fe2..9d8ec03 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ErrorResponse.java @@ -2,14 +2,15 @@ import lombok.Getter; +@Getter public class ErrorResponse { - @Getter + String error; - @Getter + String description; -public ErrorResponse (String error, String description){ - this.error=error; - this.description=description; -} + public ErrorResponse(String error, String description) { + this.error = error; + this.description = description; + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java index 1f20830..4615672 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationErrorResponse.java @@ -5,7 +5,6 @@ import java.util.List; -// взято с просторов интернета вывод сообщений при ошибки @Getter @RequiredArgsConstructor public class ValidationErrorResponse { diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java index 1f3102c..14c6581 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/DataModel.java @@ -1,11 +1,8 @@ package ru.yandex.practicum.filmorate.model; - -import java.util.Set; - public class DataModel { private Long id; private String name; - } +} 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 686e851..f5f6eb5 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.LocalDate; -import java.util.HashSet; import java.util.Set; /** @@ -35,14 +34,13 @@ public class Film extends DataModel implements Comparable { @Min(1) private int duration; - - private Set likesId = new HashSet<>(); + private Set likesId ; @Override public int compareTo(Film o) { - if (o.getLikesId()==null){ + if (o.getLikesId() == null) { return 0; } - return (int)(o.getLikesId().size()-this.getLikesId().size()); + return o.getLikesId().size() - this.getLikesId().size(); } } \ No newline at end of file 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 0fcd8f6..c8dd66e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.LocalDate; -import java.util.HashSet; import java.util.Set; @Setter @@ -21,7 +20,6 @@ public class User extends DataModel { @Email(message = "email не соотвествует формату") private String email; - @NotNull(message = "логин не заполнен") private String login; @@ -32,6 +30,7 @@ public class User extends DataModel { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate birthday; - private Set friendsId = new HashSet<>() ; + private Set friendsId; + - } +} 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 074e3ae..e9aea22 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -11,11 +11,9 @@ import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.FilmStorage; -import ru.yandex.practicum.filmorate.storage.InMemoryFilmStorage; import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; -import java.util.Comparator; import java.util.stream.Collectors; @Service @@ -28,10 +26,10 @@ public class FilmService { private final Logger logger = LoggerFactory.getLogger(FilmService.class); @Autowired - public FilmService(FilmStorage filmStorage, UserStorage userStorage, ValidateController validateController) { + public FilmService(FilmStorage filmStorage, UserStorage userStorage, ValidateController validateController) { this.filmStorage = filmStorage; - this.userStorage=userStorage; - this.validateController=validateController; + this.userStorage = userStorage; + this.validateController = validateController; } @@ -42,66 +40,66 @@ public Film create(Film film) { return returnFilm; } - public Film getFilmId (long id){ + public Film getFilmId(long id) { Film getFilm = filmStorage.getId(id); - if (getFilm==null){ + if (getFilm == null) { throw new ErrorIsNull("нет такого id"); } - logger.info("поиск по id="+id); + logger.info("поиск по id=" + id); return getFilm; } - public Collection getAll(){ + public Collection getAll() { logger.info("Вернули список"); - Collection returnAll = filmStorage.getAll(); - if (returnAll.isEmpty()){ + Collection returnAll = filmStorage.getAll(); + if (returnAll.isEmpty()) { throw new ErrorIsNull("список пуст"); } return returnAll; } - public void delete(long id){ - Film delFilm= filmStorage.delete(id); - if (delFilm==null) { - throw new ErrorIsNull("нет такого id"); - } - logger.info("удаление id="+id); + public void delete(long id) { + Film delFilm = filmStorage.delete(id); + if (delFilm == null) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("удаление id=" + id); } - public Film update (Film newFilm){ + public Film update(Film newFilm) { if (newFilm.getId() == null) { logger.warn("ID пустой"); throw new ValidationException("ID фильма пустой"); - } + } Film oldFilm = filmStorage.getId(newFilm.getId()); - if (oldFilm==null) { + if (oldFilm == null) { logger.warn("фильм с таким ID не найден"); - throw new ErrorIsNull("фильм с таким ID не найден"); + throw new ErrorIsNull("фильм с таким ID не найден"); } validateController.validateFilm(newFilm); logger.info("запись фильма обновлена"); return filmStorage.update(newFilm); } - public Collection likeAdd (long id, long userId){ + public Collection likeAdd(long id, long userId) { getFilmId(id); - userStorage.getId(userId); - - return filmStorage.setLikeId(id, userId); + userStorage.getId(userId); + return filmStorage.setLikeId(id, userId); } - public Collection likeDelete (long id, long userId){ + public Collection likeDelete(long id, long userId) { getFilmId(id); + userStorage.getId(userId); return filmStorage.delLikesId(id, userId); } -public Collection getPopular (int count){ + public Collection getPopular(int count) { return getAll().stream() .sorted(Film::compareTo) .limit(count) .collect(Collectors.toList()); -} + } } 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 022548a..1ecaa82 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -11,6 +11,7 @@ import ru.yandex.practicum.filmorate.storage.UserStorage; import java.util.Collection; +import java.util.List; import java.util.stream.Collectors; @Service @@ -39,9 +40,10 @@ public Collection friendsDelete(long id, long friendsId) { return userStorage.delFriendId(id, friendsId); } - public Collection friendsGetList(long id) { + public Collection friendsGetList(long id) { getUserId(id); - return userStorage.getFriendId(id); + + return userStorage.getFriendId(id).stream().map(this::getUserId).collect(Collectors.toList()); } public User create(User user) { @@ -51,8 +53,6 @@ public User create(User user) { return returnUser; } - - public Collection getAll() { logger.info("Вернули список"); Collection returnAll = userStorage.getAll(); @@ -96,13 +96,9 @@ public User update(User newUser) { return userStorage.update(newUser); } - public Collection friendsGetCommonList(long id, long otherId){ - // if (friendsGetList(id)==null || friendsGetList(otherId)==null){ - // throw new ErrorIsNull("нет общих друзей"); - // } - Collection userList1 = friendsGetList(id); - Collection userList2 = friendsGetList(otherId); - + public List friendsGetCommonList(long id, long otherId) { + Collection userList1 = friendsGetList(id); + Collection userList2 = friendsGetList(otherId); return userList1.stream().filter(userList2::contains).collect(Collectors.toList()); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java index 0374dec..38ac22e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java @@ -1,28 +1,24 @@ package ru.yandex.practicum.filmorate.storage; import ru.yandex.practicum.filmorate.model.DataModel; -import ru.yandex.practicum.filmorate.model.Film; - import java.util.Collection; - public interface FilmStorage { + T create(T data); - T create (T data); - - T update (T data); + T update(T data); - T delete(long id); + T delete(long id); - T getId (long id); - Collection getAll (); + T getId(long id); - Collection getLikeId(long id); + Collection getAll(); - Collection setLikeId(long id, long userId); + Collection getLikeId(long id); - Collection delLikesId(long id, long userId); + Collection setLikeId(long id, long userId); - } + Collection delLikesId(long id, long userId); +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java index 6ce82c5..34a6772 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java @@ -4,49 +4,52 @@ import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; +import java.util.HashSet; import java.util.Set; @Component public class InMemoryFilmStorage extends Storage implements FilmStorage { - - public Film create(Film film) { film.setId(getNextId()); - + if (film.getLikesId() == null) { + film.setLikesId(new HashSet<>() { + }); + } dataMap.put(film.getId(), film); logger.info("Фильм добавлен id: " + film.getId()); - return film; + return film; } - public Film update(Film newFilm) { Film oldFilm = dataMap.get(newFilm.getId()); oldFilm.setName(newFilm.getName()); oldFilm.setDescription(newFilm.getDescription()); oldFilm.setReleaseDate(newFilm.getReleaseDate()); oldFilm.setDuration(newFilm.getDuration()); - // if (!newFilm.getLikesId().isEmpty()){ + + if (newFilm.getLikesId() == null) { + newFilm.setLikesId(new HashSet<>() { + }); + } oldFilm.setLikesId(newFilm.getLikesId()); logger.info("Запись фильма обновлена"); return oldFilm; } - public Collection getLikeId(long id){ + public Collection getLikeId(long id) { Film getLikes = dataMap.get(id); - return getLikes.getLikesId(); + return getLikes.getLikesId(); } - public Collection setLikeId(long id, long userId) { + public Collection setLikeId(long id, long userId) { Film getLikes = dataMap.get(id); - getLikes.getLikesId().add(userId); - // newLikesList.add(userId); - // getLikes.setLikesId(newLikesList); + getLikes.getLikesId().add(userId); return getLikes.getLikesId(); } - public Collection delLikesId(long id, long userId){ + public Collection delLikesId(long id, long userId) { Film getLikes = dataMap.get(id); Set newLikesList = getLikes.getLikesId(); newLikesList.remove(id); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 4cb9dd5..6cb3bfa 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -1,21 +1,21 @@ package ru.yandex.practicum.filmorate.storage; import org.springframework.stereotype.Component; -import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.User; -import java.util.Collection; -import java.util.Set; - +import java.util.*; @Component public class InMemoryUserStorage extends Storage implements UserStorage { - public User create(User user) { user.setId(getNextId()); - dataMap.put(user.getId(), user); + if (user.getFriendsId() == null) { + user.setFriendsId(new HashSet<>() { + }); + } + dataMap.put(user.getId(), user); logger.info("Пользователь добавлен id: " + user.getId()); return user; } @@ -32,38 +32,37 @@ public User update(User newUser) { return oldUser; } - public Collection getFriendId(long id){ + public Collection getFriendId(long id) { User getFriends = dataMap.get(id); - return getFriends.getFriendsId(); + return getFriends.getFriendsId(); } public Collection setFriendId(long id, long friendsId) { - User getFriends = dataMap.get(id); //добавление в друзья - + User getFriends = dataMap.get(id); //добавление в друзья Set newFriendsList = getFriends.getFriendsId(); newFriendsList.add(friendsId); getFriends.setFriendsId(newFriendsList); + User getFriendsTo = dataMap.get(friendsId); //зеркальное добавление в друзья - Set newFriendsListTo = getFriendsTo.getFriendsId(); + Set newFriendsListTo = getFriendsTo.getFriendsId(); newFriendsListTo.add(id); getFriendsTo.setFriendsId(newFriendsListTo); return newFriendsList; } - public Collection delFriendId(long id, long friendsId){ - User getFriends = dataMap.get(id); //удаление из друзей - Set newFriendsList = getFriends.getFriendsId(); - newFriendsList.remove(friendsId); - getFriends.setFriendsId(newFriendsList); - - User getFriendsTo = dataMap.get(friendsId); //удаление из друзей - Set newFriendsListTo = getFriendsTo.getFriendsId(); - newFriendsListTo.remove(id); - getFriendsTo.setFriendsId(newFriendsListTo); - return newFriendsList; - } + public Collection delFriendId(long id, long friendsId) { + User getFriends = dataMap.get(id); //удаление из друзей + Set newFriendsList = getFriends.getFriendsId(); + newFriendsList.remove(friendsId); + getFriends.setFriendsId(newFriendsList); + User getFriendsTo = dataMap.get(friendsId); //удаление из друзей + Set newFriendsListTo = getFriendsTo.getFriendsId(); + newFriendsListTo.remove(id); + getFriendsTo.setFriendsId(newFriendsListTo); + return newFriendsList; + } private long getNextId() { long currentMaxId = dataMap.keySet() diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java index 7a70176..1be99fc 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/Storage.java @@ -4,35 +4,30 @@ import org.slf4j.LoggerFactory; import ru.yandex.practicum.filmorate.exception.ErrorIsNull; import ru.yandex.practicum.filmorate.model.DataModel; -import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; -public class Storage { +public class Storage { protected final Map dataMap = new HashMap<>(); -protected final Logger logger = LoggerFactory.getLogger(Storage.class); + protected final Logger logger = LoggerFactory.getLogger(Storage.class); public T delete(long id) { - T delData = dataMap.remove(id); - return delData; + return dataMap.remove(id); } public T getId(long id) { - if (!dataMap.containsKey(id)){ - throw new ErrorIsNull("нет такого id");} - logger.info("Вернули по id="+ id); + if (!dataMap.containsKey(id)) { + throw new ErrorIsNull("нет такого id"); + } + logger.info("Вернули по id=" + id); return dataMap.get(id); - } + } public Collection getAll() { logger.info("Вернули список"); return dataMap.values(); - } - - - + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index 93f0428..68e5350 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -1,9 +1,7 @@ package ru.yandex.practicum.filmorate.storage; - import ru.yandex.practicum.filmorate.model.DataModel; - import java.util.Collection; public interface UserStorage { @@ -16,7 +14,7 @@ public interface UserStorage { T getId (long id); - public Collection getAll(); + Collection getAll(); Collection getFriendId(long id); diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java index c2b6b9c..748c4ae 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java @@ -18,11 +18,12 @@ public class FilmControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); Film film; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { - film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20,testList); + film = new Film(1L, "name", "описание ", LocalDate.now().minusYears(3), 20, testList); } @Test @@ -101,5 +102,4 @@ public void filmIs0Duration() { Assertions.assertEquals("продолжительность <= 0", exception.getMessage()); } - } diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java index f40c767..752a33e 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java @@ -18,11 +18,12 @@ public class UserControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); User user; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { - user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3),testList); + user = new User(1L, "ya@yandex.ru", "login", "name", LocalDate.now().minusYears(3), testList); } @Test @@ -95,4 +96,11 @@ public void userFutureBirthday() { Assertions.assertEquals("введена дата из будущего", exception.getMessage()); } + @Test + public void UserFriends (){ + User user1 = new User(1L, "ya1@yandex.ru", "login1", "name1", LocalDate.now().minusYears(3), testList); + User user2 = new User(2L, "ya2@yandex.ru", "login2", "name2", LocalDate.now().minusYears(3), testList); + user1.getFriendsId().add(2L); + Assertions.assertEquals(2, user1.getFriendsId().stream().toList().get(0)); + } } diff --git a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java index 93ceee7..a37520e 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java @@ -20,7 +20,8 @@ public class ValidateTest { private Validator validator; - Set testList = new HashSet<>(){}; + Set testList = new HashSet<>() { + }; @BeforeEach void setUp() { @@ -36,7 +37,7 @@ void validatorUserOk() { @Test void validatorUserTest() { - User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3),testList); + User user = new User(1L, "nameyabex.ru", "log", "name", LocalDate.now().plusYears(3), testList); Set> violations = validator.validate(user); assertFalse(violations.isEmpty()); assertThat(violations).hasSize(2); From f9fbf7f046d7d03068bb739d790d88c3c89f3f3b Mon Sep 17 00:00:00 2001 From: Evstafev Date: Sun, 27 Apr 2025 14:29:54 +0700 Subject: [PATCH 6/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=82=D1=8B=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/filmorate/storage/UserStorage.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index 68e5350..3cb17a4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -4,15 +4,15 @@ import java.util.Collection; -public interface UserStorage { +public interface UserStorage { - T create (T data); + T create(T data); - T update (T data); + T update(T data); - T delete(long id); + T delete(long id); - T getId (long id); + T getId(long id); Collection getAll(); From fb21283107158145b52b6f065bd0f36ff2184c43 Mon Sep 17 00:00:00 2001 From: Evstafev Date: Sun, 27 Apr 2025 14:32:34 +0700 Subject: [PATCH 7/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=82=D1=8B=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/yandex/practicum/filmorate/UserControllerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java index 752a33e..50a1be5 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java @@ -97,10 +97,10 @@ public void userFutureBirthday() { } @Test - public void UserFriends (){ - User user1 = new User(1L, "ya1@yandex.ru", "login1", "name1", LocalDate.now().minusYears(3), testList); - User user2 = new User(2L, "ya2@yandex.ru", "login2", "name2", LocalDate.now().minusYears(3), testList); + public void userFriends() { + User user1 = new User(1L, "ya1@yandex.ru", "login1", "name1", LocalDate.now().minusYears(3), testList); + User user2 = new User(2L, "ya2@yandex.ru", "login2", "name2", LocalDate.now().minusYears(3), testList); user1.getFriendsId().add(2L); Assertions.assertEquals(2, user1.getFriendsId().stream().toList().get(0)); - } + } } From ebb1e362b33186fc76c5a84e8087c7bcb982449d Mon Sep 17 00:00:00 2001 From: Evstafev Date: Sun, 27 Apr 2025 17:30:48 +0700 Subject: [PATCH 8/8] =?UTF-8?q?=D0=A2=D0=97=2011=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/controller/FilmController.java | 20 ++++++++++++------- .../filmorate/controller/UserController.java | 18 +++++++++++------ .../storage/InMemoryFilmStorage.java | 10 +++++++--- .../storage/InMemoryUserStorage.java | 11 ++++++---- .../filmorate/FilmControllerTest.java | 2 +- .../filmorate/UserControllerTest.java | 2 +- 6 files changed, 41 insertions(+), 22 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 350386f..b77547a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -1,22 +1,25 @@ package ru.yandex.practicum.filmorate.controller; import jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.service.FilmService; import java.util.Collection; +@Validated @RestController @RequestMapping("/films") public class FilmController { private final Logger logger = LoggerFactory.getLogger(FilmController.class); - FilmService filmService; + private final FilmService filmService; @Autowired public FilmController(FilmService filmService) { @@ -25,8 +28,9 @@ public FilmController(FilmService filmService) { @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public Film getFilmId(@PathVariable long id) { - logger.info("вывод пользователя по ID"); + + public Film getFilmId(@Positive(message = "неверное значение") @PathVariable long id) { + logger.info("вывод фильма по ID"); return filmService.getFilmId(id); } @@ -46,7 +50,7 @@ public Film create(@Valid @RequestBody Film film) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@PathVariable long id) { + public void delete(@Positive(message = "неверное значение") @PathVariable long id) { logger.info("Удаление id=" + id); filmService.delete(id); } @@ -60,19 +64,21 @@ public Film update(@RequestBody Film newFilm) { @PutMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection likeAdd(@PathVariable long id, @PathVariable long userId) { + public Collection likeAdd(@Positive(message = "неверное значение") @PathVariable long id, + @Positive(message = "неверное значение") @PathVariable long userId) { return filmService.likeAdd(id, userId); } @DeleteMapping("/{id}/like/{userId}") @ResponseStatus(HttpStatus.OK) - public Collection likeDelete(@PathVariable long id, @PathVariable long userId) { + public Collection likeDelete(@Positive(message = "неверное значение") @PathVariable long id, + @Positive(message = "неверное значение") @PathVariable long userId) { return filmService.likeDelete(id, userId); } @GetMapping("/popular") @ResponseStatus(HttpStatus.OK) - public Collection getPopular(@RequestParam(defaultValue = "10") int count) { + public Collection getPopular(@Positive(message = "неверное значение") @RequestParam(defaultValue = "10") int count) { return filmService.getPopular(count); } } 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 5b881b6..938f2b8 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -2,16 +2,19 @@ import jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; import java.util.Collection; +@Validated @RestController @RequestMapping("/users") public class UserController { @@ -27,7 +30,7 @@ public UserController(UserService userService) { @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public User getUserId(@PathVariable long id) { + public User getUserId(@Positive(message = "неверное значение") @PathVariable long id) { logger.info("вывод пользователя по ID"); return userService.getUserId(id); } @@ -48,7 +51,7 @@ public User create(@Valid @RequestBody User user) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public void delete(@PathVariable long id) { + public void delete(@Positive(message = "неверное значение") @PathVariable long id) { logger.info("Удаление id=" + id); userService.delete(id); } @@ -62,28 +65,31 @@ public User update(@RequestBody User newUser) { @PutMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsAdd(@PathVariable long id, @PathVariable long friendsId) { + public Collection friendsAdd(@Positive(message = "неверное значение") @PathVariable long id, + @Positive(message = "неверное значение") @PathVariable long friendsId) { logger.info("добавили в друзья"); return userService.friendsAdd(id, friendsId); } @DeleteMapping("/{id}/friends/{friendsId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsDelete(@PathVariable long id, @PathVariable long friendsId) { + public Collection friendsDelete(@Positive(message = "неверное значение") @PathVariable long id, + @Positive(message = "неверное значение") @PathVariable long friendsId) { logger.info("удалили из друзей"); return userService.friendsDelete(id, friendsId); } @GetMapping("/{id}/friends") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetList(@PathVariable long id) { + public Collection friendsGetList(@Positive(message = "неверное значение") @PathVariable long id) { logger.info("показывает список друзей"); return userService.friendsGetList(id); } @GetMapping("/{id}/friends/common/{otherId}") @ResponseStatus(HttpStatus.OK) - public Collection friendsGetCommonList(@PathVariable long id, @PathVariable long otherId) { + public Collection friendsGetCommonList(@Positive(message = "неверное значение") @PathVariable long id, + @Positive(message = "неверное значение") @PathVariable long otherId) { logger.info("показывает список друзей"); return userService.friendsGetCommonList(id, otherId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java index 34a6772..a625616 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java @@ -1,16 +1,16 @@ package ru.yandex.practicum.filmorate.storage; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; import ru.yandex.practicum.filmorate.model.Film; import java.util.Collection; import java.util.HashSet; import java.util.Set; -@Component +@Repository public class InMemoryFilmStorage extends Storage implements FilmStorage { - + @Override public Film create(Film film) { film.setId(getNextId()); if (film.getLikesId() == null) { @@ -22,6 +22,7 @@ public Film create(Film film) { return film; } + @Override public Film update(Film newFilm) { Film oldFilm = dataMap.get(newFilm.getId()); oldFilm.setName(newFilm.getName()); @@ -38,17 +39,20 @@ public Film update(Film newFilm) { return oldFilm; } + @Override public Collection getLikeId(long id) { Film getLikes = dataMap.get(id); return getLikes.getLikesId(); } + @Override public Collection setLikeId(long id, long userId) { Film getLikes = dataMap.get(id); getLikes.getLikesId().add(userId); return getLikes.getLikesId(); } + @Override public Collection delLikesId(long id, long userId) { Film getLikes = dataMap.get(id); Set newLikesList = getLikes.getLikesId(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 6cb3bfa..3fc2128 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -1,14 +1,14 @@ package ru.yandex.practicum.filmorate.storage; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; import ru.yandex.practicum.filmorate.model.User; import java.util.*; -@Component +@Repository public class InMemoryUserStorage extends Storage implements UserStorage { - + @Override public User create(User user) { user.setId(getNextId()); if (user.getFriendsId() == null) { @@ -20,7 +20,7 @@ public User create(User user) { return user; } - + @Override public User update(User newUser) { User oldUser = dataMap.get(newUser.getId()); oldUser.setName(newUser.getName()); @@ -32,11 +32,13 @@ public User update(User newUser) { return oldUser; } + @Override public Collection getFriendId(long id) { User getFriends = dataMap.get(id); return getFriends.getFriendsId(); } + @Override public Collection setFriendId(long id, long friendsId) { User getFriends = dataMap.get(id); //добавление в друзья Set newFriendsList = getFriends.getFriendsId(); @@ -50,6 +52,7 @@ public Collection setFriendId(long id, long friendsId) { return newFriendsList; } + @Override public Collection delFriendId(long id, long friendsId) { User getFriends = dataMap.get(id); //удаление из друзей Set newFriendsList = getFriends.getFriendsId(); diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java index 748c4ae..78fce0a 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmControllerTest.java @@ -17,7 +17,7 @@ public class FilmControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); - Film film; + private Film film; Set testList = new HashSet<>() { }; diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java index 50a1be5..1f633f6 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java +++ b/src/test/java/ru/yandex/practicum/filmorate/UserControllerTest.java @@ -17,7 +17,7 @@ public class UserControllerTest { Exception exception; private final ValidateController validate = new ValidateController(); - User user; + private User user; Set testList = new HashSet<>() { };