전체 스택 Reddit 클론 - Spring Boot, React, Electron 앱 - 8부
6481 단어 reactjavascripttypescriptjava
전체 스택 Reddit 클론 - Spring Boot, React, Electron 앱 - 8부
소개
Spring Boot 및 React를 사용하여 Reddit 클론 생성의 8부에 오신 것을 환영합니다.
이 부분에서 우리는 무엇을 만들고 있습니까?
댓글을 작성하고 읽기 위한 CREATE && READ 끝점을 추가했습니다!!
중요한 링크
파트 1: DTO 투표 📨
투표 정보를 수신하고 전송하는 데 필요한 DTO를 다루겠습니다. com.your-name.backend.dto 내부에 다음 클래스를 생성합니다.
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 내부에 다음 클래스를 추가합니다.
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()));
Optional<Vote> votePostAndUser = 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 내부에 다음 클래스를 추가합니다.
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 ResponseEntity<Void> vote(@RequestBody VoteDTO voteDTO) {
voteService.vote(voteDTO);
return new ResponseEntity<>(HttpStatus.OK);
}
}
결론 🔍
{
"voteType": "UPVOTE",
"id": <post-id>
}
{
"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
}
다음
게시물 투표 기능을 다룰 파트 9가 출시될 때 알림을 받으려면 팔로우하세요! 질문이 있으시면 댓글을 남겨주세요!
Reference
이 문제에 관하여(전체 스택 Reddit 클론 - Spring Boot, React, Electron 앱 - 8부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maxicb/full-stack-reddit-clone-spring-boot-react-electron-app-part-8-oa7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)