From 00b7ec821aecc64b4880401754c106f4fbab697b Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Fri, 1 Apr 2022 17:56:33 +0300 Subject: [PATCH 01/12] add solution --- .gitignore | 1 + pom.xml | 40 ++++++++++++++++ .../catsgram/CatsgramApplication.java | 13 +++++ .../catsgram/controllers/PostController.java | 25 ++++++++++ .../controllers/SimpleController.java | 13 +++++ .../catsgram/controllers/UserController.java | 44 +++++++++++++++++ .../exceptions/InvalidEmailException.java | 7 +++ .../exceptions/UserAlreadyExistException.java | 7 +++ .../practicum/catsgram/models/Post.java | 41 ++++++++++++++++ .../practicum/catsgram/models/User.java | 47 +++++++++++++++++++ src/main/resources/application.properties | 1 + .../catsgram/CatsgramApplicationTests.java | 13 +++++ 12 files changed, 252 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/models/Post.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/models/User.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java diff --git a/.gitignore b/.gitignore index a1c2a238..1bc94f32 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +/.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..a4bdb80c --- /dev/null +++ b/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + ru.yandex.practicum + catsgram + 0.0.1-SNAPSHOT + catsgram + Мини-версия популярной соцсети с фотографиями котов. + + 11 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java new file mode 100644 index 00000000..63f822d5 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CatsgramApplication { + + public static void main(String[] args) { + SpringApplication.run(CatsgramApplication.class, args); + } + +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java new file mode 100644 index 00000000..543b7292 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java @@ -0,0 +1,25 @@ +package ru.yandex.practicum.catsgram.controllers; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.models.Post; +import java.util.ArrayList; +import java.util.List; + +@RestController +public class PostController { + + private final List posts = new ArrayList<>(); + + @GetMapping("/posts") + public List findAll() { + return posts; + } + + @PostMapping(value = "/post") + public void create(@RequestBody Post post) { + posts.add(post); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java b/src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java new file mode 100644 index 00000000..dba6e166 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram.controllers; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class SimpleController { + + @GetMapping("/home") + public String homePage() { + return "Котограм"; + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java new file mode 100644 index 00000000..312046f9 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java @@ -0,0 +1,44 @@ +package ru.yandex.practicum.catsgram.controllers; + +import org.springframework.web.bind.annotation.*; +import ru.yandex.practicum.catsgram.exceptions.InvalidEmailException; +import ru.yandex.practicum.catsgram.exceptions.UserAlreadyExistException; +import ru.yandex.practicum.catsgram.models.User; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/users") +public class UserController { + private final Map users = new HashMap<>(); + + @GetMapping + public Collection findAll() { + return users.values(); + } + + @PostMapping + public User create(@RequestBody User user) { + if(user.getEmail() == null || user.getEmail().isBlank()) { + throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); + } + if(users.containsKey(user.getEmail())) { + throw new UserAlreadyExistException("Пользователь с электронной почтой " + + user.getEmail() + " уже зарегистрирован."); + } + users.put(user.getEmail(), user); + return user; + } + + @PutMapping + public User put(@RequestBody User user) { + if(user.getEmail() == null || user.getEmail().isBlank()) { + throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); + } + users.put(user.getEmail(), user); + + return user; + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java b/src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java new file mode 100644 index 00000000..25bf731f --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.catsgram.exceptions; + +public class InvalidEmailException extends RuntimeException { + public InvalidEmailException(String s) { + super(s); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java b/src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java new file mode 100644 index 00000000..a3c86360 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.catsgram.exceptions; + +public class UserAlreadyExistException extends RuntimeException { + public UserAlreadyExistException(String s) { + super(s); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/models/Post.java b/src/main/java/ru/yandex/practicum/catsgram/models/Post.java new file mode 100644 index 00000000..7d18f1d1 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/models/Post.java @@ -0,0 +1,41 @@ +package ru.yandex.practicum.catsgram.models; + +import java.time.Instant; + +public class Post { + + private final String author; // автор + private final Instant creationDate = Instant.now(); // дата создания + private String description; // описание + private String photoUrl; // url-адрес фотографии + + public Post(String author, String description, String photoUrl) { + this.author = author; + this.description = description; + this.photoUrl = photoUrl; + } + + public String getAuthor() { + return author; + } + + public Instant getCreationDate() { + return creationDate; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(String photoUrl) { + this.photoUrl = photoUrl; + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/models/User.java b/src/main/java/ru/yandex/practicum/catsgram/models/User.java new file mode 100644 index 00000000..1352b4d5 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/models/User.java @@ -0,0 +1,47 @@ +package ru.yandex.practicum.catsgram.models; + +import java.time.LocalDate; +import java.util.Objects; + +public class User { + private String email; + private String nickname; + private LocalDate birthdate; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return email.equals(user.email); + } + + @Override + public int hashCode() { + return Objects.hash(email); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java b/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java new file mode 100644 index 00000000..32936573 --- /dev/null +++ b/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java @@ -0,0 +1,13 @@ +package test.java.ru.yandex.practicum.catsgram; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CatsgramApplicationTests { + + @Test + void contextLoads() { + } + +} From 95ec28b13e70130c5813ab4201fd6c67132fe1bb Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Thu, 31 Mar 2022 23:57:33 +0300 Subject: [PATCH 02/12] add meet-spring_spring-boot-and-rest --- .gitignore | 1 + pom.xml | 40 ++++++++++++++++++ .../catsgram/CatsgramApplication.java | 13 ++++++ .../catsgram/controller/PostController.java | 25 +++++++++++ .../catsgram/controller/SimpleController.java | 13 ++++++ .../yandex/practicum/catsgram/model/Post.java | 41 +++++++++++++++++++ src/main/resources/application.properties | 1 + .../catsgram/CatsgramApplicationTests.java | 13 ++++++ 8 files changed, 147 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/model/Post.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java diff --git a/.gitignore b/.gitignore index a1c2a238..1bc94f32 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +/.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..a4bdb80c --- /dev/null +++ b/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + ru.yandex.practicum + catsgram + 0.0.1-SNAPSHOT + catsgram + Мини-версия популярной соцсети с фотографиями котов. + + 11 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java new file mode 100644 index 00000000..63f822d5 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CatsgramApplication { + + public static void main(String[] args) { + SpringApplication.run(CatsgramApplication.class, args); + } + +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java new file mode 100644 index 00000000..2b19e51d --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -0,0 +1,25 @@ +package ru.yandex.practicum.catsgram.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.model.Post; +import java.util.ArrayList; +import java.util.List; + +@RestController +public class PostController { + + private final List posts = new ArrayList<>(); + + @GetMapping("/posts") + public List findAll() { + return posts; + } + + @PostMapping(value = "/post") + public void create(@RequestBody Post post) { + posts.add(post); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java new file mode 100644 index 00000000..be3380f6 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class SimpleController { + + @GetMapping("/home") + public String homePage() { + return "Котограм"; + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java new file mode 100644 index 00000000..6a4b8868 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java @@ -0,0 +1,41 @@ +package ru.yandex.practicum.catsgram.model; + +import java.time.Instant; + +public class Post { + + private final String author; // автор + private final Instant creationDate = Instant.now(); // дата создания + private String description; // описание + private String photoUrl; // url-адрес фотографии + + public Post(String author, String description, String photoUrl) { + this.author = author; + this.description = description; + this.photoUrl = photoUrl; + } + + public String getAuthor() { + return author; + } + + public Instant getCreationDate() { + return creationDate; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(String photoUrl) { + this.photoUrl = photoUrl; + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java b/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java new file mode 100644 index 00000000..32936573 --- /dev/null +++ b/src/test/java/ru/yandex/practicum/catsgram/CatsgramApplicationTests.java @@ -0,0 +1,13 @@ +package test.java.ru.yandex.practicum.catsgram; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CatsgramApplicationTests { + + @Test + void contextLoads() { + } + +} From cc0a25abb7527e8dbefb196d6c23c64ddb30de76 Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Wed, 6 Apr 2022 00:38:57 +0300 Subject: [PATCH 03/12] add logging_logging-your-messages --- .gitignore | 1 + pom.xml | 6 ++++++ .../{controllers => controller}/PostController.java | 9 ++++++--- .../{controllers => controller}/SimpleController.java | 2 +- .../{controllers => controller}/UserController.java | 8 ++++---- .../{exceptions => exception}/InvalidEmailException.java | 2 +- .../UserAlreadyExistException.java | 2 +- .../practicum/catsgram/{models => model}/Post.java | 2 +- .../practicum/catsgram/{models => model}/User.java | 2 +- src/main/resources/application.properties | 3 ++- 10 files changed, 24 insertions(+), 13 deletions(-) rename src/main/java/ru/yandex/practicum/catsgram/{controllers => controller}/PostController.java (64%) rename src/main/java/ru/yandex/practicum/catsgram/{controllers => controller}/SimpleController.java (84%) rename src/main/java/ru/yandex/practicum/catsgram/{controllers => controller}/UserController.java (84%) rename src/main/java/ru/yandex/practicum/catsgram/{exceptions => exception}/InvalidEmailException.java (73%) rename src/main/java/ru/yandex/practicum/catsgram/{exceptions => exception}/UserAlreadyExistException.java (74%) rename src/main/java/ru/yandex/practicum/catsgram/{models => model}/Post.java (95%) rename src/main/java/ru/yandex/practicum/catsgram/{models => model}/User.java (95%) diff --git a/.gitignore b/.gitignore index 1bc94f32..f13c4159 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* /.idea/ +/target/ diff --git a/pom.xml b/pom.xml index a4bdb80c..9eedf1e0 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,12 @@ spring-boot-starter-web + + org.zalando + logbook-spring-boot-starter + 2.14.0 + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java similarity index 64% rename from src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java rename to src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index 543b7292..aa74f9c2 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controllers/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -1,20 +1,23 @@ -package ru.yandex.practicum.catsgram.controllers; +package ru.yandex.practicum.catsgram.controller; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import ru.yandex.practicum.catsgram.models.Post; +import ru.yandex.practicum.catsgram.model.Post; import java.util.ArrayList; import java.util.List; @RestController public class PostController { - + private static final Logger log = LoggerFactory.getLogger(PostController.class); private final List posts = new ArrayList<>(); @GetMapping("/posts") public List findAll() { + log.debug("Текущее количество постов: {}", posts.size()); return posts; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java similarity index 84% rename from src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java rename to src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java index dba6e166..be3380f6 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controllers/SimpleController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.catsgram.controllers; +package ru.yandex.practicum.catsgram.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java similarity index 84% rename from src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java rename to src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java index 312046f9..0e771d1f 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controllers/UserController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java @@ -1,9 +1,9 @@ -package ru.yandex.practicum.catsgram.controllers; +package ru.yandex.practicum.catsgram.controller; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.catsgram.exceptions.InvalidEmailException; -import ru.yandex.practicum.catsgram.exceptions.UserAlreadyExistException; -import ru.yandex.practicum.catsgram.models.User; +import ru.yandex.practicum.catsgram.exception.InvalidEmailException; +import ru.yandex.practicum.catsgram.exception.UserAlreadyExistException; +import ru.yandex.practicum.catsgram.model.User; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java similarity index 73% rename from src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java rename to src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java index 25bf731f..47fd862b 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/exceptions/InvalidEmailException.java +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.catsgram.exceptions; +package ru.yandex.practicum.catsgram.exception; public class InvalidEmailException extends RuntimeException { public InvalidEmailException(String s) { diff --git a/src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java similarity index 74% rename from src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java rename to src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java index a3c86360..b3681b26 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/exceptions/UserAlreadyExistException.java +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.catsgram.exceptions; +package ru.yandex.practicum.catsgram.exception; public class UserAlreadyExistException extends RuntimeException { public UserAlreadyExistException(String s) { diff --git a/src/main/java/ru/yandex/practicum/catsgram/models/Post.java b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java similarity index 95% rename from src/main/java/ru/yandex/practicum/catsgram/models/Post.java rename to src/main/java/ru/yandex/practicum/catsgram/model/Post.java index 7d18f1d1..6a4b8868 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/models/Post.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.catsgram.models; +package ru.yandex.practicum.catsgram.model; import java.time.Instant; diff --git a/src/main/java/ru/yandex/practicum/catsgram/models/User.java b/src/main/java/ru/yandex/practicum/catsgram/model/User.java similarity index 95% rename from src/main/java/ru/yandex/practicum/catsgram/models/User.java rename to src/main/java/ru/yandex/practicum/catsgram/model/User.java index 1352b4d5..2eb6f650 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/models/User.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/User.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.catsgram.models; +package ru.yandex.practicum.catsgram.model; import java.time.LocalDate; import java.util.Objects; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891..235f65ce 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ - +logging.level.org.zalando.logbook=TRACE +logging.level.ru.yandex.practicum.contollers=debug From b968899f32a15c1200de965d43ef6534d1e5aacb Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Tue, 19 Apr 2022 16:56:56 +0300 Subject: [PATCH 04/12] =?UTF-8?q?feature:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20PostService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catsgram/controller/PostController.java | 21 +++++++++++-------- .../catsgram/service/PostService.java | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/service/PostService.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index aa74f9c2..10bb3390 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -1,28 +1,31 @@ package ru.yandex.practicum.catsgram.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import ru.yandex.practicum.catsgram.model.Post; -import java.util.ArrayList; +import ru.yandex.practicum.catsgram.service.PostService; + import java.util.List; @RestController public class PostController { - private static final Logger log = LoggerFactory.getLogger(PostController.class); - private final List posts = new ArrayList<>(); + private final PostService postService; + + @Autowired + public PostController(PostService postService) { + this.postService = postService; + } @GetMapping("/posts") public List findAll() { - log.debug("Текущее количество постов: {}", posts.size()); - return posts; + return postService.findAll(); } @PostMapping(value = "/post") - public void create(@RequestBody Post post) { - posts.add(post); + public Post create(@RequestBody Post post) { + return postService.create(post); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java new file mode 100644 index 00000000..a03f5153 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -0,0 +1,21 @@ +package ru.yandex.practicum.catsgram.service; + +import org.springframework.stereotype.Service; +import ru.yandex.practicum.catsgram.model.Post; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class PostService { + private final List posts = new ArrayList<>(); + + public List findAll() { + return posts; + } + + public Post create(Post post) { + posts.add(post); + return post; + } +} \ No newline at end of file From 08ea753338898eb56e8bb2847eb79d07b3549e08 Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Tue, 19 Apr 2022 17:03:08 +0300 Subject: [PATCH 05/12] =?UTF-8?q?feature:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20UserSevice,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=B0=20email=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catsgram/controller/UserController.java | 36 +++++--------- .../exception/UserNotFoundException.java | 7 +++ .../catsgram/service/PostService.java | 16 +++++++ .../catsgram/service/UserService.java | 47 +++++++++++++++++++ 4 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/exception/UserNotFoundException.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/service/UserService.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java index 0e771d1f..d29969b5 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java @@ -1,44 +1,34 @@ package ru.yandex.practicum.catsgram.controller; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.catsgram.exception.InvalidEmailException; -import ru.yandex.practicum.catsgram.exception.UserAlreadyExistException; import ru.yandex.practicum.catsgram.model.User; +import ru.yandex.practicum.catsgram.service.UserService; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; @RestController @RequestMapping("/users") public class UserController { - private final Map users = new HashMap<>(); + private final UserService userService; + + @Autowired + public UserController(UserService userService) { + this.userService = userService; + } @GetMapping public Collection findAll() { - return users.values(); + return userService.findAll(); } @PostMapping - public User create(@RequestBody User user) { - if(user.getEmail() == null || user.getEmail().isBlank()) { - throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); - } - if(users.containsKey(user.getEmail())) { - throw new UserAlreadyExistException("Пользователь с электронной почтой " + - user.getEmail() + " уже зарегистрирован."); - } - users.put(user.getEmail(), user); - return user; + public User createUser(@RequestBody User user) { + return userService.createUser(user); } @PutMapping - public User put(@RequestBody User user) { - if(user.getEmail() == null || user.getEmail().isBlank()) { - throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); - } - users.put(user.getEmail(), user); - - return user; + public User updateUser(@RequestBody User user) { + return userService.updateUser(user); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/UserNotFoundException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/UserNotFoundException.java new file mode 100644 index 00000000..c4547ea6 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/UserNotFoundException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.catsgram.exception; + +public class UserNotFoundException extends RuntimeException { + public UserNotFoundException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index a03f5153..f1adeab9 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -1,20 +1,36 @@ package ru.yandex.practicum.catsgram.service; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.yandex.practicum.catsgram.exception.UserNotFoundException; import ru.yandex.practicum.catsgram.model.Post; +import ru.yandex.practicum.catsgram.model.User; import java.util.ArrayList; import java.util.List; @Service public class PostService { + private final UserService userService; private final List posts = new ArrayList<>(); + @Autowired + public PostService(UserService userService) { + this.userService = userService; + } + public List findAll() { return posts; } public Post create(Post post) { + User postAuthor = userService.findUserByEmail(post.getAuthor()); + if (postAuthor == null) { + throw new UserNotFoundException(String.format( + "Пользователь %s не найден", + post.getAuthor())); + } + posts.add(post); return post; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java new file mode 100644 index 00000000..f3c63be8 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java @@ -0,0 +1,47 @@ +package ru.yandex.practicum.catsgram.service; + +import org.springframework.stereotype.Service; +import ru.yandex.practicum.catsgram.exception.InvalidEmailException; +import ru.yandex.practicum.catsgram.exception.UserAlreadyExistException; +import ru.yandex.practicum.catsgram.model.User; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@Service +public class UserService { + private final Map users = new HashMap<>(); + + public Collection findAll() { + return users.values(); + } + + public User createUser(User user) { + if (user.getEmail() == null || user.getEmail().isBlank()) { + throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); + } + if (users.containsKey(user.getEmail())) { + throw new UserAlreadyExistException("Пользователь с электронной почтой " + + user.getEmail() + " уже зарегистрирован."); + } + users.put(user.getEmail(), user); + return user; + } + + public User updateUser(User user) { + if (user.getEmail() == null || user.getEmail().isBlank()) { + throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); + } + users.put(user.getEmail(), user); + + return user; + } + + public User findUserByEmail(String email) { + if (email == null) { + return null; + } + return users.get(email); + } +} \ No newline at end of file From d3b184b3cf537e124267ca0bfe93c4f6663fff83 Mon Sep 17 00:00:00 2001 From: kpmy Date: Tue, 19 Apr 2022 19:54:51 +0300 Subject: [PATCH 06/12] =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=B0=20=D0=9F=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=B0=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B0,=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catsgram/controller/PostController.java | 12 +++++++----- .../catsgram/controller/UserController.java | 7 ++++++- .../exception/PostNotFoundException.java | 8 ++++++++ .../yandex/practicum/catsgram/model/Post.java | 11 ++++++++++- .../practicum/catsgram/service/PostService.java | 17 ++++++++++++++++- 5 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index 10bb3390..e5990aae 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -1,10 +1,7 @@ package ru.yandex.practicum.catsgram.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.service.PostService; @@ -28,4 +25,9 @@ public List findAll() { public Post create(@RequestBody Post post) { return postService.create(post); } -} \ No newline at end of file + + @GetMapping("/post/{postId}") + public Post findPost(@PathVariable("postId") Integer postId){ + return postService.findPostById(postId); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java index d29969b5..ffaec3eb 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java @@ -31,4 +31,9 @@ public User createUser(@RequestBody User user) { public User updateUser(@RequestBody User user) { return userService.updateUser(user); } -} \ No newline at end of file + + @GetMapping("/user/{userMail}") + public User getUser(@PathVariable("userMail") String userMail){ + return userService.findUserByEmail(userMail); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java new file mode 100644 index 00000000..8f865c3e --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java @@ -0,0 +1,8 @@ +package ru.yandex.practicum.catsgram.exception; + +public class PostNotFoundException extends RuntimeException { + + public PostNotFoundException(String message){ + super(message); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java index 6a4b8868..eaf90d51 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java @@ -4,6 +4,7 @@ public class Post { + private Integer id; private final String author; // автор private final Instant creationDate = Instant.now(); // дата создания private String description; // описание @@ -15,6 +16,14 @@ public Post(String author, String description, String photoUrl) { this.photoUrl = photoUrl; } + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + public String getAuthor() { return author; } @@ -38,4 +47,4 @@ public String getPhotoUrl() { public void setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; } -} \ No newline at end of file +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index f1adeab9..4842829b 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.yandex.practicum.catsgram.exception.PostNotFoundException; import ru.yandex.practicum.catsgram.exception.UserNotFoundException; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.model.User; @@ -14,6 +15,8 @@ public class PostService { private final UserService userService; private final List posts = new ArrayList<>(); + private static Integer globalId = 0; + @Autowired public PostService(UserService userService) { this.userService = userService; @@ -23,6 +26,10 @@ public List findAll() { return posts; } + private static Integer getNextId(){ + return globalId++; + } + public Post create(Post post) { User postAuthor = userService.findUserByEmail(post.getAuthor()); if (postAuthor == null) { @@ -31,7 +38,15 @@ public Post create(Post post) { post.getAuthor())); } + post.setId(getNextId()); posts.add(post); return post; } -} \ No newline at end of file + + public Post findPostById(Integer postId) { + return posts.stream() + .filter(p -> p.getId().equals(postId)) + .findFirst() + .orElseThrow(() -> new PostNotFoundException(String.format("Пост № %d не найден", postId))); + } +} From 5d1017aeb3f275641361fb6aba15515e0f2b8711 Mon Sep 17 00:00:00 2001 From: kpmy Date: Tue, 19 Apr 2022 20:46:29 +0300 Subject: [PATCH 07/12] =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=B0=20=D0=9F=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=B0=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B0,=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catsgram/controller/PostController.java | 15 +++++++++++++-- .../practicum/catsgram/service/PostService.java | 11 +++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index e5990aae..1f4dd118 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -17,8 +17,19 @@ public PostController(PostService postService) { } @GetMapping("/posts") - public List findAll() { - return postService.findAll(); + public List findAll( + @RequestParam(value = "page", defaultValue = "0", required = false) Integer page, + @RequestParam(value = "size", defaultValue = "10", required = false) Integer size, + @RequestParam(value = "sort", defaultValue = "desc", required = false) String sort) { + + Integer from = page * size; + if(!(sort.equals("asc") || sort.equals("desc"))){ + throw new IllegalArgumentException(); + } + if(page < 0 || size <= 0){ + throw new IllegalArgumentException(); + } + return postService.findAll(size, from, sort); } @PostMapping(value = "/post") diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index 4842829b..078b986b 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service public class PostService { @@ -22,8 +23,14 @@ public PostService(UserService userService) { this.userService = userService; } - public List findAll() { - return posts; + public List findAll(Integer size, Integer from, String sort) { + return posts.stream().sorted((p0, p1) -> { + int comp = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки + if(sort.equals("desc")){ + comp = -1 * comp; //обратный порядок сортировки + } + return comp; + }).skip(from).limit(size).collect(Collectors.toList()); } private static Integer getNextId(){ From ec5cd72515f18697c91c9efa3fa832ec75615e93 Mon Sep 17 00:00:00 2001 From: kpmy Date: Wed, 20 Apr 2022 14:50:04 +0300 Subject: [PATCH 08/12] =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=B0=20=D0=9F=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=B0=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B0,=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PostFeedController.java | 78 +++++++++++++++++++ .../catsgram/service/PostService.java | 11 +++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java new file mode 100644 index 00000000..c8139fa6 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java @@ -0,0 +1,78 @@ +package ru.yandex.practicum.catsgram.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.model.Post; +import ru.yandex.practicum.catsgram.service.PostService; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@RestController() +public class PostFeedController { + + private final PostService postService; + + public PostFeedController(PostService postService){ + this.postService = postService; + } + + @PostMapping("/feed/friends") + List getFriendsFeed(@RequestBody String params){ + ObjectMapper objectMapper = new ObjectMapper(); + FriendsParams friendsParams; + try { + String paramsFromString = objectMapper.readValue(params, String.class); + friendsParams = objectMapper.readValue(paramsFromString, FriendsParams.class); + } catch (JsonProcessingException e) { + throw new RuntimeException("невалидный формат json", e); + } + + if(friendsParams != null){ + List result = new ArrayList<>(); + for (String friend : friendsParams.friends) { + result.addAll(postService.findAllByUserEmail(friend, friendsParams.size, friendsParams.sort)); + } + return result; + } else { + throw new RuntimeException("неверно заполнены параметры"); + } + } + + static class FriendsParams { + private String sort; + + private Integer size; + + private List friends; + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public List getFriends() { + return friends; + } + + public void setFriends(List friends) { + this.friends = friends; + } + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index 078b986b..951d7ed6 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -8,6 +8,7 @@ import ru.yandex.practicum.catsgram.model.User; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -56,4 +57,14 @@ public Post findPostById(Integer postId) { .findFirst() .orElseThrow(() -> new PostNotFoundException(String.format("Пост № %d не найден", postId))); } + + public List findAllByUserEmail(String email, Integer size, String sort) { + return posts.stream().filter(p -> email.equals(p.getAuthor())).sorted((p0, p1) -> { + int comp = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки + if(sort.equals("desc")){ + comp = -1 * comp; //обратный порядок сортировки + } + return comp; + }).limit(size).collect(Collectors.toList()); + } } From 49acd1e373f941e6e90c353bc306819e0cebb04f Mon Sep 17 00:00:00 2001 From: PracticumJava Date: Thu, 21 Apr 2022 20:48:16 +0300 Subject: [PATCH 09/12] prepare for error handling --- .../yandex/practicum/catsgram/Constants.java | 10 +++ .../catsgram/controller/PostController.java | 30 ++++---- .../controller/PostFeedController.java | 69 +++++-------------- .../catsgram/controller/UserController.java | 1 - .../exception/InvalidEmailException.java | 4 +- .../exception/PostNotFoundException.java | 1 - .../exception/UserAlreadyExistException.java | 4 +- .../practicum/catsgram/model/FeedParams.java | 33 +++++++++ .../catsgram/service/PostService.java | 49 +++++++------ .../catsgram/service/UserService.java | 20 +++--- 10 files changed, 119 insertions(+), 102 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/Constants.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/Constants.java b/src/main/java/ru/yandex/practicum/catsgram/Constants.java new file mode 100644 index 00000000..862424b0 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/Constants.java @@ -0,0 +1,10 @@ +package ru.yandex.practicum.catsgram; + +import java.util.Set; + +public class Constants { + public static final String DESCENDING_ORDER = "desc"; + public static final String ASCENDING_ORDER = "asc"; + + public static final Set SORTS = Set.of(ASCENDING_ORDER, DESCENDING_ORDER); +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index 1f4dd118..6a0295c4 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -1,34 +1,38 @@ package ru.yandex.practicum.catsgram.controller; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.service.PostService; import java.util.List; +import static ru.yandex.practicum.catsgram.Constants.DESCENDING_ORDER; +import static ru.yandex.practicum.catsgram.Constants.SORTS; + @RestController public class PostController { private final PostService postService; - @Autowired public PostController(PostService postService) { this.postService = postService; } @GetMapping("/posts") public List findAll( - @RequestParam(value = "page", defaultValue = "0", required = false) Integer page, - @RequestParam(value = "size", defaultValue = "10", required = false) Integer size, - @RequestParam(value = "sort", defaultValue = "desc", required = false) String sort) { - - Integer from = page * size; - if(!(sort.equals("asc") || sort.equals("desc"))){ - throw new IllegalArgumentException(); - } - if(page < 0 || size <= 0){ + @RequestParam(defaultValue = "0", required = false) Integer page, + @RequestParam(defaultValue = "10", required = false) Integer size, + @RequestParam(defaultValue = DESCENDING_ORDER, required = false) String sort + ) { + if (!SORTS.contains(sort) || page < 0 || size <= 0) { throw new IllegalArgumentException(); } + + Integer from = page * size; return postService.findAll(size, from, sort); } @@ -38,7 +42,7 @@ public Post create(@RequestBody Post post) { } @GetMapping("/post/{postId}") - public Post findPost(@PathVariable("postId") Integer postId){ + public Post findPost(@PathVariable("postId") Integer postId) { return postService.findPostById(postId); } } diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java index c8139fa6..7b2fe7eb 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java @@ -1,78 +1,41 @@ package ru.yandex.practicum.catsgram.controller; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.model.FeedParams; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.service.PostService; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; + +import static ru.yandex.practicum.catsgram.Constants.SORTS; @RestController() +@RequestMapping("/feed/friends") public class PostFeedController { private final PostService postService; - public PostFeedController(PostService postService){ + public PostFeedController(PostService postService) { this.postService = postService; } - @PostMapping("/feed/friends") - List getFriendsFeed(@RequestBody String params){ - ObjectMapper objectMapper = new ObjectMapper(); - FriendsParams friendsParams; - try { - String paramsFromString = objectMapper.readValue(params, String.class); - friendsParams = objectMapper.readValue(paramsFromString, FriendsParams.class); - } catch (JsonProcessingException e) { - throw new RuntimeException("невалидный формат json", e); - } - - if(friendsParams != null){ - List result = new ArrayList<>(); - for (String friend : friendsParams.friends) { - result.addAll(postService.findAllByUserEmail(friend, friendsParams.size, friendsParams.sort)); - } - return result; - } else { - throw new RuntimeException("неверно заполнены параметры"); - } - } - - static class FriendsParams { - private String sort; - - private Integer size; - - private List friends; - - public String getSort() { - return sort; - } - - public void setSort(String sort) { - this.sort = sort; - } - - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; + @PostMapping + List getFriendsFeed(@RequestBody FeedParams feedParams) { + if (!SORTS.contains(feedParams.getSort()) || feedParams.getFriendsEmails().isEmpty()) { + throw new IllegalArgumentException(); } - - public List getFriends() { - return friends; + if (feedParams.getSize() == null || feedParams.getSize() <= 0) { + throw new IllegalArgumentException(); } - public void setFriends(List friends) { - this.friends = friends; + List result = new ArrayList<>(); + for (String friendEmail : feedParams.getFriendsEmails()) { + result.addAll(postService.findAllByUserEmail(friendEmail, feedParams.getSize(), feedParams.getSort())); } + return result; } } diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java index ffaec3eb..9aad1650 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java @@ -12,7 +12,6 @@ public class UserController { private final UserService userService; - @Autowired public UserController(UserService userService) { this.userService = userService; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java index 47fd862b..36741ba1 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/InvalidEmailException.java @@ -1,7 +1,7 @@ package ru.yandex.practicum.catsgram.exception; public class InvalidEmailException extends RuntimeException { - public InvalidEmailException(String s) { - super(s); + public InvalidEmailException(String message) { + super(message); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java index 8f865c3e..4eb0c4ae 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/PostNotFoundException.java @@ -1,7 +1,6 @@ package ru.yandex.practicum.catsgram.exception; public class PostNotFoundException extends RuntimeException { - public PostNotFoundException(String message){ super(message); } diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java index b3681b26..8f52373f 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/UserAlreadyExistException.java @@ -1,7 +1,7 @@ package ru.yandex.practicum.catsgram.exception; public class UserAlreadyExistException extends RuntimeException { - public UserAlreadyExistException(String s) { - super(s); + public UserAlreadyExistException(String message) { + super(message); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java b/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java new file mode 100644 index 00000000..a55b2f34 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java @@ -0,0 +1,33 @@ +package ru.yandex.practicum.catsgram.model; + +import java.util.List; + +public class FeedParams { + private String sort; + private Integer size; + private List friendsEmails; + + public void setSort(String sort) { + this.sort = sort; + } + + public String getSort() { + return sort; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Integer getSize() { + return size; + } + + public void setFriendsEmails(List friendsEmails) { + this.friendsEmails = friendsEmails; + } + + public List getFriendsEmails() { + return friendsEmails; + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index 951d7ed6..f5e6bf10 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -8,10 +8,11 @@ import ru.yandex.practicum.catsgram.model.User; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; +import static ru.yandex.practicum.catsgram.Constants.DESCENDING_ORDER; + @Service public class PostService { private final UserService userService; @@ -24,20 +25,6 @@ public PostService(UserService userService) { this.userService = userService; } - public List findAll(Integer size, Integer from, String sort) { - return posts.stream().sorted((p0, p1) -> { - int comp = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки - if(sort.equals("desc")){ - comp = -1 * comp; //обратный порядок сортировки - } - return comp; - }).skip(from).limit(size).collect(Collectors.toList()); - } - - private static Integer getNextId(){ - return globalId++; - } - public Post create(Post post) { User postAuthor = userService.findUserByEmail(post.getAuthor()); if (postAuthor == null) { @@ -58,13 +45,31 @@ public Post findPostById(Integer postId) { .orElseThrow(() -> new PostNotFoundException(String.format("Пост № %d не найден", postId))); } + public List findAll(Integer size, Integer from, String sort) { + return posts.stream() + .sorted((p0, p1) -> compare(p0, p1, sort)) + .skip(from) + .limit(size) + .collect(Collectors.toList()); + } + public List findAllByUserEmail(String email, Integer size, String sort) { - return posts.stream().filter(p -> email.equals(p.getAuthor())).sorted((p0, p1) -> { - int comp = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки - if(sort.equals("desc")){ - comp = -1 * comp; //обратный порядок сортировки - } - return comp; - }).limit(size).collect(Collectors.toList()); + return posts.stream() + .filter(p -> email.equals(p.getAuthor())) + .sorted((p0, p1) -> compare(p0, p1, sort)) + .limit(size) + .collect(Collectors.toList()); + } + + private static Integer getNextId() { + return globalId++; + } + + private int compare(Post p0, Post p1, String sort) { + int result = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки + if (sort.equals(DESCENDING_ORDER)) { + result = -1 * result; //обратный порядок сортировки + } + return result; } } diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java index f3c63be8..44c6e9f6 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java @@ -18,21 +18,19 @@ public Collection findAll() { } public User createUser(User user) { - if (user.getEmail() == null || user.getEmail().isBlank()) { - throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); - } + checkEmail(user); if (users.containsKey(user.getEmail())) { - throw new UserAlreadyExistException("Пользователь с электронной почтой " + - user.getEmail() + " уже зарегистрирован."); + throw new UserAlreadyExistException(String.format( + "Пользователь с электронной почтой %s уже зарегистрирован.", + user.getEmail() + )); } users.put(user.getEmail(), user); return user; } public User updateUser(User user) { - if (user.getEmail() == null || user.getEmail().isBlank()) { - throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); - } + checkEmail(user); users.put(user.getEmail(), user); return user; @@ -44,4 +42,10 @@ public User findUserByEmail(String email) { } return users.get(email); } + + private void checkEmail(User user) { + if (user.getEmail() == null || user.getEmail().isBlank()) { + throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); + } + } } \ No newline at end of file From 03ee66a72ed84a770d68c203357f555bba20bc88 Mon Sep 17 00:00:00 2001 From: JustAlexB Date: Sat, 24 Dec 2022 19:40:24 +0300 Subject: [PATCH 10/12] =?UTF-8?q?refactor:=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catsgram/controller/ErrorHandler.java | 64 +++++++++++++++++++ .../catsgram/controller/PostController.java | 42 ++++++++++-- .../controller/PostFeedController.java | 12 ++-- .../IncorrectParameterException.java | 13 ++++ .../catsgram/model/ErrorResponse.java | 13 ++++ .../yandex/practicum/catsgram/model/Post.java | 10 ++- .../catsgram/service/PostService.java | 4 +- target/classes/application.properties | 1 + 8 files changed, 145 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/controller/ErrorHandler.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/exception/IncorrectParameterException.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/model/ErrorResponse.java create mode 100644 target/classes/application.properties diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/ErrorHandler.java b/src/main/java/ru/yandex/practicum/catsgram/controller/ErrorHandler.java new file mode 100644 index 00000000..aa28fce8 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/ErrorHandler.java @@ -0,0 +1,64 @@ +package ru.yandex.practicum.catsgram.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import ru.yandex.practicum.catsgram.exception.IncorrectParameterException; +import ru.yandex.practicum.catsgram.exception.InvalidEmailException; +import ru.yandex.practicum.catsgram.exception.PostNotFoundException; +import ru.yandex.practicum.catsgram.exception.UserAlreadyExistException; +import ru.yandex.practicum.catsgram.exception.UserNotFoundException; +import ru.yandex.practicum.catsgram.model.ErrorResponse; + +@RestControllerAdvice +public class ErrorHandler { + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleIncorrectParameterException(final IncorrectParameterException e) { + return new ErrorResponse( + String.format("Ошибка с полем \"%s\".", e.getParameter()) + ); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleInvalidEmailException(final InvalidEmailException e) { + return new ErrorResponse( + e.getMessage() + ); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handlePostNotFoundException(final PostNotFoundException e) { + return new ErrorResponse( + e.getMessage() + ); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handleUserNotFoundException(final UserNotFoundException e) { + return new ErrorResponse( + e.getMessage() + ); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.CONFLICT) + public ErrorResponse handlePostNotFoundException(final UserAlreadyExistException e) { + return new ErrorResponse( + e.getMessage() + ); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ErrorResponse handleThrowable(final Throwable e) { + return new ErrorResponse( + "Произошла непредвиденная ошибка." + ); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index 2b19e51d..a4340b23 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -1,25 +1,53 @@ package ru.yandex.practicum.catsgram.controller; - import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.exception.IncorrectParameterException; import ru.yandex.practicum.catsgram.model.Post; -import java.util.ArrayList; +import ru.yandex.practicum.catsgram.service.PostService; + import java.util.List; +import static ru.yandex.practicum.catsgram.Constants.DESCENDING_ORDER; +import static ru.yandex.practicum.catsgram.Constants.SORTS; + @RestController public class PostController { + private final PostService postService; - private final List posts = new ArrayList<>(); + public PostController(PostService postService) { + this.postService = postService; + } @GetMapping("/posts") - public List findAll() { - return posts; + public List findAll( + @RequestParam(defaultValue = "0", required = false) Integer page, + @RequestParam(defaultValue = "10", required = false) Integer size, + @RequestParam(defaultValue = DESCENDING_ORDER, required = false) String sort + ) { + if (!SORTS.contains(sort)) { + throw new IncorrectParameterException("sort"); + } + if (page < 0) { + throw new IncorrectParameterException("page"); + } + if (size <= 0) { + throw new IncorrectParameterException("size"); + } + Integer from = page * size; + return postService.findAll(size, from, sort); } @PostMapping(value = "/post") - public void create(@RequestBody Post post) { - posts.add(post); + public Post create(@RequestBody Post post) { + return postService.create(post); + } + + @GetMapping("/post/{postId}") + public Post findPost(@PathVariable("postId") Integer postId) { + return postService.findPostById(postId); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java index 7b2fe7eb..b66f050d 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.exception.IncorrectParameterException; import ru.yandex.practicum.catsgram.model.FeedParams; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.service.PostService; @@ -25,11 +26,14 @@ public PostFeedController(PostService postService) { @PostMapping List getFriendsFeed(@RequestBody FeedParams feedParams) { - if (!SORTS.contains(feedParams.getSort()) || feedParams.getFriendsEmails().isEmpty()) { - throw new IllegalArgumentException(); + if (!SORTS.contains(feedParams.getSort())) { + throw new IncorrectParameterException("sort"); } if (feedParams.getSize() == null || feedParams.getSize() <= 0) { - throw new IllegalArgumentException(); + throw new IncorrectParameterException("size"); + } + if (feedParams.getFriendsEmails().isEmpty()) { + throw new IncorrectParameterException("friendsEmails"); } List result = new ArrayList<>(); @@ -38,4 +42,4 @@ List getFriendsFeed(@RequestBody FeedParams feedParams) { } return result; } -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/exception/IncorrectParameterException.java b/src/main/java/ru/yandex/practicum/catsgram/exception/IncorrectParameterException.java new file mode 100644 index 00000000..efbea9a9 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/exception/IncorrectParameterException.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram.exception; + +public class IncorrectParameterException extends RuntimeException { + private final String parameter; + + public IncorrectParameterException(String parameter) { + this.parameter = parameter; + } + + public String getParameter() { + return parameter; + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/ErrorResponse.java b/src/main/java/ru/yandex/practicum/catsgram/model/ErrorResponse.java new file mode 100644 index 00000000..13659c56 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/model/ErrorResponse.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.catsgram.model; + +public class ErrorResponse { + private final String error; + + public ErrorResponse(String error) { + this.error = error; + } + + public String getError() { + return error; + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java index 6a4b8868..779f35b9 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java @@ -3,7 +3,7 @@ import java.time.Instant; public class Post { - + private Integer id; private final String author; // автор private final Instant creationDate = Instant.now(); // дата создания private String description; // описание @@ -15,6 +15,14 @@ public Post(String author, String description, String photoUrl) { this.photoUrl = photoUrl; } + public Integer getID() { + return id; + } + + public void setID(Integer id) { + this.id = id; + } + public String getAuthor() { return author; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index f5e6bf10..3e8074f8 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -33,14 +33,14 @@ public Post create(Post post) { post.getAuthor())); } - post.setId(getNextId()); + post.setID(getNextId()); posts.add(post); return post; } public Post findPostById(Integer postId) { return posts.stream() - .filter(p -> p.getId().equals(postId)) + .filter(p -> p.getID().equals(postId)) .findFirst() .orElseThrow(() -> new PostNotFoundException(String.format("Пост № %d не найден", postId))); } diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1 @@ + From 0fb9db76a2fa60e1e9c7b5585854a1dc962d493e Mon Sep 17 00:00:00 2001 From: JustAlexB Date: Tue, 24 Jan 2023 21:07:39 +0300 Subject: [PATCH 11/12] =?UTF-8?q?refactor:=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BF=D0=BE=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20=D1=83=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 +++ .../catsgram/CatsgramApplication.java | 5 +- .../catsgram/controller/PostController.java | 29 +------- .../controller/PostFeedController.java | 2 +- .../catsgram/controller/SimpleController.java | 15 ++++ .../catsgram/controller/UserController.java | 32 +++----- .../practicum/catsgram/dao/PostDao.java | 10 +++ .../practicum/catsgram/dao/UserDao.java | 9 +++ .../catsgram/dao/impl/PostDaoImpl.java | 42 +++++++++++ .../catsgram/dao/impl/UserDaoImpl.java | 37 ++++++++++ .../practicum/catsgram/model/FeedParams.java | 1 + .../yandex/practicum/catsgram/model/Post.java | 24 ++++-- .../yandex/practicum/catsgram/model/User.java | 45 +++++------- .../catsgram/service/HackCatService.java | 42 +++++++++++ .../catsgram/service/PostService.java | 73 +++++-------------- .../catsgram/service/UserService.java | 45 ++---------- src/main/resources/application.properties | 4 + target/classes/application.properties | 4 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 21 ++++++ 20 files changed, 274 insertions(+), 175 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/PostDao.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/UserDao.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/impl/PostDaoImpl.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/impl/UserDaoImpl.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/service/HackCatService.java create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/pom.xml b/pom.xml index a4bdb80c..f9d2d44f 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,15 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-data-jdbc + + + org.postgresql + postgresql + 42.3.3 + diff --git a/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java index 63f822d5..cae260e2 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java +++ b/src/main/java/ru/yandex/practicum/catsgram/CatsgramApplication.java @@ -2,12 +2,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @SpringBootApplication public class CatsgramApplication { - public static void main(String[] args) { SpringApplication.run(CatsgramApplication.class, args); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java index a4340b23..a1b715a9 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostController.java @@ -9,6 +9,7 @@ import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.service.PostService; +import java.util.Collection; import java.util.List; import static ru.yandex.practicum.catsgram.Constants.DESCENDING_ORDER; @@ -23,31 +24,7 @@ public PostController(PostService postService) { } @GetMapping("/posts") - public List findAll( - @RequestParam(defaultValue = "0", required = false) Integer page, - @RequestParam(defaultValue = "10", required = false) Integer size, - @RequestParam(defaultValue = DESCENDING_ORDER, required = false) String sort - ) { - if (!SORTS.contains(sort)) { - throw new IncorrectParameterException("sort"); - } - if (page < 0) { - throw new IncorrectParameterException("page"); - } - if (size <= 0) { - throw new IncorrectParameterException("size"); - } - Integer from = page * size; - return postService.findAll(size, from, sort); - } - - @PostMapping(value = "/post") - public Post create(@RequestBody Post post) { - return postService.create(post); - } - - @GetMapping("/post/{postId}") - public Post findPost(@PathVariable("postId") Integer postId) { - return postService.findPostById(postId); + public Collection findAll(@RequestParam String userId) { + return postService.findPostsByUser(userId); } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java index b66f050d..f639ed4d 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java @@ -38,7 +38,7 @@ List getFriendsFeed(@RequestBody FeedParams feedParams) { List result = new ArrayList<>(); for (String friendEmail : feedParams.getFriendsEmails()) { - result.addAll(postService.findAllByUserEmail(friendEmail, feedParams.getSize(), feedParams.getSort())); + result.addAll(postService.findPostsByUser(friendEmail, feedParams.getSize(), feedParams.getSort())); } return result; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java index be3380f6..62478e88 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/SimpleController.java @@ -2,9 +2,24 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.catsgram.service.HackCatService; + +import java.util.Optional; @RestController public class SimpleController { + private final HackCatService hackCatService; + public SimpleController(HackCatService hackCatService) { + this.hackCatService = hackCatService; + } + + @GetMapping("/do-hack") + public Optional doHack(){ + return hackCatService.doHackNow() + .map(password -> "Ура! Пароль подобран: " + password) + .or(() -> Optional.of("Не удалось подобрать пароль. " + + " Проверьте состояние и настройки базы данных.")); + } @GetMapping("/home") public String homePage() { diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java index 9aad1650..7d3e2b72 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/UserController.java @@ -1,11 +1,12 @@ package ru.yandex.practicum.catsgram.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import ru.yandex.practicum.catsgram.model.User; import ru.yandex.practicum.catsgram.service.UserService; -import java.util.Collection; +import java.util.Optional; @RestController @RequestMapping("/users") @@ -16,23 +17,8 @@ public UserController(UserService userService) { this.userService = userService; } - @GetMapping - public Collection findAll() { - return userService.findAll(); - } - - @PostMapping - public User createUser(@RequestBody User user) { - return userService.createUser(user); - } - - @PutMapping - public User updateUser(@RequestBody User user) { - return userService.updateUser(user); - } - - @GetMapping("/user/{userMail}") - public User getUser(@PathVariable("userMail") String userMail){ - return userService.findUserByEmail(userMail); + @GetMapping("/{login}") + public Optional getUser(@PathVariable String login){ + return userService.findUserById(login); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/PostDao.java b/src/main/java/ru/yandex/practicum/catsgram/dao/PostDao.java new file mode 100644 index 00000000..fff2a920 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/PostDao.java @@ -0,0 +1,10 @@ +package ru.yandex.practicum.catsgram.dao; + +import ru.yandex.practicum.catsgram.model.Post; +import ru.yandex.practicum.catsgram.model.User; + +import java.util.Collection; + +public interface PostDao { + Collection findPostsByUser(User user); +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/UserDao.java b/src/main/java/ru/yandex/practicum/catsgram/dao/UserDao.java new file mode 100644 index 00000000..7c884686 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/UserDao.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.catsgram.dao; + +import ru.yandex.practicum.catsgram.model.User; + +import java.util.Optional; + +public interface UserDao { + Optional findUserById(String id); +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/impl/PostDaoImpl.java b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/PostDaoImpl.java new file mode 100644 index 00000000..b00f7db6 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/PostDaoImpl.java @@ -0,0 +1,42 @@ +package ru.yandex.practicum.catsgram.dao.impl; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.catsgram.dao.PostDao; +import ru.yandex.practicum.catsgram.model.Post; +import ru.yandex.practicum.catsgram.model.User; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.Collection; + +@Component +public class PostDaoImpl implements PostDao { + private final JdbcTemplate jdbcTemplate; + + public PostDaoImpl(JdbcTemplate jdbcTemplate){ + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public Collection findPostsByUser(User user) { + // метод принимает в виде аргумента строку запроса, преобразователь и аргумент — id пользователя + String sql = "select * from cat_post where author_id = ? order by creation_date desc"; + + return jdbcTemplate.query(sql, (rs, rowNum) -> makePost(user, rs), user.getId()); + } + + private Post makePost(User user, ResultSet rs) throws SQLException { + // используем конструктор, методы ResultSet + // и готовое значение user + Integer id = rs.getInt("id"); + String description = rs.getString("description"); + String photoUrl = rs.getString("photo_url"); + + // Получаем дату и конвертируем её из sql.Date в time.LocalDate + LocalDate creationDate = rs.getDate("creation_date").toLocalDate(); + + return new Post(id, user, description, photoUrl, creationDate); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/impl/UserDaoImpl.java b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/UserDaoImpl.java new file mode 100644 index 00000000..9492bd5f --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/UserDaoImpl.java @@ -0,0 +1,37 @@ +package ru.yandex.practicum.catsgram.dao.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.catsgram.dao.UserDao; +import ru.yandex.practicum.catsgram.model.User; + +import java.util.Optional; +@Component +public class UserDaoImpl implements UserDao { + private final Logger log = LoggerFactory.getLogger(UserDaoImpl.class); + private final JdbcTemplate jdbcTemplate; + + public UserDaoImpl(JdbcTemplate jdbcTemplate){ + this.jdbcTemplate=jdbcTemplate; + } + + @Override + public Optional findUserById(String id) { + SqlRowSet userRows = jdbcTemplate.queryForRowSet("select * from cat_user where id = ?", id); + if(userRows.next()) { + log.info("Найден пользователь: {} {}", userRows.getString("id"), userRows.getString("nickname")); + // вы заполните данные пользователя в следующем уроке + User user = new User(userRows.getString("id"), + userRows.getString("username"), + userRows.getString("nickname")); + user.setId(id); + return Optional.of(user); + } else { + log.info("Пользователь с идентификатором {} не найден.", id); + return Optional.empty(); + } + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java b/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java index a55b2f34..219b1bc3 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/FeedParams.java @@ -31,3 +31,4 @@ public List getFriendsEmails() { return friendsEmails; } } + diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java index 779f35b9..6ee6b34f 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/model/Post.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Post.java @@ -1,33 +1,43 @@ package ru.yandex.practicum.catsgram.model; import java.time.Instant; +import java.time.LocalDate; public class Post { private Integer id; - private final String author; // автор - private final Instant creationDate = Instant.now(); // дата создания + private final User author; // автор + private final LocalDate creationDate; // дата создания private String description; // описание private String photoUrl; // url-адрес фотографии - public Post(String author, String description, String photoUrl) { + public Post(User author, String description, String photoUrl) { this.author = author; this.description = description; this.photoUrl = photoUrl; + this.creationDate = LocalDate.now(); } - public Integer getID() { + public Post(Integer id, User author, String description, String photoUrl, LocalDate creationDate) { + this.id = id; + this.author = author; + this.description = description; + this.photoUrl = photoUrl; + this.creationDate = creationDate; + } + + public Integer getId() { return id; } - public void setID(Integer id) { + public void setId(Integer id) { this.id = id; } - public String getAuthor() { + public User getAuthor() { return author; } - public Instant getCreationDate() { + public LocalDate getCreationDate() { return creationDate; } diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/User.java b/src/main/java/ru/yandex/practicum/catsgram/model/User.java index 2eb6f650..79c19ae0 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/model/User.java +++ b/src/main/java/ru/yandex/practicum/catsgram/model/User.java @@ -4,44 +4,39 @@ import java.util.Objects; public class User { - private String email; + private String id; + + private String username; + private String nickname; - private LocalDate birthdate; - public String getEmail() { - return email; + public User(String id, String username, String nickname) { + this.id = id; + this.username = username; + this.nickname = nickname; } - public void setEmail(String email) { - this.email = email; + public void setId(String id) { + this.id = id; } - public String getNickname() { - return nickname; + public String getUsername() { + return username; } - public void setNickname(String nickname) { - this.nickname = nickname; + public void setUsername(String username) { + this.username = username; } - public LocalDate getBirthdate() { - return birthdate; - } - - public void setBirthdate(LocalDate birthdate) { - this.birthdate = birthdate; + public String getNickname() { + return nickname; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return email.equals(user.email); + public void setNickname(String nickname) { + this.nickname = nickname; } - @Override - public int hashCode() { - return Objects.hash(email); + public String getId() { + return id; } } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/HackCatService.java b/src/main/java/ru/yandex/practicum/catsgram/service/HackCatService.java new file mode 100644 index 00000000..78a96d50 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/service/HackCatService.java @@ -0,0 +1,42 @@ +package ru.yandex.practicum.catsgram.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +@Service +public class HackCatService { + private Logger log = LoggerFactory.getLogger(getClass()); + public static final String JDBC_URL="jdbc:postgresql://127.0.0.1:5432/cats"; + public static final String JDBC_USERNAME="kitty"; + public static final String JDBC_DRIVER="org.postgresql.Driver"; + + public void tryPassword(String jdbcPassword) { + DriverManagerDataSource dataSourceConst = new DriverManagerDataSource(); + dataSourceConst.setDriverClassName(JDBC_DRIVER); + dataSourceConst.setUrl(JDBC_URL); + dataSourceConst.setUsername(JDBC_USERNAME); + dataSourceConst.setPassword(jdbcPassword); + JdbcTemplate jdbcTemplateConst = new JdbcTemplate(dataSourceConst); + jdbcTemplateConst.execute("SELECT 1;"); + } + + public Optional doHackNow(){ + List catWordList = Arrays.asList("meow", "purr", "purrrrrr", "zzz"); + for (String word : catWordList) { + try { + tryPassword(word); + return Optional.of(word); + } catch (Exception e) { + log.info("Такой пароль не подходит: " + word); + } + } + return Optional.empty(); + } +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java index 3e8074f8..79b309d6 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/PostService.java @@ -1,75 +1,42 @@ package ru.yandex.practicum.catsgram.service; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.yandex.practicum.catsgram.exception.PostNotFoundException; +import ru.yandex.practicum.catsgram.dao.PostDao; import ru.yandex.practicum.catsgram.exception.UserNotFoundException; import ru.yandex.practicum.catsgram.model.Post; import ru.yandex.practicum.catsgram.model.User; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; import java.util.stream.Collectors; -import static ru.yandex.practicum.catsgram.Constants.DESCENDING_ORDER; - @Service public class PostService { + private final PostDao postDao; private final UserService userService; - private final List posts = new ArrayList<>(); - - private static Integer globalId = 0; - @Autowired - public PostService(UserService userService) { + public PostService(PostDao postDao, UserService userService) { + this.postDao = postDao; this.userService = userService; } - public Post create(Post post) { - User postAuthor = userService.findUserByEmail(post.getAuthor()); - if (postAuthor == null) { - throw new UserNotFoundException(String.format( - "Пользователь %s не найден", - post.getAuthor())); - } - - post.setID(getNextId()); - posts.add(post); - return post; - } - - public Post findPostById(Integer postId) { - return posts.stream() - .filter(p -> p.getID().equals(postId)) - .findFirst() - .orElseThrow(() -> new PostNotFoundException(String.format("Пост № %d не найден", postId))); - } + public Collection findPostsByUser(String userId) { + User user = userService.findUserById(userId) + .orElseThrow(() ->new UserNotFoundException("Пользователь с идентификатором " + userId + " не найден.")); - public List findAll(Integer size, Integer from, String sort) { - return posts.stream() - .sorted((p0, p1) -> compare(p0, p1, sort)) - .skip(from) - .limit(size) - .collect(Collectors.toList()); + return postDao.findPostsByUser(user); } - public List findAllByUserEmail(String email, Integer size, String sort) { - return posts.stream() - .filter(p -> email.equals(p.getAuthor())) - .sorted((p0, p1) -> compare(p0, p1, sort)) + public Collection findPostsByUser(String authorId, Integer size, String sort) { + return findPostsByUser(authorId) + .stream() + .sorted((p0, p1) -> { + int comp = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки + if (sort.equals("desc")) { + comp = -1 * comp; //обратный порядок сортировки + } + return comp; + }) .limit(size) .collect(Collectors.toList()); } - - private static Integer getNextId() { - return globalId++; - } - - private int compare(Post p0, Post p1, String sort) { - int result = p0.getCreationDate().compareTo(p1.getCreationDate()); //прямой порядок сортировки - if (sort.equals(DESCENDING_ORDER)) { - result = -1 * result; //обратный порядок сортировки - } - return result; - } -} +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java index 44c6e9f6..ad0ca6fa 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/catsgram/service/UserService.java @@ -1,51 +1,20 @@ package ru.yandex.practicum.catsgram.service; import org.springframework.stereotype.Service; -import ru.yandex.practicum.catsgram.exception.InvalidEmailException; -import ru.yandex.practicum.catsgram.exception.UserAlreadyExistException; +import ru.yandex.practicum.catsgram.dao.UserDao; import ru.yandex.practicum.catsgram.model.User; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.Optional; @Service public class UserService { - private final Map users = new HashMap<>(); + private final UserDao userDao; - public Collection findAll() { - return users.values(); + public UserService(UserDao userDao) { + this.userDao = userDao; } - public User createUser(User user) { - checkEmail(user); - if (users.containsKey(user.getEmail())) { - throw new UserAlreadyExistException(String.format( - "Пользователь с электронной почтой %s уже зарегистрирован.", - user.getEmail() - )); - } - users.put(user.getEmail(), user); - return user; - } - - public User updateUser(User user) { - checkEmail(user); - users.put(user.getEmail(), user); - - return user; - } - - public User findUserByEmail(String email) { - if (email == null) { - return null; - } - return users.get(email); - } - - private void checkEmail(User user) { - if (user.getEmail() == null || user.getEmail().isBlank()) { - throw new InvalidEmailException("Адрес электронной почты не может быть пустым."); - } + public Optional findUserById(String id) { + return userDao.findUserById(id); } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891..fbe9f2e7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/cats +spring.datasource.username=kitty +spring.datasource.password=purrrrrr +spring.datasource.driver-class-name=org.postgresql.Driver \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index 8b137891..fbe9f2e7 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1 +1,5 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/cats +spring.datasource.username=kitty +spring.datasource.password=purrrrrr +spring.datasource.driver-class-name=org.postgresql.Driver \ No newline at end of file diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..02a8a6c8 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,21 @@ +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\dao\impl\UserDaoImpl.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\model\ErrorResponse.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\exception\UserNotFoundException.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\controller\PostFeedController.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\controller\ErrorHandler.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\CatsgramApplication.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\controller\PostController.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\exception\UserAlreadyExistException.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\service\UserService.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\dao\UserDao.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\exception\InvalidEmailException.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\model\FeedParams.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\controller\UserController.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\model\User.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\service\HackCatService.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\model\Post.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\service\PostService.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\Constants.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\exception\PostNotFoundException.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\exception\IncorrectParameterException.java +C:\Users\Aleks\dev\module2_catsgram\src\main\java\ru\yandex\practicum\catsgram\controller\SimpleController.java From 5b40e11c8febf0547d820147967b8a872e982c7d Mon Sep 17 00:00:00 2001 From: JustAlexB Date: Tue, 24 Jan 2023 21:29:03 +0300 Subject: [PATCH 12/12] =?UTF-8?q?refactor:=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BB=D0=B5=D0=BD=D1=82=D1=83=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PostFeedController.java | 41 ++++--------- .../practicum/catsgram/dao/FollowDao.java | 9 +++ .../catsgram/dao/impl/FollowDaoImpl.java | 61 +++++++++++++++++++ .../practicum/catsgram/model/Follow.java | 27 ++++++++ .../catsgram/service/FeedService.java | 20 ++++++ 5 files changed, 128 insertions(+), 30 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/FollowDao.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/dao/impl/FollowDaoImpl.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/model/Follow.java create mode 100644 src/main/java/ru/yandex/practicum/catsgram/service/FeedService.java diff --git a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java index f639ed4d..e06755dd 100644 --- a/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java +++ b/src/main/java/ru/yandex/practicum/catsgram/controller/PostFeedController.java @@ -1,45 +1,26 @@ package ru.yandex.practicum.catsgram.controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import ru.yandex.practicum.catsgram.exception.IncorrectParameterException; -import ru.yandex.practicum.catsgram.model.FeedParams; import ru.yandex.practicum.catsgram.model.Post; -import ru.yandex.practicum.catsgram.service.PostService; +import ru.yandex.practicum.catsgram.service.FeedService; -import java.util.ArrayList; import java.util.List; -import static ru.yandex.practicum.catsgram.Constants.SORTS; - @RestController() -@RequestMapping("/feed/friends") +@RequestMapping("/feed") public class PostFeedController { - private final PostService postService; + private final FeedService feedService; - public PostFeedController(PostService postService) { - this.postService = postService; + public PostFeedController(FeedService feedService) { + this.feedService = feedService; } - @PostMapping - List getFriendsFeed(@RequestBody FeedParams feedParams) { - if (!SORTS.contains(feedParams.getSort())) { - throw new IncorrectParameterException("sort"); - } - if (feedParams.getSize() == null || feedParams.getSize() <= 0) { - throw new IncorrectParameterException("size"); - } - if (feedParams.getFriendsEmails().isEmpty()) { - throw new IncorrectParameterException("friendsEmails"); - } - - List result = new ArrayList<>(); - for (String friendEmail : feedParams.getFriendsEmails()) { - result.addAll(postService.findPostsByUser(friendEmail, feedParams.getSize(), feedParams.getSort())); - } - return result; + @GetMapping + List getFriendsFeed(@RequestParam("userId") String userId, @RequestParam(defaultValue = "10") int max) { + return feedService.getFeedFor(userId, max); } -} \ No newline at end of file +} diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/FollowDao.java b/src/main/java/ru/yandex/practicum/catsgram/dao/FollowDao.java new file mode 100644 index 00000000..4a1c0522 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/FollowDao.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.catsgram.dao; +import ru.yandex.practicum.catsgram.model.Post; + +import java.util.List; + +public interface FollowDao { + List getFollowFeed(String userId, int max); +} + diff --git a/src/main/java/ru/yandex/practicum/catsgram/dao/impl/FollowDaoImpl.java b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/FollowDaoImpl.java new file mode 100644 index 00000000..faeb0938 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/dao/impl/FollowDaoImpl.java @@ -0,0 +1,61 @@ +package ru.yandex.practicum.catsgram.dao.impl; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.catsgram.dao.FollowDao; +import ru.yandex.practicum.catsgram.dao.PostDao; +import ru.yandex.practicum.catsgram.dao.UserDao; +import ru.yandex.practicum.catsgram.model.Follow; +import ru.yandex.practicum.catsgram.model.Post; +import ru.yandex.practicum.catsgram.model.User; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class FollowDaoImpl implements FollowDao { + + private final JdbcTemplate jdbcTemplate; + private final UserDao userDao; + private final PostDao postDao; + + public FollowDaoImpl(JdbcTemplate jdbcTemplate, UserDao userDao, PostDao postDao) { + this.jdbcTemplate = jdbcTemplate; + this.userDao = userDao; + this.postDao = postDao; + } + + @Override + public List getFollowFeed(String userId, int max) { + // получаем все подписки пользователя + String sql = "select * from cat_follow where follower_id = ?"; + List follows = jdbcTemplate.query(sql, (rs, rowNum) -> makeFollow(rs), userId); + + // выгружаем авторов на которых подписан пользователь + Set authors = follows.stream() + .map(Follow::getAuthor) + .map(userDao::findUserById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + + if(authors.isEmpty()) { + return Collections.emptyList(); + } + + // выгружаем посты полученных выше авторов + return authors.stream() + .map(postDao::findPostsByUser) + .flatMap(Collection::stream) + // сортируем от новых к старым + .sorted(Comparator.comparing(Post::getCreationDate).reversed()) + // отбрасываем лишнее + .limit(max) + .collect(Collectors.toList()); + } + + private Follow makeFollow(ResultSet rs) throws SQLException { + return new Follow(rs.getString("author_id"), rs.getString("follower_id")); + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/catsgram/model/Follow.java b/src/main/java/ru/yandex/practicum/catsgram/model/Follow.java new file mode 100644 index 00000000..9b2d1c99 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/model/Follow.java @@ -0,0 +1,27 @@ +package ru.yandex.practicum.catsgram.model; +public class Follow { + private String author; + private String follower; + + public Follow(String author, String follower) { + this.author = author; + this.follower = follower; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getFollower() { + return follower; + } + + public void setFollower(String follower) { + this.follower = follower; + } +} + diff --git a/src/main/java/ru/yandex/practicum/catsgram/service/FeedService.java b/src/main/java/ru/yandex/practicum/catsgram/service/FeedService.java new file mode 100644 index 00000000..0df25b30 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/catsgram/service/FeedService.java @@ -0,0 +1,20 @@ +package ru.yandex.practicum.catsgram.service; + +import org.springframework.stereotype.Service; +import ru.yandex.practicum.catsgram.dao.FollowDao; +import ru.yandex.practicum.catsgram.model.Post; + +import java.util.List; + +@Service +public class FeedService { + private final FollowDao followDao; + + public FeedService(FollowDao followDao) { + this.followDao = followDao; + } + + public List getFeedFor(String userId, int max) { + return followDao.getFollowFeed(userId, max); + } +}