Skip to content

Commit

Permalink
Merge pull request #96 from WooriVeryGood/HC-204-refactoring
Browse files Browse the repository at this point in the history
Hc 204 refactoring
  • Loading branch information
pagh2322 authored Apr 28, 2024
2 parents d05d323 + ec7ec23 commit e28c188
Show file tree
Hide file tree
Showing 68 changed files with 1,220 additions and 877 deletions.
403 changes: 210 additions & 193 deletions .idea/workspace.xml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import org.wooriverygood.api.comment.dto.NewReplyRequest;
import org.wooriverygood.api.comment.repository.CommentRepository;
import org.wooriverygood.api.global.auth.AuthInfo;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.member.exception.MemberNotFoundException;
import org.wooriverygood.api.member.repository.MemberRepository;
import org.wooriverygood.api.post.domain.Post;
import org.wooriverygood.api.post.exception.PostNotFoundException;
import org.wooriverygood.api.post.repository.PostRepository;
Expand All @@ -23,15 +26,19 @@ public class CommentCreateService {

private final CommentRepository commentRepository;

private final MemberRepository memberRepository;


public void addComment(AuthInfo authInfo, Long postId, NewCommentRequest request) {
Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);
Post post = postRepository.findById(postId)
.orElseThrow(PostNotFoundException::new);

Comment comment = Comment.builder()
.content(request.getContent())
.author(authInfo.getUsername())
.post(post)
.member(member)
.build();

commentRepository.save(comment);
Expand All @@ -44,13 +51,16 @@ public void addReply(Long commentId, NewReplyRequest request, AuthInfo authInfo)
if (!parent.isParent())
throw new ReplyDepthException();

Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);

Comment child = Comment.builder()
.content(request.getContent())
.author(authInfo.getUsername())
.post(parent.getPost())
.parent(parent)
.member(member)
.build();
parent.addChildren(child);
parent.addReply(child);

commentRepository.save(child);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import org.wooriverygood.api.comment.repository.CommentLikeRepository;
import org.wooriverygood.api.comment.repository.CommentRepository;
import org.wooriverygood.api.global.auth.AuthInfo;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.member.exception.MemberNotFoundException;
import org.wooriverygood.api.member.repository.MemberRepository;

@Service
@Transactional
Expand All @@ -18,12 +21,16 @@ public class CommentDeleteService {

private final CommentLikeRepository commentLikeRepository;

private final MemberRepository memberRepository;


public void deleteComment(Long commentId, AuthInfo authInfo) {
Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);
Comment comment = commentRepository.findById(commentId)
.orElseThrow(CommentNotFoundException::new);

comment.validateAuthor(authInfo.getUsername());
comment.validateAuthor(member);

commentLikeRepository.deleteAllByComment(comment);
deleteCommentOrReply(comment);
Expand All @@ -34,7 +41,7 @@ private void deleteCommentOrReply(Comment comment) {
deleteParent(comment);
return;
}
deleteChild(comment);
deleteReply(comment);
}

