From 86aeebd5138d3600044f160e53d4c62845282de3 Mon Sep 17 00:00:00 2001 From: Haeun-Y Date: Sat, 16 Sep 2023 07:04:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?#4=20feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/repository/CommentRepository.java | 4 + .../common/config/GlobalExceptionHandler.java | 16 +++ .../qna/scrap/repository/ScrapRepository.java | 4 + .../qna/user/controller/UserController.java | 44 ++++++- .../qna/user/dto/GetCommentResponse.java | 27 +++++ .../qna/user/dto/GetJunyProfileResponse.java | 15 +++ .../qna/user/dto/GetJunyQuestionResponse.java | 34 ++++++ .../qna/user/dto/GetScrapResponse.java | 35 ++++++ .../qna/user/dto/GetSinyAnswerResponse.java | 34 ++++++ .../qna/user/dto/GetSinyProfileResponse.java | 15 +++ .../ewhatever/qna/user/dto/UserResponse.java | 1 + .../qna/user/service/UserService.java | 110 ++++++++++++++++++ 12 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ewhatever/qna/common/config/GlobalExceptionHandler.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetCommentResponse.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetJunyProfileResponse.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetJunyQuestionResponse.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetScrapResponse.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetSinyAnswerResponse.java create mode 100644 src/main/java/com/ewhatever/qna/user/dto/GetSinyProfileResponse.java diff --git a/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java b/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java index b95d423..3a59a7d 100644 --- a/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java +++ b/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java @@ -1,7 +1,11 @@ package com.ewhatever.qna.comment.repository; import com.ewhatever.qna.comment.entity.Comment; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface CommentRepository extends JpaRepository { + Long countByWriter_UserIdxAndStatusEquals(Long userIdx, String status); + Page findByWriter_UserIdxAndStatusEquals(Long userIdx, String status, Pageable pageable); } diff --git a/src/main/java/com/ewhatever/qna/common/config/GlobalExceptionHandler.java b/src/main/java/com/ewhatever/qna/common/config/GlobalExceptionHandler.java new file mode 100644 index 0000000..a13bcf5 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/common/config/GlobalExceptionHandler.java @@ -0,0 +1,16 @@ +package com.ewhatever.qna.common.config; + +import com.ewhatever.qna.common.Base.BaseException; +import com.ewhatever.qna.common.Base.BaseResponse; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(BaseException.class) + protected BaseResponse handleBaseException(BaseException e) { + return new BaseResponse<>(e.getStatus()); + } + +} diff --git a/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java index ac4d2e4..35bfef8 100644 --- a/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java +++ b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java @@ -1,7 +1,11 @@ package com.ewhatever.qna.scrap.repository; import com.ewhatever.qna.scrap.entity.Scrap; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface ScrapRepository extends JpaRepository { + Long countByUser_UserIdxAndStatusEquals(Long userIdx, String status); + Page findByUser_UserIdxAndStatusEquals(Long userIdx, String status, Pageable pageable); } diff --git a/src/main/java/com/ewhatever/qna/user/controller/UserController.java b/src/main/java/com/ewhatever/qna/user/controller/UserController.java index 694721c..84cb875 100644 --- a/src/main/java/com/ewhatever/qna/user/controller/UserController.java +++ b/src/main/java/com/ewhatever/qna/user/controller/UserController.java @@ -1,9 +1,51 @@ package com.ewhatever.qna.user.controller; +import com.ewhatever.qna.common.Base.BaseException; +import com.ewhatever.qna.common.Base.BaseResponse; +import com.ewhatever.qna.user.dto.GetCommentResponse; +import com.ewhatever.qna.user.dto.GetJunyQuestionResponse; +import com.ewhatever.qna.user.dto.GetScrapResponse; +import com.ewhatever.qna.user.dto.GetSinyAnswerResponse; +import com.ewhatever.qna.user.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +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; -@RequestMapping +@RequestMapping("/users") @RestController +@RequiredArgsConstructor public class UserController { + + private final UserService userService; + + + @GetMapping + public BaseResponse getProfile() throws BaseException { + return userService.getProfile(); + } + + @GetMapping("/juny/questions") + public BaseResponse> getMyQuestions(@RequestParam(value = "status", defaultValue = "completed") String status, + @RequestParam(value = "requestPageNum", defaultValue = "0") int requestPageNum) throws BaseException { + return new BaseResponse<>(userService.getMyQuestions(status, requestPageNum)); + } + + @GetMapping("/siny/answers") + public BaseResponse> getMyAnswers(@RequestParam(value = "status", defaultValue = "completed") String status, + @RequestParam(value = "requestPageNum", defaultValue = "0") int requestPageNum) throws BaseException { + return new BaseResponse<>(userService.getMyAnswers(status, requestPageNum)); + } + + @GetMapping("/comments") + public BaseResponse> getMyComments(@RequestParam(value = "requestPageNum", defaultValue = "0") int requestPageNum) throws BaseException{ + return new BaseResponse<>(userService.getMyComments(requestPageNum)); + } + + @GetMapping("/scrap") + public BaseResponse> getMyScraps(@RequestParam(value = "requestPageNum", defaultValue = "0") int requestPageNum) throws BaseException{ + return new BaseResponse<>(userService.getMyScraps(requestPageNum)); + } } diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetCommentResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetCommentResponse.java new file mode 100644 index 0000000..c884819 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetCommentResponse.java @@ -0,0 +1,27 @@ +package com.ewhatever.qna.user.dto; + +import com.ewhatever.qna.comment.entity.Comment; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; + +@Builder +@Getter +@Setter +public class GetCommentResponse { + private String content; + private LocalDate createdDate; + private Long postIdx; + private String postTitle; + + //TODO : DTO 변환 메소드 위치 변경 + //TODO : dto에서 LocalDateTime -> LocalDate로 변경 + public static GetCommentResponse fromComment(Comment comment) { + return GetCommentResponse.builder().content(comment.getContent().substring(0, 16)) + .createdDate(comment.getCreatedDate().toLocalDate()) + .postIdx(comment.getPost().getPostIdx()) + .postTitle(comment.getPost().getTitle()).build(); + } +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetJunyProfileResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetJunyProfileResponse.java new file mode 100644 index 0000000..2076738 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetJunyProfileResponse.java @@ -0,0 +1,15 @@ +package com.ewhatever.qna.user.dto; + +import lombok.*; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Setter +@Getter +public class GetJunyProfileResponse { + private String name; + private Long questionCount; + private Long commentCount; + private Long scrapCount; +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetJunyQuestionResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetJunyQuestionResponse.java new file mode 100644 index 0000000..646c07e --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetJunyQuestionResponse.java @@ -0,0 +1,34 @@ +package com.ewhatever.qna.user.dto; + +import com.ewhatever.qna.common.enums.Category; +import com.ewhatever.qna.post.entity.Post; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static java.time.temporal.ChronoUnit.DAYS; + +@Builder +@Getter +@Setter +public class GetJunyQuestionResponse { + private String title; + private LocalDateTime date; + private Category category; + private Long answerCount; + private Long daysUntilDday; + + public static GetJunyQuestionResponse fromPost(Post post, Long answerCount, Boolean isJuicy) { + LocalDate targetDate = post.getCreatedDate().toLocalDate().plusDays(3); + LocalDateTime date = (isJuicy)? post.getLastModifiedDate() : post.getCreatedDate(); + return GetJunyQuestionResponse.builder() + .title(post.getTitle()) + .date(date) + .category(post.getCategory()) + .answerCount(answerCount) + .daysUntilDday(LocalDate.now().until(targetDate, DAYS)).build(); + } +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetScrapResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetScrapResponse.java new file mode 100644 index 0000000..d27169f --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetScrapResponse.java @@ -0,0 +1,35 @@ +package com.ewhatever.qna.user.dto; + +import com.ewhatever.qna.common.enums.Category; +import com.ewhatever.qna.post.entity.Post; +import com.ewhatever.qna.scrap.entity.Scrap; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Builder +@Setter +@Getter +public class GetScrapResponse { + private String postTitle; + private Long postIdx; + private Category category; + private String content; + private Long commentCount; + private Long scrapCount; + private LocalDateTime createdDate; + + //TODO : substring말고 잘라진 부분만 가져오게 수정? + public static GetScrapResponse fromScrap(Scrap scrap) { + Post post = scrap.getPost(); + return GetScrapResponse.builder().postTitle(post.getTitle()) + .postIdx(post.getPostIdx()) + .category(post.getCategory()) + .content(post.getContent().substring(0, 16)) + .commentCount(post.getCommentCount()) + .scrapCount(post.getScrapCount()) + .createdDate(post.getLastModifiedDate()).build(); + } +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetSinyAnswerResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetSinyAnswerResponse.java new file mode 100644 index 0000000..129ca32 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetSinyAnswerResponse.java @@ -0,0 +1,34 @@ +package com.ewhatever.qna.user.dto; + +import com.ewhatever.qna.answer.entity.Answer; +import com.ewhatever.qna.common.enums.Category; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static java.time.temporal.ChronoUnit.DAYS; + +@Builder +@Setter +@Getter +public class GetSinyAnswerResponse { + private String content; + private LocalDateTime date; + private Category category; + private Long answerCount; + private Long daysUntilDday; + + public static GetSinyAnswerResponse fromAnswer(Answer answer, Long answerCount, Boolean isJuicy) { + LocalDate targetDate = answer.getPost().getCreatedDate().toLocalDate().plusDays(3); + LocalDateTime date = (isJuicy)? answer.getPost().getLastModifiedDate() : answer.getPost().getCreatedDate(); + return GetSinyAnswerResponse.builder() + .content(answer.getContent().substring(0, 16)) + .date(date) + .category(answer.getPost().getCategory()) + .answerCount(answerCount) + .daysUntilDday(LocalDate.now().until(targetDate, DAYS)).build(); + } +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/GetSinyProfileResponse.java b/src/main/java/com/ewhatever/qna/user/dto/GetSinyProfileResponse.java new file mode 100644 index 0000000..b9afaab --- /dev/null +++ b/src/main/java/com/ewhatever/qna/user/dto/GetSinyProfileResponse.java @@ -0,0 +1,15 @@ +package com.ewhatever.qna.user.dto; + +import lombok.*; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Setter +@Getter +public class GetSinyProfileResponse { + private String name; + private Long answerCount; + private Long commentCount; + private Long scrapCount; +} diff --git a/src/main/java/com/ewhatever/qna/user/dto/UserResponse.java b/src/main/java/com/ewhatever/qna/user/dto/UserResponse.java index fdfc292..827fed2 100644 --- a/src/main/java/com/ewhatever/qna/user/dto/UserResponse.java +++ b/src/main/java/com/ewhatever/qna/user/dto/UserResponse.java @@ -1,4 +1,5 @@ package com.ewhatever.qna.user.dto; public class UserResponse { + } diff --git a/src/main/java/com/ewhatever/qna/user/service/UserService.java b/src/main/java/com/ewhatever/qna/user/service/UserService.java index 81cca07..d3b9847 100644 --- a/src/main/java/com/ewhatever/qna/user/service/UserService.java +++ b/src/main/java/com/ewhatever/qna/user/service/UserService.java @@ -1,7 +1,117 @@ package com.ewhatever.qna.user.service; +import com.ewhatever.qna.answer.repository.AnswerRepository; +import com.ewhatever.qna.comment.repository.CommentRepository; +import com.ewhatever.qna.common.Base.BaseException; +import com.ewhatever.qna.common.Base.BaseResponse; +import com.ewhatever.qna.post.repository.PostRepository; +import com.ewhatever.qna.scrap.repository.ScrapRepository; +import com.ewhatever.qna.user.dto.*; +import com.ewhatever.qna.user.entity.User; +import com.ewhatever.qna.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + +import static com.ewhatever.qna.common.Base.BaseResponseStatus.COMMON_NOT_FOUND; + @Service +@RequiredArgsConstructor public class UserService { + + private final UserRepository userRepository; + private final PostRepository postRepository; + private final CommentRepository commentRepository; + private final AnswerRepository answerRepository; + private final ScrapRepository scrapRepository; + + // TODO : 이거 BaseResponse 말고 객체 반환하도록 수정 + public BaseResponse getProfile() throws BaseException { + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + if(user.getRole().equals("SINY")) return getSinyProfile(user); + else return getJunyProfile(user); + } + + // TODO : code duplication 해결 + // TODO : getPageable 메소드 호출 + public Page getMyAnswers(String status, int requestPageNum) throws BaseException { + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + List sorts = new ArrayList<>(); + Boolean isJuicy; + if(status.equals("completed")) {//쥬시 완료 + isJuicy = true; + sorts.add(Sort.Order.desc("last_modified_date")); + } + else {//쥬시 대기 + isJuicy = false; + sorts.add(Sort.Order.desc("created_date")); + } + Pageable pageable = PageRequest.of(Math.max(requestPageNum-1, 0), 10, Sort.by(sorts)); + return answerRepository.findByAnswerer_UserIdxAndPost_IsJuicyAndStatusEquals(user.getUserIdx(), isJuicy,"active", pageable).map(answer -> + GetSinyAnswerResponse.fromAnswer(answer, answerRepository.countByPost_PostIdxAndStatusEquals(answer.getPost().getPostIdx(), "active"), isJuicy)); + } + + public Page getMyQuestions(String status, int requestPageNum) throws BaseException { + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + List sorts = new ArrayList<>(); + Boolean isJuicy; + if(status.equals("completed")) {//쥬시 완료 + isJuicy = true; + sorts.add(Sort.Order.desc("last_modified_date")); + } + else {//쥬시 대기 + isJuicy = false; + sorts.add(Sort.Order.desc("created_date")); + } + Pageable pageable = PageRequest.of(Math.max(requestPageNum-1, 0), 10, Sort.by(sorts)); + return postRepository.findByQuestioner_UserIdxAndIsJuicyAndStatusEquals(user.getUserIdx(), isJuicy,"active", pageable).map(post -> + GetJunyQuestionResponse.fromPost(post, answerRepository.countByPost_PostIdxAndStatusEquals(post.getPostIdx(), "active"), isJuicy)); + } + + public Page getMyComments(int requestPageNum) throws BaseException { + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + Pageable pageable = getPageable(requestPageNum, 10, "created_date"); + return commentRepository.findByWriter_UserIdxAndStatusEquals(user.getUserIdx(), "active", pageable).map(GetCommentResponse::fromComment); + } + + public Page getMyScraps(int requestPageNum) throws BaseException { + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + Pageable pageable = getPageable(requestPageNum, 10, "created_date"); + return scrapRepository.findByUser_UserIdxAndStatusEquals(user.getUserIdx(), "active", pageable).map(GetScrapResponse::fromScrap); + + } + + private Pageable getPageable(int requestPageNum, int pageSize, String property) { + List sorts = new ArrayList<>(); + sorts.add(Sort.Order.desc(property)); + return PageRequest.of(Math.max(requestPageNum-1, 0), pageSize, Sort.by(sorts)); + } + + private BaseResponse getJunyProfile(User user) { + return new BaseResponse<>(GetJunyProfileResponse.builder().name(user.getName()) + .questionCount(postRepository.countByQuestioner_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .commentCount(commentRepository.countByWriter_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .scrapCount(scrapRepository.countByUser_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .build()); + } + + private BaseResponse getSinyProfile(User user) { + return new BaseResponse<>(GetSinyProfileResponse.builder().name(user.getName()) + .answerCount(answerRepository.countByAnswerer_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .commentCount(commentRepository.countByWriter_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .scrapCount(scrapRepository.countByUser_UserIdxAndStatusEquals(user.getUserIdx(), "active")) + .build()); + } + + + //TODO : jwt token to userIdx + public Long getUserIdx() { + return 1L; + } } From 5e10f9655ee7bd3af3a2b6055906bdf1478a5282 Mon Sep 17 00:00:00 2001 From: Haeun-Y Date: Sat, 16 Sep 2023 07:24:32 +0900 Subject: [PATCH 2/3] =?UTF-8?q?#4=20fix:=20git=20conflict=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../answer/repository/AnswerRepository.java | 5 +++ .../qna/common/Base/BaseResponseStatus.java | 1 + .../qna/post/repository/PostRepository.java | 2 ++ .../com/ewhatever/qna/scrap/entity/Scrap.java | 34 +++++++++++++++++++ .../qna/scrap/repository/ScrapRepository.java | 11 ++++++ .../qna/user/service/UserService.java | 12 +++---- 6 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/ewhatever/qna/scrap/entity/Scrap.java create mode 100644 src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java diff --git a/src/main/java/com/ewhatever/qna/answer/repository/AnswerRepository.java b/src/main/java/com/ewhatever/qna/answer/repository/AnswerRepository.java index a7a0b23..f950c86 100644 --- a/src/main/java/com/ewhatever/qna/answer/repository/AnswerRepository.java +++ b/src/main/java/com/ewhatever/qna/answer/repository/AnswerRepository.java @@ -2,6 +2,8 @@ import com.ewhatever.qna.answer.entity.Answer; import com.ewhatever.qna.post.entity.Post; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -10,4 +12,7 @@ @Repository public interface AnswerRepository extends JpaRepository { List findAllByPost(Post post); + Long countByAnswerer_UserIdxAndStatusEquals(Long userIdx, String status); + Page findByAnswerer_UserIdxAndPost_IsJuicyAndStatusEquals(Long userIdx, Boolean isJuicy, String status, Pageable pageable); + Long countByPost_PostIdxAndStatusEquals(Long postIdx, String status); } \ No newline at end of file diff --git a/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java b/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java index 067d7aa..14a8816 100644 --- a/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java +++ b/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java @@ -22,6 +22,7 @@ public enum BaseResponseStatus { INVALID_CATEGORY(false, 2300, "잘못된 카테고리입니다."), // user(2400-2499) + INVALID_USER(false, 2400, "존재하지 않는 사용자에 대한 요청입니다."), /** diff --git a/src/main/java/com/ewhatever/qna/post/repository/PostRepository.java b/src/main/java/com/ewhatever/qna/post/repository/PostRepository.java index 2ed15fb..3056a69 100644 --- a/src/main/java/com/ewhatever/qna/post/repository/PostRepository.java +++ b/src/main/java/com/ewhatever/qna/post/repository/PostRepository.java @@ -14,4 +14,6 @@ public interface PostRepository extends JpaRepository { Page findAllByIsJuicy(Pageable pageable, Boolean isJuicy); Boolean existsByCategory(Category category); Page findByCategory(Category category, Pageable pageable); + Long countByQuestioner_UserIdxAndStatusEquals(Long userIdx, String status); + Page findByQuestioner_UserIdxAndIsJuicyAndStatusEquals(Long userIdx, Boolean isJuicy, String status, Pageable pageable); } diff --git a/src/main/java/com/ewhatever/qna/scrap/entity/Scrap.java b/src/main/java/com/ewhatever/qna/scrap/entity/Scrap.java new file mode 100644 index 0000000..851553c --- /dev/null +++ b/src/main/java/com/ewhatever/qna/scrap/entity/Scrap.java @@ -0,0 +1,34 @@ +package com.ewhatever.qna.scrap.entity; + +import com.ewhatever.qna.common.Base.BaseEntity; +import com.ewhatever.qna.post.entity.Post; +import com.ewhatever.qna.user.entity.User; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Scrap extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long scrapIdx; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_idx") + private Post post; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_idx") + private User user; + +} diff --git a/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java new file mode 100644 index 0000000..35bfef8 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java @@ -0,0 +1,11 @@ +package com.ewhatever.qna.scrap.repository; + +import com.ewhatever.qna.scrap.entity.Scrap; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScrapRepository extends JpaRepository { + Long countByUser_UserIdxAndStatusEquals(Long userIdx, String status); + Page findByUser_UserIdxAndStatusEquals(Long userIdx, String status, Pageable pageable); +} diff --git a/src/main/java/com/ewhatever/qna/user/service/UserService.java b/src/main/java/com/ewhatever/qna/user/service/UserService.java index d3b9847..6186ed2 100644 --- a/src/main/java/com/ewhatever/qna/user/service/UserService.java +++ b/src/main/java/com/ewhatever/qna/user/service/UserService.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import static com.ewhatever.qna.common.Base.BaseResponseStatus.COMMON_NOT_FOUND; +import static com.ewhatever.qna.common.Base.BaseResponseStatus.INVALID_USER; @Service @RequiredArgsConstructor @@ -33,7 +33,7 @@ public class UserService { // TODO : 이거 BaseResponse 말고 객체 반환하도록 수정 public BaseResponse getProfile() throws BaseException { - User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); if(user.getRole().equals("SINY")) return getSinyProfile(user); else return getJunyProfile(user); } @@ -41,7 +41,7 @@ public BaseResponse getProfile() throws BaseException { // TODO : code duplication 해결 // TODO : getPageable 메소드 호출 public Page getMyAnswers(String status, int requestPageNum) throws BaseException { - User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); List sorts = new ArrayList<>(); Boolean isJuicy; if(status.equals("completed")) {//쥬시 완료 @@ -58,7 +58,7 @@ public Page getMyAnswers(String status, int requestPageNu } public Page getMyQuestions(String status, int requestPageNum) throws BaseException { - User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); List sorts = new ArrayList<>(); Boolean isJuicy; if(status.equals("completed")) {//쥬시 완료 @@ -75,13 +75,13 @@ public Page getMyQuestions(String status, int requestPa } public Page getMyComments(int requestPageNum) throws BaseException { - User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); Pageable pageable = getPageable(requestPageNum, 10, "created_date"); return commentRepository.findByWriter_UserIdxAndStatusEquals(user.getUserIdx(), "active", pageable).map(GetCommentResponse::fromComment); } public Page getMyScraps(int requestPageNum) throws BaseException { - User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(COMMON_NOT_FOUND)); + User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); Pageable pageable = getPageable(requestPageNum, 10, "created_date"); return scrapRepository.findByUser_UserIdxAndStatusEquals(user.getUserIdx(), "active", pageable).map(GetScrapResponse::fromScrap); From 2eb8367d4890d20ad8dde3bb32c74391b0320a33 Mon Sep 17 00:00:00 2001 From: Haeun-Y Date: Sat, 16 Sep 2023 14:01:18 +0900 Subject: [PATCH 3/3] =?UTF-8?q?#4=20feat:=20user=20Role=20enum=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ewhatever/qna/answer/service/AnswerService.java | 3 ++- .../ewhatever/qna/common/Base/BaseResponseStatus.java | 1 + .../java/com/ewhatever/qna/common/enums/Role.java | 5 +++++ src/main/java/com/ewhatever/qna/user/entity/User.java | 11 ++++------- .../com/ewhatever/qna/user/service/UserService.java | 3 ++- 5 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/ewhatever/qna/common/enums/Role.java diff --git a/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java b/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java index c0020cf..a7b8b4b 100644 --- a/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java +++ b/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java @@ -4,6 +4,7 @@ import com.ewhatever.qna.answer.entity.Answer; import com.ewhatever.qna.answer.repository.AnswerRepository; import com.ewhatever.qna.common.Base.BaseException; +import com.ewhatever.qna.common.enums.Role; import com.ewhatever.qna.post.entity.Post; import com.ewhatever.qna.post.repository.PostRepository; import com.ewhatever.qna.user.entity.User; @@ -25,7 +26,7 @@ public void addAnswer(Long userIdx, PostAnswerReq postAnswerReq) throws BaseExce try { User user = userRepository.findByUserIdxAndStatusEquals(userIdx, ACTIVE); Post post = postRepository.findById(postAnswerReq.getPostIdx()).orElseThrow(() -> new BaseException(INVALID_POST_IDX)); - if (user.getRole().equals("Senior")) {//TODO: enum으로 변경 + if (user.getRole().equals(Role.SINY)) { Answer answer = Answer.builder() .content(postAnswerReq.getAnswer()) .answerer(user) diff --git a/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java b/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java index 4046164..a17c641 100644 --- a/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java +++ b/src/main/java/com/ewhatever/qna/common/Base/BaseResponseStatus.java @@ -24,6 +24,7 @@ public enum BaseResponseStatus { // user(2400-2499) NO_SENIOR_ROLE(false, 2400, "시니어가 아닙니다."), + INVALID_USER(false, 2401, "존재하지 않는 사용자에 대한 요청입니다."), /** diff --git a/src/main/java/com/ewhatever/qna/common/enums/Role.java b/src/main/java/com/ewhatever/qna/common/enums/Role.java new file mode 100644 index 0000000..6750409 --- /dev/null +++ b/src/main/java/com/ewhatever/qna/common/enums/Role.java @@ -0,0 +1,5 @@ +package com.ewhatever.qna.common.enums; + +public enum Role { + SINY, JUNY +} diff --git a/src/main/java/com/ewhatever/qna/user/entity/User.java b/src/main/java/com/ewhatever/qna/user/entity/User.java index 5685c3c..107e90b 100644 --- a/src/main/java/com/ewhatever/qna/user/entity/User.java +++ b/src/main/java/com/ewhatever/qna/user/entity/User.java @@ -1,10 +1,8 @@ package com.ewhatever.qna.user.entity; import com.ewhatever.qna.common.Base.BaseEntity; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import com.ewhatever.qna.common.enums.Role; +import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; @@ -34,7 +32,6 @@ public class User extends BaseEntity { private String provider; @NotNull - @Size(max = 30) - private String role; - + @Enumerated(value = EnumType.ORDINAL)//TODO : EnumType 수정 + private Role role; } \ No newline at end of file diff --git a/src/main/java/com/ewhatever/qna/user/service/UserService.java b/src/main/java/com/ewhatever/qna/user/service/UserService.java index 6186ed2..baaadb2 100644 --- a/src/main/java/com/ewhatever/qna/user/service/UserService.java +++ b/src/main/java/com/ewhatever/qna/user/service/UserService.java @@ -4,6 +4,7 @@ import com.ewhatever.qna.comment.repository.CommentRepository; import com.ewhatever.qna.common.Base.BaseException; import com.ewhatever.qna.common.Base.BaseResponse; +import com.ewhatever.qna.common.enums.Role; import com.ewhatever.qna.post.repository.PostRepository; import com.ewhatever.qna.scrap.repository.ScrapRepository; import com.ewhatever.qna.user.dto.*; @@ -34,7 +35,7 @@ public class UserService { // TODO : 이거 BaseResponse 말고 객체 반환하도록 수정 public BaseResponse getProfile() throws BaseException { User user = userRepository.findById(getUserIdx()).orElseThrow(()-> new BaseException(INVALID_USER)); - if(user.getRole().equals("SINY")) return getSinyProfile(user); + if(user.getRole().equals(Role.SINY)) return getSinyProfile(user); else return getJunyProfile(user); }