본문 바로가기

항해99

23.10.10 항해 99 16기 실전 프로젝트 6일차

오늘 공부한 것

* 실전 프로젝트 댓글 및 대댓글 기능 코드 수정

* 실전 프로젝트 마이페이지에 들어갈 댓글 및 대댓글 기능 코드 작성

 

어제 구현했던 댓글과 대댓글의 Service 클래스의 수정부분과 삭제부분은

(users.getNickName().equals(comments.getNickname() 으로 NickName으로 비교를 했었다

 

하지만 고유값이 아니므로 이것을 getEmail로 변경해주었다

 

1. 댓글 부분 변경

 1) Dto

     String email 추가 후 Response 되지 않도록 @JsonIgnore 해주었다

@Getter
public class CommentsResponseDto {
    private Long commnetId;
    private String contents;
    private String nickname;
    @JsonIgnore
    private String email;
    private LocalDateTime createAt;
    private LocalDateTime modifiedAt;



    public CommentsResponseDto(Comments comments, String users) {
        this.commnetId = comments.getId();
        this.contents = comments.getContents();
        this.nickname = users;
        this.createAt = comments.getCreatedAt();
        this.modifiedAt = comments.getModifiedAt();
        this.email = users;
    }
}

 

  2) Entity

      private String email; 을 추가해주었다

@Entity
@Getter
@NoArgsConstructor
@Table(name = "comments")
public class Comments extends TimeStamped {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="comments_id")
    private  Long id;

    private String nickname;

    private String email;

    @Column(nullable = false, length = 500)
    private String contents;

    @ManyToOne
    @JoinColumn(name = "posts_id")
    private Posts posts;

    @OneToMany (mappedBy = "comments", orphanRemoval = true)
    @OrderBy("createdAt asc")
    private List<Replies> repliesList= new ArrayList<>();


    public Comments(CommentsRequestDto requestDto, Users users, Posts posts) {
        this.nickname = users.getNickName();
        this.contents = requestDto.getContents();
        this.posts = posts;
        this.email = users.getEmail();
    }

    public void update(CommentsRequestDto requestDto, Users users) {
        this.nickname = users.getNickName();
        this.contents = requestDto.getContents();
    }
}

 

 3) Service

     (users.getEmail().equals(comments.getEmail() 으로 Email을 비교하도록 수정하였다

// 댓글 수정
    @Transactional
    public MessageResponseDto commentsUpdate( Long commentId,
                                              CommentsRequestDto request,
                                              Users users) {
        Comments comments = findById(commentId);
        if (users.getUserRole() == UserRoleEnum.ADMIN) {
            comments.update(request, users);
            return new MessageResponseDto("관리자가 댓글을 수정하였습니다", 200);
        } else if (users.getEmail().equals(comments.getEmail())) {
                comments.update(request, users);
                return new MessageResponseDto("댓글을 수정하였습니다", 200);
            } else {
                throw new CustomException(ErrorCode.NOT_ALLOWED); // 권한이 없습니다
            }
        }

    // 댓글 삭제
    public MessageResponseDto commentsDelete(Long commentId,
                                             Users users) {

        Comments comments = findById(commentId);
        if (users.getUserRole() == UserRoleEnum.ADMIN) {
            commentsRepository.delete(comments);
                return new MessageResponseDto("관리자가 댓글을 삭제하였습니다", 200);
        } else if (users.getEmail().equals(comments.getEmail())) {
                commentsRepository.delete(comments);
                return new MessageResponseDto("댓글을 삭제하였습니다", 200);
            } else {
                throw new CustomException(ErrorCode.NOT_ALLOWED); // 권한이 없습니다
        }
    }

 

2. 대댓글 부분 변경

 1) Dto

     String email 추가 후 Response 되지 않도록 @JsonIgnore 해주었다

@Getter
public class RepliesResponseDto {
    private Long repliesId;
    private String contents;
    private String nickname;
    @JsonIgnore
    private String email;
    private LocalDateTime createAt;
    private LocalDateTime modifiedAt;

    public RepliesResponseDto(Replies replies, String users) {
        this.repliesId = replies.getId();
        this.contents = replies.getContents();
        this.nickname = users;
        this.createAt = replies.getCreatedAt();
        this.modifiedAt = replies.getModifiedAt();
        this.email = users;
    }
}

 

 2) Entity

      private String email; 을 추가해주었다

