Вступление
Добро пожаловать в часть 8 создания клона Reddit с использованием Spring Boot и React.
Что мы строим в этой части?
- Голосовать ЗА
- Исключение для голосования
- Служба голосования
- Контролер голосования
В части 7 мы добавили конечные точки СОЗДАНИЯ и ЧТЕНИЯ для создания и чтения комментариев!!
Важные ссылки
- Внутренний источник: https://github.com/MaxiCB/vox-nobis/tree/master/backend
- Источник интерфейса: https://github.com/MaxiCB/vox-nobis/tree/master/client
- Прямой URL-АДРЕС: в процессе
Часть 1:: Голосовать ЗА 📨
Давайте рассмотрим наши DTO, которые нам понадобятся для получения и отправки информации о голосовании. Внутри com.your-name.backend.to мы создадим следующий класс.
- VoteDTO: Обрабатывает создание данных, которые будут отправлены с клиента в API.
import com.maxicb.backend.model.VoteType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class VoteDTO { private VoteType voteType; private Long id; }
Часть 2: Исключение для голосования 🚫
Давайте рассмотрим наши пользовательские исключения, которые нам понадобятся. Внутри com.your-name.backend.exception мы создадим следующий класс.
- Исключение для голосования: Обрабатывает исключения, связанные с поиском недопустимого пользователя.
package com.maxicb.backend.exception; public class VoteException extends RuntimeException { public VoteException(String message) { super(message); } }
Часть 3: Служба голосования 🌎
Давайте рассмотрим сервис голосования, который будет иметь наше приложение. Внутри com.your-name.backend.services добавьте следующий класс.
- VoteService: Содержит логику для сопоставления данных с DTO и из DTO и добавления голосов к сообщению.
package com.maxicb.backend.service; import com.maxicb.backend.dto.VoteDTO; import com.maxicb.backend.exception.PostNotFoundException; import com.maxicb.backend.model.Post; import com.maxicb.backend.model.Vote; import com.maxicb.backend.repository.PostRepository; import com.maxicb.backend.repository.VoteRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; import static com.maxicb.backend.model.VoteType.UPVOTE; @Service @AllArgsConstructor public class VoteService { private final VoteRepository voteRepository; private final PostRepository postRepository; private final AuthService authService; private Vote maptoVote(VoteDTO voteDTO, Post post) { return Vote.builder() .voteType(voteDTO.getVoteType()) .post(post) .user(authService.getCurrentUser()) .build(); } @Transactional public void vote(VoteDTO voteDTO) { Post post = postRepository.findById(voteDTO.getId()) .orElseThrow(() -> new PostNotFoundException("Post not found with id:" + voteDTO.getId())); OptionalvotePostAndUser = voteRepository.findTopByPostAndUserOrderByVoteIdDesc(post, authService.getCurrentUser()); if(votePostAndUser.isPresent() && votePostAndUser.get().getVoteType().equals(voteDTO.getVoteType())) { throw new PostNotFoundException("You've already " + voteDTO.getVoteType() + "'d this post"); } if(UPVOTE.equals(voteDTO.getVoteType())) { post.setVoteCount(post.getVoteCount() + 1); } else { post.setVoteCount(post.getVoteCount() - 1); } voteRepository.save(maptoVote(voteDTO, post)); postRepository.save(post); } }
Часть 4: Контролер голосования 🌐
Давайте рассмотрим контроллер голосования, который будет иметь наше приложение. Внутри com.your-name.backend.controller добавьте следующий класс.
- VoteController: Удерживайте конечные точки, добавляя голоса к определенному сообщению.
package com.maxicb.backend.controller; import com.maxicb.backend.dto.VoteDTO; import com.maxicb.backend.service.VoteService; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; 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; @RestController @RequestMapping("/api/vote") @AllArgsConstructor public class VoteController { private final VoteService voteService; @PostMapping public ResponseEntityvote(@RequestBody VoteDTO voteDTO) { voteService.vote(voteDTO); return new ResponseEntity<>(HttpStatus.OK); } }
Вывод 🔍
- Чтобы убедиться, что все настроено правильно, вы можете запустить приложение и убедиться, что в консоли нет ошибок. В нижней части консоли вы должны увидеть вывод, аналогичный приведенному ниже
- Если в консоли нет ошибок, вы можете протестировать логику голосования, отправив post-запрос по адресу http://localhost:8080/api/vote со следующими данными. Вам все равно придется выполнить те же действия, что и в предыдущих частях, чтобы войти в учетную запись для создания сообщений, а также создать субреддит и действительную запись для добавления комментария.
{ "voteType": "UPVOTE", "id":}
- Теперь вы можете отправить запрос GET в http://localhost:8080/api/posts/ чтобы увидеть изменение подсчета голосов в посте, за который вы только что проголосовали.
{ "postId": 9, "postTitle": "Testing Post", "url": "URL", "description": "DESCRIPTION", "userName": "USERNAME", "subredditName": "/r/NAME", "voteCount": 1, "commentCount": 1, "duration": "4 hours ago", "upVote": true, "downVote": false }
- В этой статье мы реализовали логику голосования по постам!.
Следующий
Следите за новостями, чтобы получить информацию о выходе девятой части, где мы расскажем о функциях после голосования! Если у вас есть какие-либо вопросы, обязательно оставьте комментарий!
Оригинал: “https://dev.to/maxicb/full-stack-reddit-clone-spring-boot-react-electron-app-part-8-oa7”