private void deleteParent(Comment parent) {
Expand All @@ -45,9 +52,9 @@ private void deleteParent(Comment parent) {
parent.willBeDeleted();
}

private void deleteChild(Comment reply) {
private void deleteReply(Comment reply) {
Comment parent = reply.getParent();
parent.deleteChild(reply);
parent.deleteReply(reply);
commentRepository.delete(reply);

if (parent.canDelete())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,45 +10,52 @@
import org.wooriverygood.api.comment.repository.CommentLikeRepository;
import org.wooriverygood.api.comment.repository.CommentRepository;
import org.wooriverygood.api.global.auth.AuthInfo;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.member.exception.MemberNotFoundException;
import org.wooriverygood.api.member.repository.MemberRepository;

import java.util.List;
import java.util.Objects;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CommentFindService {

private final CommentRepository commentRepository;

private final CommentLikeRepository commentLikeRepository;

private final MemberRepository memberRepository;


public CommentsResponse findAllCommentsByPostId(Long postId, AuthInfo authInfo) {
Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);
List<Comment> comments = commentRepository.findAllByPostId(postId);
List<CommentResponse> responses = comments.stream()
.map(comment -> convertToCommentResponse(comment, authInfo))
.map(comment -> convertToCommentResponse(comment, member))
.filter(response -> !Objects.isNull(response))
.toList();
return new CommentsResponse(responses);
}

private CommentResponse convertToCommentResponse(Comment comment, AuthInfo authInfo) {
private CommentResponse convertToCommentResponse(Comment comment, Member member) {
if (comment.isReply())
return null;
if (comment.isSoftRemoved())
return CommentResponse.softRemovedOf(comment, convertToReplyResponses(comment, authInfo));
return CommentResponse.softRemovedOf(comment, convertToReplyResponses(comment, member), comment.sameAuthor(member));

boolean liked = commentLikeRepository.existsByCommentAndUsername(comment, authInfo.getUsername());
return CommentResponse.of(comment, convertToReplyResponses(comment, authInfo), liked);
boolean liked = commentLikeRepository.existsByCommentAndMember(comment, member);
return CommentResponse.of(comment, convertToReplyResponses(comment, member), liked, comment.sameAuthor(member));
}

private List<ReplyResponse> convertToReplyResponses(Comment parent, AuthInfo authInfo) {
return parent.getChildren()
private List<ReplyResponse> convertToReplyResponses(Comment parent, Member member) {
return parent.getReplies()
.stream()
.map(reply -> {
boolean liked = commentLikeRepository.existsByCommentAndUsername(reply, authInfo.getUsername());
return ReplyResponse.from(reply, liked);
boolean liked = commentLikeRepository.existsByCommentAndMember(reply, member);
return ReplyResponse.of(reply, liked, reply.sameAuthor(member));
})
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import org.wooriverygood.api.comment.repository.CommentRepository;
import org.wooriverygood.api.comment.exception.CommentNotFoundException;
import org.wooriverygood.api.global.auth.AuthInfo;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.member.exception.MemberNotFoundException;
import org.wooriverygood.api.member.repository.MemberRepository;

import java.util.Optional;

Expand All @@ -22,26 +25,30 @@ public class CommentLikeToggleService {

private final CommentLikeRepository commentLikeRepository;

private final MemberRepository memberRepository;


public CommentLikeResponse likeComment(Long commentId, AuthInfo authInfo) {
Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);
Comment comment = commentRepository.findById(commentId)
.orElseThrow(CommentNotFoundException::new);

Optional<CommentLike> commentLike = commentLikeRepository.findByCommentAndUsername(comment, authInfo.getUsername());
Optional<CommentLike> commentLike = commentLikeRepository.findByCommentAndMember(comment, member);

if (commentLike.isEmpty()) {
addCommentLike(comment, authInfo.getUsername());
addCommentLike(comment, member);
return createCommentLikeResponse(comment, true);
}

deleteCommentLike(comment, commentLike.get());
return createCommentLikeResponse(comment, false);
}

private void addCommentLike(Comment comment, String username) {
private void addCommentLike(Comment comment, Member member) {
CommentLike commentLike = CommentLike.builder()
.comment(comment)
.username(username)
.member(member)
.build();

comment.addCommentLike(commentLike);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import org.wooriverygood.api.comment.dto.CommentUpdateRequest;
import org.wooriverygood.api.comment.repository.CommentRepository;
import org.wooriverygood.api.global.auth.AuthInfo;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.member.exception.MemberNotFoundException;
import org.wooriverygood.api.member.repository.MemberRepository;

@Service
@Transactional
Expand All @@ -16,12 +19,16 @@ public class CommentUpdateService {

private final CommentRepository commentRepository;

private final MemberRepository memberRepository;


public void updateComment(Long commentId, CommentUpdateRequest request, AuthInfo authInfo) {
Member member = memberRepository.findById(authInfo.getMemberId())
.orElseThrow(MemberNotFoundException::new);
Comment comment = commentRepository.findById(commentId)
.orElseThrow(CommentNotFoundException::new);

comment.validateAuthor(authInfo.getUsername());
comment.validateAuthor(member);

comment.updateContent(request.getContent());
}
Expand Down
37 changes: 22 additions & 15 deletions src/main/java/org/wooriverygood/api/comment/domain/Comment.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.wooriverygood.api.global.error.exception.AuthorizationException;
import org.wooriverygood.api.member.domain.Member;
import org.wooriverygood.api.post.domain.Post;
import org.wooriverygood.api.report.domain.CommentReport;

Expand All @@ -15,8 +16,8 @@
import java.util.Objects;

@Entity
@Table(name = "comments")
@Getter
@Table(name = "comments")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Comment {
Expand All @@ -31,13 +32,13 @@ public class Comment {
private Comment parent;

@OneToMany(mappedBy = "parent")
private List<Comment> children = new ArrayList<>();
private List<Comment> replies = new ArrayList<>();

@Column(name = "comment_content", length = 200, nullable = false)
private String content;

@Column(name = "comment_author", length = 1000)
private String author;
@ManyToOne(fetch = FetchType.LAZY)
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id", referencedColumnName = "post_id")
Expand Down Expand Up @@ -69,16 +70,18 @@ public class Comment {
private boolean updated;

@Builder
public Comment(Long id, String content, String author, Post post, Comment parent, List<CommentLike> commentLikes, List<CommentReport> reports, boolean softRemoved, boolean updated) {
public Comment(Long id, String content, Post post, Member member,
Comment parent, List<CommentLike> commentLikes,
List<CommentReport> reports, boolean softRemoved, boolean updated) {
this.id = id;
this.content = content;
this.author = author;
this.post = post;
this.parent = parent;
this.commentLikes = commentLikes;
this.reports = reports;
this.softRemoved = softRemoved;
this.updated = updated;
this.member = member;
}

public void addCommentLike(CommentLike commentLike) {
Expand All @@ -94,28 +97,32 @@ public void addReport(CommentReport report) {
reports.add(report);
}

public boolean hasReportByUser(String username) {
public boolean hasReportByMember(Member member) {
for (CommentReport report: reports)
if (report.isOwner(username))
if (report.isOwner(member))
return true;
return false;
}

public void validateAuthor(String author) {
if (!this.author.equals(author)) throw new AuthorizationException();
public boolean sameAuthor(Member member) {
return this.member.equals(member);
}

public void validateAuthor(Member member) {
if (!sameAuthor(member)) throw new AuthorizationException();
}

public void updateContent(String content) {
this.content = content;
updated = true;
}

public void addChildren(Comment reply) {
children.add(reply);
public void addReply(Comment reply) {
replies.add(reply);
}

public void deleteChild(Comment reply) {
children.remove(reply);
public void deleteReply(Comment reply) {
replies.remove(reply);
reply.delete();
}

Expand All @@ -132,7 +139,7 @@ public boolean isReply() {
}

public boolean hasNoReply() {
return children.isEmpty();
return replies.isEmpty();
}

public void willBeDeleted() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.wooriverygood.api.member.domain.Member;

@Entity
@Table(name = "commentLikes")
Expand All @@ -19,15 +20,15 @@ public class CommentLike {
@JoinColumn(name = "comment_id", referencedColumnName = "comment_id")
private Comment comment;

@Column
private String username;
@ManyToOne(fetch = FetchType.LAZY)
private Member member;


@Builder
public CommentLike(Long id, Comment comment, String username) {
public CommentLike(Long id, Comment comment, Member member) {
this.id = id;
this.comment = comment;
this.username = username;
this.member = member;
}

public void delete() {
Expand Down
Loading

0 comments on commit e28c188

Please sign in to comment.