@Entity
@Getter
@NoArgsConstructor
@Table(name = "replies")
public class Replies extends TimeStamped {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="replies_id")
    private Long id;

    private String nickname;

    private String email;

    @Column(nullable = false, length = 500)
    private String contents;

    @ManyToOne
    @JoinColumn(name = "comments_id")
    private Comments comments;

    public Replies(RepliesRequestDto requestDto, Users users, Comments comments) {
        this.nickname = users.getNickName();
        this.contents = requestDto.getContents();
        this.comments = comments;
        this.email = users.getEmail();
    }

    public void update(RepliesRequestDto requestDto, Users users) {
        this.nickname = users.getNickName();
        this.contents = requestDto.getContents();
    }
}

 

 3) Service

     (users.getEmail().equals(comments.getEmail() 으로 Email을 비교하도록 수정하였다

@Transactional
    // 대댓글 수정
    public MessageResponseDto repliesUpdate( Long repliesId,
                                             RepliesRequestDto request,
                                             Users users) {

        Replies replies = findById(repliesId);
        if (users.getUserRole() == UserRoleEnum.ADMIN) {
            replies.update(request, users);
            return new MessageResponseDto("관리자가 대댓글을 수정하였습니다", 200);
        } else if (users.getEmail().equals(replies.getEmail())) {
                replies.update(request, users);
                return new MessageResponseDto("대댓글을 수정하였습니다", 200);
            } else {
                throw new CustomException(ErrorCode.NOT_ALLOWED); // 권한이 없습니다
        }
    }

    // 대댓글 삭제
    public MessageResponseDto repliesDelete(Long repliesId,
                                            Users users) {

        Replies replies = findById(repliesId);
        if (users.getUserRole() == UserRoleEnum.ADMIN) {
            repliesRepository.delete(replies);
            return new MessageResponseDto("관리자가 대댓글을 삭제하였습니다", 200);
        } else if (users.getEmail().equals(replies.getEmail())) {
                repliesRepository.delete(replies);
                return new MessageResponseDto("대댓글을 삭제하였습니다", 200);
            } else {
                throw new CustomException(ErrorCode.NOT_ALLOWED); // 권한이 없습니다
        }
    }

 

이후에는 마이페이지 쪽에서 본인이 작성한 댓글과 대댓글을 볼 수 있도록 하자는 이야기가 있어서

이부분을 구현해보았다

 

1. 댓글 

 1) Controller

@GetMapping("/posts/{postId}/commentsme")
    public ResponseEntity<List<CommentsMeResponseDto>> commentsMeList(@PathVariable("postId") Long postId,
                                                                      @AuthenticationPrincipal UserDetailsImpl userDetails ) {
        return ResponseEntity.ok(commentsService.commentsMeList(postId, userDetails.getUsers()));
    }

 

  2) Dto

public class CommentsMeResponseDto {
        private String contents;
        private String nickname;
        private String title;

        public CommentsMeResponseDto(Comments comments, String postTitle,String users) {
            this.contents = comments.getContents();
            this.nickname = users;
            this.title = postTitle;
        }
    }

 

 3) Service

// 마이페이지에서 내가 쓴 댓글 조회
    public List<CommentsMeResponseDto> commentsMeList (Long postId,
                                                       Users users) {
        List<Comments> commentsMeList = commentsRepository.findByPosts_IdOrderByCreatedAtDesc(postId);

        List<CommentsMeResponseDto> commentsMeResponseDtoList = new ArrayList<>();
        for (Comments comments : commentsMeList) {

            if (users.getEmail().equals(comments.getEmail())) {
                    commentsMeResponseDtoList.add(new CommentsMeResponseDto(comments, comments.getPosts().getTitle(), comments.getNickname()));
                }
        }
        return commentsMeResponseDtoList;
    }

 

2. 대댓글

 1) Controller

    // 마이페이지에서 내가 쓴 대댓글 조회
    @GetMapping("/comments/{commentId}/repliesme")
    public ResponseEntity<List<RepliesMeResponseDto>> repliesMeList(@PathVariable("commentId") Long commentId,
                                                                    @AuthenticationPrincipal UserDetailsImpl userDetails) {
        return ResponseEntity.ok(repliesService.repliesMeList(commentId, userDetails.getUsers()));
    }

 

2) Dto

@Getter
public class RepliesMeResponseDto {
    private String contents;
    private String nickname;
    private String title;

    public RepliesMeResponseDto(Comments comments, String postTitle, String users) {
        this.contents = comments.getContents();
        this.nickname = users;
        this.title = postTitle;
    }
}

 

 3) Service

    // 마이페이지에서 내가 쓴 대댓글 조회
    public List<RepliesMeResponseDto> repliesMeList (Long postId,
                                                     Users users) {
        List<Comments> commentsMeList = commentsRepository.findByPosts_IdOrderByCreatedAtDesc(postId);

        List<RepliesMeResponseDto> repliesMeResponseDtoList = new ArrayList<>();
        for (Comments comments : commentsMeList) {

            if (users.getEmail().equals(comments.getEmail())) {
                repliesMeResponseDtoList.add(new RepliesMeResponseDto(comments, comments.getPosts().getTitle(), comments.getNickname()));
            }
        }
        return repliesMeResponseDtoList;
    }