Skip to content

Commit

Permalink
#94 Refactor: Comment/Recomment Refactor (#121)
Browse files Browse the repository at this point in the history
  • Loading branch information
djlim2425 authored Sep 30, 2024
2 parents 7b536a6 + 91defc5 commit a0f95ce
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 106 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,9 @@ public enum ErrorStatus implements BaseCode {
// Comment Error
COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMENT4001", "댓글이 없습니다."),
COMMENT_HAS_RECOMMENTS(HttpStatus.BAD_REQUEST, "COMMENT4002", "대댓글이 있는 댓글은 완전 삭제할 수 없습니다."),
COMMENT_HAS_NO_RECOMMENTS(HttpStatus.BAD_REQUEST, "COMMENT4003", "대댓글이 없는 댓글입니다."),


COMMENT_HAS_NO_RECOMMENTS(HttpStatus.BAD_REQUEST, "COMMENT4005", "대댓글이 없는 댓글입니다."),
RECOMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "RECOMMENT4001", "대댓글을 찾을 수 없습니다."),
NOT_YOUR_COMMENT(HttpStatus.BAD_REQUEST,"COMMENT4004", "댓글 작성자가 아닙니다."), // 대댓글의 경우에도 사용
NOT_YOUR_COMMENT(HttpStatus.FORBIDDEN,"COMMENT4003", "댓글/대댓글 작성자가 아닙니다."), // 대댓글의 경우에도 사용

// PartyJoinMember Error
NOT_FOUND_PARTY_JOIN(HttpStatus.BAD_REQUEST, "JOIN4001", "모임에 참가한 기록이 없습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentRequestDTO;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentResponseDTO;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;
import com.drinkeg.drinkeg.service.commentService.CommentService;
import com.drinkeg.drinkeg.service.memberService.MemberService;
Expand All @@ -20,13 +19,14 @@
public class CommentController {

private final CommentService commentService;
private final MemberService memberService;

// 특정 모임의 댓글 및 대댓글 조회
@GetMapping("/{partyId}")
public ApiResponse<List<CommentResponseDTO>> getCommentsByPartyId(
@PathVariable("partyId") Long partyId) {

List<CommentResponseDTO> comments = commentService.getCommentsByPartyId(partyId);

return ApiResponse.onSuccess(comments);
}

Expand All @@ -37,40 +37,22 @@ public ApiResponse<String> createComment(//필요한게
@AuthenticationPrincipal PrincipalDetail principalDetail,
@RequestBody CommentRequestDTO commentRequest) {

// 현재 로그인 한 사용자 정보 가져오기
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);
Long memberId = foundMember.getId();
commentService.createComment(commentRequest, principalDetail);

commentService.createComment(commentRequest, memberId);
return ApiResponse.onSuccess("댓글 생성 완료");
}



// 대댓글 생성
@PostMapping("/{commentId}/recomments")
public ApiResponse<String> createRecomment(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId,
@RequestBody RecommentRequestDTO recommentRequest) {
// 현재 로그인한 사용자 정보 조회
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);

commentService.createRecomment(commentId, recommentRequest, foundMember);
return ApiResponse.onSuccess("대댓글 생성 완료");
}



// 댓글 삭제 (대댓글 O)
@PatchMapping("/{commentId}")
public ApiResponse<String> updateCommentStatus(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId) {
// 현재 로그인한 사용자 정보 가져오기
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);

commentService.updateCommentStatus(commentId, foundMember);
commentService.updateCommentStatus(commentId, principalDetail);

return ApiResponse.onSuccess("댓글 삭제 완료");
}

Expand All @@ -80,25 +62,12 @@ public ApiResponse<String> updateCommentStatus(
public ApiResponse<String> deleteComment(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId) {
// 현재 로그인한 사용자 정보 불러오기
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);

commentService.deleteComment(commentId, foundMember);
commentService.deleteComment(commentId, principalDetail);

return ApiResponse.onSuccess("댓글 삭제 완료");
}


// 대댓글 삭제
@DeleteMapping("/{commentId}/recomments/{recommentId}")
public ApiResponse<String> deleteRecomment(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId,
@PathVariable("recommentId") Long recommentId) {
// 현재 로그인한 사용자 정보
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);

commentService.deleteRecomment(commentId, recommentId, foundMember);
return ApiResponse.onSuccess("댓글 삭제 완료");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.drinkeg.drinkeg.controller;

import com.drinkeg.drinkeg.apipayLoad.ApiResponse;
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;
import com.drinkeg.drinkeg.service.recommentService.RecommentService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import com.drinkeg.drinkeg.service.memberService.MemberService;


