From 60af4bf9e106d5fd59f4d862a3deab3d7928bdaa Mon Sep 17 00:00:00 2001 From: JOO WON SEO Date: Tue, 21 May 2024 02:33:22 +0900 Subject: [PATCH] =?UTF-8?q?Merge:=20Main=20Merge=2034=EC=B0=A8=20(#159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :bug: Hotfix: 댓글 수정 request dto 추가 (#149) * Hotfix : 댓글 삭제 시 게시물의 댓글 수 차감 로직 수정 (#151) * :bug: Hotfix: 댓글 수정 request dto 추가 * :bug: Hotfix: 댓글 삭제 시 게시물의 댓글 수 차감 로직 수정 * Feat: 프로필 이모지 설정 로직 구현 (#153) * :card_file_box: profile 속성의 Enum value ProfileEmoji 생성 * :card_file_box: profile 속성 ProfileEmoji 설정 * :sparkles: Feat: 회원 가입 및 정보 수정에 프로필 이모지 설정 로직 추가 * Refactor : 모델 삭제 시 soft delete 구현 (#155) * :card_file_box: versionStatus 속성의 Enum value VersionStatus 생성 * :card_file_box: versionStatus 속성 추가 * :necktie: 모델 삭제 시 sofe delete 구현 * :necktie: 모델 삭제 시 sofe delete 구현 * Fix: 타 사용자 자소서 조회 시 포인트 사용 로직 수정 (#157) * :card_file_box: coverletter 외래키 추가 * :necktie: 자소서 조회 포인트 사용 시, point 데이터에 coverletter 삽입 로직 추가 * :necktie: 자소서 상세 조회 시 포인트를 사용한 자소서인지 나타내는 변수 추가 * Refactor: 댓글 대댓글 계층 구조 적용 (#158) * :card_file_box: 댓글 계층 구조 나타내는 속성 추가 * :card_file_box: db 변경 사항에 따른 댓글 작성 로직 수정 * :necktie: db 변경 사항에 따른 댓글 목록 조회 로직 수정 * :fire: 필요 없는 메소드 삭제 * :necktie: 비활성/탈퇴 회원 제거 로직 추가 --- .../repository/EmploymentBoardRepository.java | 8 +-- .../repository/GroupBoardRepository.java | 8 +-- .../meetfolio/domain/comment/Comment.java | 9 +++ .../domain/comment/dto/CommentResponse.java | 70 ++++++++----------- .../comment/repository/CommentRepository.java | 21 +++++- .../service/CommentCommandService.java | 18 ++--- .../comment/service/CommentQueryService.java | 14 +++- .../controller/CoverLetterController.java | 2 +- .../coverLetter/dto/CoverLetterResponse.java | 6 +- .../service/CoverLetterQueryService.java | 17 ++++- .../codez4/meetfolio/domain/point/Point.java | 5 ++ .../point/controller/PointController.java | 31 ++++---- .../domain/point/dto/PointRequest.java | 4 ++ .../point/repository/PointRepository.java | 4 ++ 14 files changed, 135 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/codez4/meetfolio/domain/board/repository/EmploymentBoardRepository.java b/src/main/java/com/codez4/meetfolio/domain/board/repository/EmploymentBoardRepository.java index 2726f99..a986ab6 100644 --- a/src/main/java/com/codez4/meetfolio/domain/board/repository/EmploymentBoardRepository.java +++ b/src/main/java/com/codez4/meetfolio/domain/board/repository/EmploymentBoardRepository.java @@ -12,18 +12,18 @@ public interface EmploymentBoardRepository extends JpaRepository { @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb WHERE eb.id = :boardId") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb WHERE eb.id = :boardId AND eb.member.status = 'ACTIVE'") BoardQueryItem queryFindEmploymentBoard(Member member,Long boardId); @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb WHERE eb.member.status = 'ACTIVE'") Page queryFindAllEmploymentBoards(Member member, Pageable pageable); @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email, (SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb WHERE eb.jobKeyword = :jobKeyword ") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email, (SELECT l.status FROM Like l WHERE l.member = :member AND eb = l.board)) FROM EmploymentBoard eb WHERE eb.jobKeyword = :jobKeyword AND eb.member.status = 'ACTIVE'") Page queryFindAllEmploymentBoardsByJobKeyword(Member member, JobKeyword jobKeyword, Pageable pageable); @Query(value = "SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email, (SELECT l.status from Like l WHERE l.member = :member AND l.board = eb)) FROM EmploymentBoard eb WHERE eb.title LIKE CONCAT('%', :keyword , '%') ") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(eb, eb.member.email, (SELECT l.status from Like l WHERE l.member = :member AND l.board = eb)) FROM EmploymentBoard eb WHERE eb.title LIKE CONCAT('%', :keyword , '%') AND eb.member.status = 'ACTIVE'") Page queryFindBoardsByKeyword(Member member, String keyword, Pageable pageable); } diff --git a/src/main/java/com/codez4/meetfolio/domain/board/repository/GroupBoardRepository.java b/src/main/java/com/codez4/meetfolio/domain/board/repository/GroupBoardRepository.java index 05768e7..049ecae 100644 --- a/src/main/java/com/codez4/meetfolio/domain/board/repository/GroupBoardRepository.java +++ b/src/main/java/com/codez4/meetfolio/domain/board/repository/GroupBoardRepository.java @@ -11,18 +11,18 @@ public interface GroupBoardRepository extends JpaRepository { @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb WHERE gb.id = :boardId") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb WHERE gb.id = :boardId AND gb.member.status = 'ACTIVE'") BoardQueryItem queryFindBoard(Member member, Long boardId); @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email,(SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb WHERE gb.member.status = 'ACTIVE'") Page queryFindAllBoards(Member member, Pageable pageable); @Query("SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email, (SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb WHERE gb.groupCategory = :groupCategory ") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email, (SELECT l.status FROM Like l WHERE l.member = :member AND gb = l.board)) FROM GroupBoard gb WHERE gb.groupCategory = :groupCategory AND gb.member.status = 'ACTIVE'") Page queryFindAllBoardsByGroupCategory(Member member, GroupCategory groupCategory, Pageable pageable); @Query(value = "SELECT " + - "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email, (SELECT l.status from Like l WHERE l.member = :member AND l.board = gb)) FROM GroupBoard gb WHERE gb.title LIKE CONCAT('%', :keyword , '%') ") + "NEW com.codez4.meetfolio.domain.board.dto.BoardQueryItem(gb, gb.member.email, (SELECT l.status from Like l WHERE l.member = :member AND l.board = gb)) FROM GroupBoard gb WHERE gb.title LIKE CONCAT('%', :keyword , '%') AND gb.member.status = 'ACTIVE'") Page queryFindBoardsByKeyword(Member member, String keyword, Pageable pageable); } diff --git a/src/main/java/com/codez4/meetfolio/domain/comment/Comment.java b/src/main/java/com/codez4/meetfolio/domain/comment/Comment.java index c20a607..4f71afe 100644 --- a/src/main/java/com/codez4/meetfolio/domain/comment/Comment.java +++ b/src/main/java/com/codez4/meetfolio/domain/comment/Comment.java @@ -39,6 +39,15 @@ public class Comment extends BaseTimeEntity { @OneToMany(mappedBy = "parentComment", orphanRemoval = true, cascade = CascadeType.ALL) private List children = new ArrayList<>(); + @Column(nullable = false) + private int ref; + + @Column(nullable = false) + private int refOrder; + + @Column(nullable = false) + private int step; + /** * update */ diff --git a/src/main/java/com/codez4/meetfolio/domain/comment/dto/CommentResponse.java b/src/main/java/com/codez4/meetfolio/domain/comment/dto/CommentResponse.java index 6b57756..787366d 100644 --- a/src/main/java/com/codez4/meetfolio/domain/comment/dto/CommentResponse.java +++ b/src/main/java/com/codez4/meetfolio/domain/comment/dto/CommentResponse.java @@ -80,20 +80,14 @@ public static class MyCommentList { } - public static CommentResult toCommentResult(Slice comments) { - - // 부모 댓글만 반환하기 (자식 댓글은 부모 댓글 안에 담아서 전달) - List commentItems = comments.stream() - .filter(comment -> comment.getParentComment() == null) - .map(CommentResponse::toCommentItem) - .toList(); + public static CommentResult toCommentResult(List commentItems, Slice comments) { return CommentResult.builder() - .commentItems(commentItems) - .hasNext(comments.hasNext()) - .isFirst(comments.isFirst()) - .isLast(comments.isLast()) - .build(); + .commentItems(commentItems) + .hasNext(comments.hasNext()) + .isFirst(comments.isFirst()) + .isLast(comments.isLast()) + .build(); } public static MyCommentResult toMyCommentResult(MemberResponse.MemberInfo memberInfo, Page comments) { @@ -103,7 +97,7 @@ public static MyCommentResult toMyCommentResult(MemberResponse.MemberInfo member .build(); } - public static MyCommentList toMyCommentList(Page comments){ + public static MyCommentList toMyCommentList(Page comments) { List commentItems = comments.stream().toList(); return MyCommentList.builder() .commentInfo(commentItems) @@ -166,7 +160,7 @@ public static class MyCommentItem { } - public static MyCommentItem toMyCommentItem(Comment comment){ + public static MyCommentItem toMyCommentItem(Comment comment) { Board board = comment.getBoard(); return MyCommentItem.builder() .commentId(comment.getId()) @@ -177,28 +171,19 @@ public static MyCommentItem toMyCommentItem(Comment comment){ .build(); } - public static CommentItem toCommentItem(Comment comment) { + public static CommentItem toCommentItem(Comment comment, List childComments) { Member member = comment.getMember(); long sinceCreation = TimeUtils.getSinceCreation(comment.getCreatedAt()); return CommentItem.builder() - .commentId(comment.getId()) - .content(comment.getContent()) - .memberName(member.getEmail().split("@")[0]) - .profile(member.getProfile().name()) - .sinceCreation(sinceCreation) - .childComments(getChildList(comment)) - .build(); - } - - private static List getChildList(Comment comment) { - - return Optional.ofNullable(comment.getChildren()) - .orElse(new ArrayList<>()) - .stream() - .map(CommentResponse::toCommentItem) - .toList(); + .commentId(comment.getId()) + .content(comment.getContent()) + .memberName(member.getEmail().split("@")[0]) + .profile(member.getProfile().name()) + .sinceCreation(sinceCreation) + .childComments(childComments) + .build(); } @Schema(description = "댓글 처리 응답 DTO") @@ -218,20 +203,23 @@ public static class CommentProc { public static CommentProc toCommentProc(Long commentId) { return CommentProc.builder() - .commentId(commentId) - .createdAt(LocalDateTime.now()) - .build(); + .commentId(commentId) + .createdAt(LocalDateTime.now()) + .build(); } - public static Comment toEntity(Member member, Board board, String content, - Comment parentComment) { + public static Comment toEntity(Member member, Board board, String content,Comment parentComment, int ref, int refOrder, int + step) { return Comment.builder() - .member(member) - .board(board) - .content(content) - .parentComment(parentComment) - .build(); + .member(member) + .board(board) + .content(content) + .parentComment(parentComment) + .ref(ref) + .refOrder(refOrder) + .step(step) + .build(); } diff --git a/src/main/java/com/codez4/meetfolio/domain/comment/repository/CommentRepository.java b/src/main/java/com/codez4/meetfolio/domain/comment/repository/CommentRepository.java index dae0b00..644a3ef 100644 --- a/src/main/java/com/codez4/meetfolio/domain/comment/repository/CommentRepository.java +++ b/src/main/java/com/codez4/meetfolio/domain/comment/repository/CommentRepository.java @@ -1,5 +1,6 @@ package com.codez4.meetfolio.domain.comment.repository; +import com.codez4.meetfolio.domain.board.Board; import com.codez4.meetfolio.domain.comment.Comment; import com.codez4.meetfolio.domain.member.Member; import org.springframework.data.domain.Page; @@ -10,16 +11,32 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface CommentRepository extends JpaRepository { void deleteByMember(Member member); - @Query(value = "SELECT c FROM Comment c JOIN FETCH Board b ON b = c.board WHERE c.member = :member ") + @Query(value = "SELECT c FROM Comment c JOIN FETCH Board b ON b = c.board WHERE c.member = :member AND c.member.status = 'ACTIVE'") Page findByMemberFetchJoinBoard(@Param("member") Member member, PageRequest pageRequest); - @Query("SELECT c FROM Comment c JOIN FETCH c.member where c.board.id = :boardId") + @Query("SELECT c FROM Comment c JOIN FETCH c.member where c.board.id = :boardId AND c.member.status = 'ACTIVE'") Slice findByBoardFetchJoinMember(@Param("boardId") Long boardId, PageRequest pageRequest); + + @Query("SELECT c.ref FROM Comment c WHERE c.board = :board and c.id = :parent") + int getRefNumOfParent(Board board, Long parent); + + @Query("SELECT IFNULL(MAX(c.ref), 0) FROM Comment c WHERE c.board = :board") + int getRefNum(Board board); + + @Query("SELECT IFNULL(MAX(c.refOrder), 0) FROM Comment c WHERE c.board = :board and c.ref = :ref") + int getRefOrder(Board board, Integer ref); + + @Query("SELECT c.step FROM Comment c WHERE c.board = :board and c.id = :parent") + int getStep(Board board, Long parent); + + List findAllByBoard_IdAndRef(Long boardId, int ref); } diff --git a/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentCommandService.java b/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentCommandService.java index eb91927..56d5d97 100644 --- a/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentCommandService.java +++ b/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentCommandService.java @@ -42,19 +42,19 @@ private Comment createComment(CommentVO commentVO) { if (parentId != null) { Comment parentComment = getParentComment(parentId); - return CommentResponse.toEntity(member, board, content, parentComment); + int ref = commentRepository.getRefNumOfParent(board, parentId); + int refOrder = commentRepository.getRefOrder(board, ref); + int step = commentRepository.getStep(board, parentId); + return CommentResponse.toEntity(member, board, content, parentComment, ref, refOrder+1, step+1); + } + else { + int ref = commentRepository.getRefNum(board); + return CommentResponse.toEntity(member, board, content, null, ref + 1, 0, 0); } - return CommentResponse.toEntity(member, board, content, null); } public Comment getParentComment(Long parentId) { - Comment parentComment = commentQueryService.findById(parentId); - - // 부모의 댓글이 있는 경우 -> 에러 발생 (대댓글까지만 가능) - if (parentComment.getParentComment() != null) { - throw new ApiException(ErrorStatus._COMMENT_OVER_DEPTH_); - } - return parentComment; + return commentQueryService.findById(parentId); } public CommentResponse.CommentProc update(String content, Long commentId) { diff --git a/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentQueryService.java b/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentQueryService.java index c00836e..d31f8b1 100644 --- a/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentQueryService.java +++ b/src/main/java/com/codez4/meetfolio/domain/comment/service/CommentQueryService.java @@ -14,6 +14,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; + +import static com.codez4.meetfolio.domain.comment.dto.CommentResponse.toCommentItem; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -42,6 +47,13 @@ public CommentResponse.CommentResult findCommentsByBoard(Long boardId, int page) Slice comments = commentRepository.findByBoardFetchJoinMember( boardId, pageRequest); - return CommentResponse.toCommentResult(comments); + // 부모 댓글만 반환하기 (자식 댓글은 부모 댓글 안에 담아서 전달) + List parentComments = comments.stream() + .filter(comment -> comment.getParentComment() == null) + .map(comment -> toCommentItem(comment,commentRepository.findAllByBoard_IdAndRef(boardId, + comment.getRef()).stream().filter(child -> child.getRefOrder() != 0).map(child -> {return toCommentItem(child,new ArrayList<>());}).toList() )) + .toList(); + + return CommentResponse.toCommentResult(parentComments,comments); } } diff --git a/src/main/java/com/codez4/meetfolio/domain/coverLetter/controller/CoverLetterController.java b/src/main/java/com/codez4/meetfolio/domain/coverLetter/controller/CoverLetterController.java index 5c06d98..1e91eed 100644 --- a/src/main/java/com/codez4/meetfolio/domain/coverLetter/controller/CoverLetterController.java +++ b/src/main/java/com/codez4/meetfolio/domain/coverLetter/controller/CoverLetterController.java @@ -53,7 +53,7 @@ public ApiResponse getCoverLetter(@AuthenticationMember Membe @PathVariable(name = "coverLetterId") Long coverLetterId) { MemberInfo memberInfo = MemberResponse.toMemberInfo(member); - CoverLetterInfo coverLetterInfo = coverLetterQueryService.getCoverLetterInfo(coverLetterId); + CoverLetterInfo coverLetterInfo = coverLetterQueryService.getCoverLetterInfo(member, coverLetterId); FeedbackInfo feedbackInfo = feedbackQueryService.getFeedbackInfo(coverLetterId); AnalysisInfo analysisInfo = analysisQueryService.getAnalysisInfo(coverLetterId); CoverLetterResult coverLetterResult = CoverLetterResponse.toCoverLetterResult(memberInfo, diff --git a/src/main/java/com/codez4/meetfolio/domain/coverLetter/dto/CoverLetterResponse.java b/src/main/java/com/codez4/meetfolio/domain/coverLetter/dto/CoverLetterResponse.java index af8ea77..017f09d 100644 --- a/src/main/java/com/codez4/meetfolio/domain/coverLetter/dto/CoverLetterResponse.java +++ b/src/main/java/com/codez4/meetfolio/domain/coverLetter/dto/CoverLetterResponse.java @@ -45,9 +45,12 @@ public static class CoverLetterInfo { @Schema(description = "지원 직무") private String jobKeyword; + + @Schema(description = "타 사용자 자소서 조회할 때, 포인트 사용 여부") + private Boolean isPaid; } - public static CoverLetterInfo toCoverLetterInfo(CoverLetter coverLetter) { + public static CoverLetterInfo toCoverLetterInfo(CoverLetter coverLetter, Boolean isPaid) { return CoverLetterInfo.builder() .coverLetterId(coverLetter.getId()) @@ -57,6 +60,7 @@ public static CoverLetterInfo toCoverLetterInfo(CoverLetter coverLetter) { .keyword1(coverLetter.getKeyword1()) .keyword2(coverLetter.getKeyword2()) .jobKeyword(coverLetter.getJobKeyword() != null ? coverLetter.getJobKeyword().getDescription() : null) + .isPaid(isPaid) .build(); } diff --git a/src/main/java/com/codez4/meetfolio/domain/coverLetter/service/CoverLetterQueryService.java b/src/main/java/com/codez4/meetfolio/domain/coverLetter/service/CoverLetterQueryService.java index 970b1f3..d81adfa 100644 --- a/src/main/java/com/codez4/meetfolio/domain/coverLetter/service/CoverLetterQueryService.java +++ b/src/main/java/com/codez4/meetfolio/domain/coverLetter/service/CoverLetterQueryService.java @@ -5,26 +5,37 @@ import com.codez4.meetfolio.domain.coverLetter.dto.CoverLetterResponse.CoverLetterInfo; import com.codez4.meetfolio.domain.coverLetter.repository.CoverLetterRepository; import com.codez4.meetfolio.domain.member.Member; +import com.codez4.meetfolio.domain.point.repository.PointRepository; import com.codez4.meetfolio.global.exception.ApiException; import com.codez4.meetfolio.global.response.code.status.ErrorStatus; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class CoverLetterQueryService { private final CoverLetterRepository coverLetterRepository; + private final PointRepository pointRepository; - public CoverLetterInfo getCoverLetterInfo(Long coverLetterId) { - + public CoverLetterInfo getCoverLetterInfo(Member member, Long coverLetterId) { CoverLetter coverLetter = findById(coverLetterId); - return CoverLetterResponse.toCoverLetterInfo(coverLetter); + Boolean isPaid; + Member coverletterMember = coverLetter.getMember(); + if(member != coverletterMember) { + isPaid = pointRepository.getPointByCoverLetterAndMember(coverLetter, member).isPresent(); + } + else { + isPaid = null; + } + return CoverLetterResponse.toCoverLetterInfo(coverLetter,isPaid); } public CoverLetter findById(Long coverLetterId) { diff --git a/src/main/java/com/codez4/meetfolio/domain/point/Point.java b/src/main/java/com/codez4/meetfolio/domain/point/Point.java index 566e379..409eeb7 100644 --- a/src/main/java/com/codez4/meetfolio/domain/point/Point.java +++ b/src/main/java/com/codez4/meetfolio/domain/point/Point.java @@ -1,6 +1,7 @@ package com.codez4.meetfolio.domain.point; import com.codez4.meetfolio.domain.common.BaseTimeEntity; +import com.codez4.meetfolio.domain.coverLetter.CoverLetter; import com.codez4.meetfolio.domain.enums.PointType; import com.codez4.meetfolio.domain.member.Member; import com.codez4.meetfolio.domain.payment.Payment; @@ -35,4 +36,8 @@ public class Point extends BaseTimeEntity { @Column(nullable = false) @Enumerated(EnumType.STRING) private PointType pointType; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "coverletter_id", nullable = true) + private CoverLetter coverLetter; } diff --git a/src/main/java/com/codez4/meetfolio/domain/point/controller/PointController.java b/src/main/java/com/codez4/meetfolio/domain/point/controller/PointController.java index 2d434c2..31b2527 100644 --- a/src/main/java/com/codez4/meetfolio/domain/point/controller/PointController.java +++ b/src/main/java/com/codez4/meetfolio/domain/point/controller/PointController.java @@ -1,5 +1,6 @@ package com.codez4.meetfolio.domain.point.controller; +import com.codez4.meetfolio.domain.coverLetter.CoverLetter; import com.codez4.meetfolio.domain.coverLetter.service.CoverLetterQueryService; import com.codez4.meetfolio.domain.enums.PointType; import com.codez4.meetfolio.domain.member.Member; @@ -39,31 +40,29 @@ public ApiResponse getMyPoint(@AuthenticationMember M @Operation(summary = "마이페이지 - 포인트 사용 내역 조회", description = "마이페이지의 포인트 사용 내역을 조회합니다.") @GetMapping("/my-points") - public ApiResponse getMyPointList(@AuthenticationMember Member member, - @RequestParam(value = "page", defaultValue = "0") int page) { + public ApiResponse getMyPointList(@AuthenticationMember Member member, @RequestParam(value = "page", defaultValue = "0") int page) { return ApiResponse.onSuccess(pointQueryService.getMyPointList(page, member)); } @Operation(summary = "포인트 사용", description = "자소서 조회 / AI 서비스 이용을 위해 포인트를 사용합니다.") @Parameter(name = "memberId", description = "자소서 Id, Path Variable입니다.", required = true, example = "1", in = ParameterIn.PATH) @PostMapping("/coverLetters/{coverLetterId}/points") - public ApiResponse usePoint(@AuthenticationMember Member member, - @Valid @RequestBody PointRequest.PointUseRequest request, - @PathVariable(value = "coverLetterId") Long coverLetterId) { + public ApiResponse usePoint(@AuthenticationMember Member member, @Valid @RequestBody PointRequest.PointUseRequest request, @PathVariable(value = "coverLetterId") Long coverLetterId) { PointType type = PointType.convert(request.getType()); - if (type == PointType.USE_AI_ANALYSIS && - coverLetterQueryService.findById(coverLetterId).getMember() != member) { - throw new ApiException(ErrorStatus._FORBIDDEN); + + if (type == PointType.USE_AI_ANALYSIS && coverLetterQueryService.findById(coverLetterId).getMember() != member) { + throw new ApiException(ErrorStatus._FORBIDDEN); } int totalPoint = member.getPoint() - request.getPoint(); - PointRequest.Post post = - PointRequest.Post.builder() - .point(request.getPoint()) - .pointType(type) - .totalPoint(totalPoint) - .member(member) - .build(); - return ApiResponse.onSuccess(pointCommandService.usePoint(post, member)); + PointRequest.Post.PostBuilder post = PointRequest.Post.builder().point(request.getPoint()).pointType(type).totalPoint(totalPoint).member(member); + if(type == PointType.USE_COVER_LETTER) { + CoverLetter coverLetter = coverLetterQueryService.findById(coverLetterId); + post.coverLetter(coverLetter); + } + else { + post.coverLetter(null); + } + return ApiResponse.onSuccess(pointCommandService.usePoint(post.build(), member)); } diff --git a/src/main/java/com/codez4/meetfolio/domain/point/dto/PointRequest.java b/src/main/java/com/codez4/meetfolio/domain/point/dto/PointRequest.java index 74a6cf2..8389ff6 100644 --- a/src/main/java/com/codez4/meetfolio/domain/point/dto/PointRequest.java +++ b/src/main/java/com/codez4/meetfolio/domain/point/dto/PointRequest.java @@ -1,5 +1,6 @@ package com.codez4.meetfolio.domain.point.dto; +import com.codez4.meetfolio.domain.coverLetter.CoverLetter; import com.codez4.meetfolio.domain.enums.PointType; import com.codez4.meetfolio.domain.member.Member; import com.codez4.meetfolio.domain.payment.Payment; @@ -21,6 +22,7 @@ public static class PointUseRequest{ @Schema(description = "사용할 포인트") int point; + } /* @@ -35,6 +37,7 @@ public static class Post{ int totalPoint; Member member; Payment payment; + CoverLetter coverLetter; } public static Point toEntity(Post post){ @@ -44,6 +47,7 @@ public static Point toEntity(Post post){ .totalPoint(post.getTotalPoint()) .member(post.getMember()) .payment(post.payment) + .coverLetter(post.coverLetter) .build(); } } diff --git a/src/main/java/com/codez4/meetfolio/domain/point/repository/PointRepository.java b/src/main/java/com/codez4/meetfolio/domain/point/repository/PointRepository.java index dff2350..5368cde 100644 --- a/src/main/java/com/codez4/meetfolio/domain/point/repository/PointRepository.java +++ b/src/main/java/com/codez4/meetfolio/domain/point/repository/PointRepository.java @@ -1,5 +1,6 @@ package com.codez4.meetfolio.domain.point.repository; +import com.codez4.meetfolio.domain.coverLetter.CoverLetter; import com.codez4.meetfolio.domain.enums.PointType; import com.codez4.meetfolio.domain.member.Member; import com.codez4.meetfolio.domain.payment.Payment; @@ -25,4 +26,7 @@ public interface PointRepository extends JpaRepository { @Query("SELECT IFNULL(MAX(POINTSUM.POINT), 0) FROM (SELECT DATE_FORMAT(p.createdAt, '%Y-%c') AS MONTH, sum(p.point) AS POINT FROM Point p WHERE p.pointType != :type GROUP BY MONTH) AS POINTSUM WHERE POINTSUM.MONTH =:month") long queryGetAllPointSum(PointType type, String month); + Optional getPointByCoverLetterAndMember(CoverLetter coverLetter, Member member); + + }