Вступление
Добро пожаловать в часть 7 о создании клона Reddit с помощью Spring Boot и реагируйте.
Что мы строим в этой части?
- Запрос комментариев К
- Комментарий Ответ НА
- Обновить репозиторий комментариев
- Служба комментариев
- Конечные точки чтения Комментариев
- СОЗДАТЬ конечную точку комментария
В части 6 мы добавили некоторые пользовательские исключения и сделали наши конечные точки post!
Важные ссылки
- Внутренний источник: https://github.com/MaxiCB/vox-nobis/tree/master/backend
- Источник интерфейса: https://github.com/MaxiCB/vox-nobis/tree/master/client
- Живой URL-адрес: в процессе
Часть 1: Комментарий DTO 📨
Давайте рассмотрим различные DTO, которые нам понадобятся для комментариев. Внутри com.your-name.backend.to мы создадим следующие классы.
- Запрос комментария: Обрабатывает создание данных, которые будут отправлены клиентом в API.
package com.maxicb.backend.dto; import com.maxicb.backend.model.Post; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class CommentRequest { private Long id; private String text; private Post post; }
- Ответ на комментарий: Обрабатывает создание данных, которые будут отправлены клиенту из API.
package com.maxicb.backend.dto; import com.maxicb.backend.model.User; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.time.Instant; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class CommentResponse { private Long id; private String text; private Long postId; private Instant creationDate; private User user; }
Часть 2. Обновление репозитория комментариев 📨
Давайте рассмотрим обновление нашего репозитория комментариев для поддержки разбиения на страницы и сортировки. Внутри com.your-name.backend.repository мы обновим следующие классы.
- Хранилище комментариев
package com.maxicb.backend.repository; import com.maxicb.backend.model.Comment; import com.maxicb.backend.model.Post; import com.maxicb.backend.model.User; import org.springframework.data.repository.PagingAndSortingRepository; import java.util.List; public interface CommentRepository extends PagingAndSortingRepository{ List findByPost(Post post); List findAllByUser(User user); }
Часть 3: Служба комментариев 🌎
Давайте рассмотрим сервис комментариев, который будет иметь наше приложение. Внутри com.your-name.backend.services добавьте следующий класс.
- Служба комментариев: Поддерживает логику сопоставления данных с и с, получения всех комментариев по опубликованным, получения комментариев конкретных пользователей и добавления комментариев к публикациям.
package com.maxicb.backend.service; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.maxicb.backend.dto.CommentRequest; import com.maxicb.backend.dto.CommentResponse; import com.maxicb.backend.exception.PostNotFoundException; import com.maxicb.backend.exception.UserNotFoundException; import com.maxicb.backend.model.Comment; import com.maxicb.backend.model.Post; import com.maxicb.backend.model.User; import com.maxicb.backend.repository.CommentRepository; import com.maxicb.backend.repository.PostRepository; import com.maxicb.backend.repository.UserRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; import java.util.stream.Collectors; @Service @AllArgsConstructor @Transactional public class CommentService { private final UserRepository userRepository; private final PostRepository postRepository; private final CommentRepository commentRepository; private final AuthService authService; private CommentResponse mapToResponse(Comment comment) { return CommentResponse.builder() .id(comment.getId()) .text(comment.getText()) .postId(comment.getPost().getPostId()) .creationDate(TimeAgo.using(comment.getCreationDate().toEpochMilli())) .userName(comment.getUser().getUsername()) .build(); } private Comment mapToComment(CommentRequest commentRequest) { User user = authService.getCurrentUser(); Post post = postRepository.findById(commentRequest.getPostId()) .orElseThrow(() -> new PostNotFoundException("Post not found with id: " + commentRequest.getPostId())); return Comment.builder() .text(commentRequest.getText()) .post(post) .creationDate(Instant.now()) .user(user) .build(); } public CommentResponse save(CommentRequest commentRequest) { return mapToResponse(commentRepository.save(mapToComment(commentRequest))); } public ListgetCommentsForPost(Long id) { Post post = postRepository.findById(id) .orElseThrow(() -> new PostNotFoundException("Post not found with id: " + id)); return commentRepository.findByPost(post) .stream() .map(this::mapToResponse) .collect(Collectors.toList()); } public List getCommentsForUser(Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new UserNotFoundException("User not found with id: " + id)); return commentRepository.findAllByUser(user) .stream() .map(this::mapToResponse) .collect(Collectors.toList()); } }
Часть 4: Контроллер комментариев 🌐
Давайте рассмотрим контроллер комментариев, который будет иметь наше приложение. Внутри com.your-name.backend.controller добавьте следующий класс.
- Контроллер комментариев: Удерживайте конечные точки для получения комментариев, создания комментариев, получения комментариев к сообщению и комментариев конкретных пользователей.
package com.maxicb.backend.controller; import com.maxicb.backend.dto.CommentRequest; import com.maxicb.backend.dto.CommentResponse; import com.maxicb.backend.service.CommentService; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/comments") @AllArgsConstructor public class CommentController { private final CommentService commentService; @PostMapping public ResponseEntityaddComment(@RequestBody CommentRequest commentRequest) { return new ResponseEntity<>(commentService.save(commentRequest), HttpStatus.CREATED); } @GetMapping("/post/{id}") public ResponseEntity > getCommentsByPost(@PathVariable Long id) { return new ResponseEntity<>(commentService.getCommentsForPost(id), HttpStatus.OK); } @GetMapping("/user/{id}") public ResponseEntity
> getCommentsByUser(@PathVariable Long id) { return new ResponseEntity<>(commentService.getCommentsForUser(id), HttpStatus.OK); } }
Вывод 🔍
- Чтобы убедиться, что все настроено правильно, вы можете запустить приложение и убедиться, что в консоли нет ошибок. В нижней части консоли вы должны увидеть вывод, аналогичный приведенному ниже
- Если в консоли нет ошибок, вы можете проверить логику создания комментариев, отправив запрос post на http://localhost:8080/api/comments со следующими данными. Вам все равно придется выполнить те же действия, описанные в предыдущих частях, чтобы войти в учетную запись для публикации, а также создать субреддит и действительную публикацию для добавления комментария.
{ "postId":, "text": "My First Comment!!" }
- В этой статье мы добавили конечные точки СОЗДАНИЯ и ЧТЕНИЯ для создания и чтения комментариев!.
Следующий
Система голосования! Часть 8
Оригинал: “https://dev.to/maxicb/full-stack-reddit-clone-spring-boot-react-electron-app-part-7-17mg”