@RestController
@RequiredArgsConstructor
@RequestMapping("/recomments")
public class RecommentController {

private final RecommentService recommentService;

// 대댓글 생성
@PostMapping("/{commentId}")
public ApiResponse<String> createRecomment(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId,
@RequestBody RecommentRequestDTO recommentRequest) {

recommentService.createRecomment(commentId, recommentRequest, principalDetail);

return ApiResponse.onSuccess("대댓글 생성 완료");
}


// 대댓글 삭제
@DeleteMapping("/{recommentId}/{commentId}")
public ApiResponse<String> deleteRecomment(
@AuthenticationPrincipal PrincipalDetail principalDetail,
@PathVariable("commentId") Long commentId,
@PathVariable("recommentId") Long recommentId) {

recommentService.deleteRecomment(commentId, recommentId, principalDetail);

return ApiResponse.onSuccess("댓글 삭제 완료");
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
package com.drinkeg.drinkeg.service.commentService;

import com.drinkeg.drinkeg.domain.Comment;
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentRequestDTO;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentResponseDTO;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;

import java.time.LocalDateTime;
import java.util.List;

public interface CommentService {
void createComment(CommentRequestDTO commentRequest, Long memberId);

void createRecomment(Long commentId, RecommentRequestDTO recommentRequest, Member member);
Comment findByIdOrThrow(Long commentId);

void deleteComment(Long commentId, Member member);
void createComment(CommentRequestDTO commentRequest, PrincipalDetail principalDetail);

void updateCommentStatus(Long commentId, Member member);
void deleteComment(Long commentId, PrincipalDetail principalDetail);

void deleteRecomment(Long commentId, Long recommentId, Member member);
void updateCommentStatus(Long commentId, PrincipalDetail principalDetail);

List<CommentResponseDTO> getCommentsByPartyId(Long partyId) ;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
import com.drinkeg.drinkeg.domain.Recomment;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentRequestDTO;
import com.drinkeg.drinkeg.dto.CommentDTO.CommentResponseDTO;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentRequestDTO;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentResponseDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;
import com.drinkeg.drinkeg.exception.GeneralException;
import com.drinkeg.drinkeg.repository.CommentRepository;
import com.drinkeg.drinkeg.repository.MemberRepository;
import com.drinkeg.drinkeg.repository.PartyRepository;
import com.drinkeg.drinkeg.repository.RecommentRepository;
import com.drinkeg.drinkeg.service.memberService.MemberService;
import com.drinkeg.drinkeg.service.partyService.PartyService;
import com.drinkeg.drinkeg.service.recommentService.RecommentService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -31,18 +31,23 @@ public class CommentServiceImpl implements CommentService {

private final CommentRepository commentRepository;
private final CommentConverter commentConverter;

private final RecommentConverter recommentConverter;
private final RecommentRepository recommentRepository;
// 검증을 위한 repository 접근
private final PartyRepository partyRepository;
private final MemberRepository memberRepository;
private final RecommentService recommentService;
private final PartyService partyService;
private final MemberService memberService;

@Override
public Comment findByIdOrThrow(Long commentId) {
return commentRepository.findById(commentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.COMMENT_NOT_FOUND));
}


@Override
public List<CommentResponseDTO> getCommentsByPartyId(Long partyId) {
// party 존재 여부 검증
Party party = partyRepository.findById(partyId)
.orElseThrow(() -> new GeneralException(ErrorStatus.PARTY_NOT_FOUND));
Party party = partyService.findPartyById(partyId);

// 특정 모임의 댓글 조회
List<Comment> comments = commentRepository.findByPartyId(partyId);
Expand All @@ -61,7 +66,7 @@ public List<CommentResponseDTO> getCommentsByPartyId(Long partyId) {
commentDTO.setCreatedDate(createdDate);

// 대댓글 처리
List<Recomment> recomments = recommentRepository.findByCommentId(comment.getId());
List<Recomment> recomments = recommentService.findByCommentId(comment.getId());
List<RecommentResponseDTO> recommentDTOs = recomments.stream()
.map(recomment -> {
RecommentResponseDTO recommentDTO = recommentConverter.toResponse(recomment);
Expand All @@ -88,54 +93,36 @@ public List<CommentResponseDTO> getCommentsByPartyId(Long partyId) {


@Override
public void createComment(CommentRequestDTO commentRequest, Long memberId) {
public void createComment(CommentRequestDTO commentRequest, PrincipalDetail principalDetail) {

// Party와 Member 존재 여부 검증
Party party = partyRepository.findById(commentRequest.getPartyId())
.orElseThrow(() -> new GeneralException(ErrorStatus.PARTY_NOT_FOUND));

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
// Party와 Member 존재 여부 검증
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);
Party party = partyService.findPartyById(commentRequest.getPartyId());

// Comment 엔티티 생성
Comment comment = commentConverter.toEntity(commentRequest, party, member);
Comment comment = commentConverter.toEntity(commentRequest, party, foundMember);

// 댓글 저장
Comment savedComment = commentRepository.save(comment);
}


@Override
public void createRecomment(Long commentId, RecommentRequestDTO recommentRequest, Member member) {
// 댓글 존재 여부 검증
Comment comment = commentRepository.findById(commentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.COMMENT_NOT_FOUND));

// 회원 존재 여부 검증
Member foundMember = memberRepository.findById(member.getId())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

// 대댓글 엔티티 생성
Recomment recomment = recommentConverter.fromRequest(recommentRequest, comment, foundMember);

// 대댓글 저장
Recomment savedRecomment = recommentRepository.save(recomment);

}

@Override
public void deleteComment(Long commentId, Member member) {
public void deleteComment(Long commentId, PrincipalDetail principalDetail) {
// 댓글 존재 여부 검증
Comment comment = commentRepository.findById(commentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.COMMENT_NOT_FOUND));

// 현재 로그인 한 사용자가 작성자인지 확인
if(comment.getMember() == null || !comment.getMember().equals(member)) {
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);
if(comment.getMember() == null || !comment.getMember().equals(foundMember)) {
throw new GeneralException(ErrorStatus.NOT_YOUR_COMMENT);
}

// 대댓글 여부 확인
boolean hasRecomments = recommentRepository.existsByCommentId(commentId);
boolean hasRecomments = recommentService.existsByCommentId(commentId);

if (hasRecomments) {
throw new GeneralException(ErrorStatus.COMMENT_HAS_RECOMMENTS);
Expand All @@ -146,18 +133,19 @@ public void deleteComment(Long commentId, Member member) {
}

@Override
public void updateCommentStatus(Long commentId, Member member) {
public void updateCommentStatus(Long commentId, PrincipalDetail principalDetail) {
// 댓글 존재 여부 검증
Comment comment = commentRepository.findById(commentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.COMMENT_NOT_FOUND));

// 현재 로그인 한 사용자가 작성자인지 확인
if(comment.getMember() == null || !comment.getMember().equals(member)) {
Member foundMember = memberService.loadMemberByPrincipleDetail(principalDetail);
if(comment.getMember() == null || !comment.getMember().equals(foundMember)) {
throw new GeneralException(ErrorStatus.NOT_YOUR_COMMENT);
}

// 대댓글 여부 확인
boolean hasRecomments = recommentRepository.existsByCommentId(commentId);
boolean hasRecomments = recommentService.existsByCommentId(commentId);

if (hasRecomments) {
// 대댓글이 있는 경우: isDeleted 상태를 true로 설정
Expand All @@ -169,24 +157,6 @@ public void updateCommentStatus(Long commentId, Member member) {
}


@Override
public void deleteRecomment(Long commentId, Long recommentId, Member member) {
// 댓글 존재 여부 검증
Comment comment = commentRepository.findById(commentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.COMMENT_NOT_FOUND));

// 대댓글 존재 여부 검증
Recomment recomment = recommentRepository.findById(recommentId)
.orElseThrow(() -> new GeneralException(ErrorStatus.RECOMMENT_NOT_FOUND));

// 현재 로그인 한 사용자가 작성자인지 확인
if(comment.getMember() == null || !comment.getMember().equals(member)) {
throw new GeneralException(ErrorStatus.NOT_YOUR_COMMENT);
}

// 대댓글 삭제
recommentRepository.delete(recomment);
}


// 시간 계산 메소드
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.drinkeg.drinkeg.service.recommentService;

import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.domain.Recomment;
import com.drinkeg.drinkeg.dto.RecommentDTO.RecommentRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;

import java.util.List;

public interface RecommentService {

List<Recomment> findByCommentId(Long commentId);
boolean existsByCommentId(Long commentId);
void createRecomment(Long commentId, RecommentRequestDTO recommentRequest, PrincipalDetail principalDetail);
void deleteRecomment(Long commentId, Long recommentId, PrincipalDetail principalDetail);

}
Loading

0 comments on commit a0f95ce

Please sign in to comment.