From c6a71e9ff3944b1b2d2a0d15059c1bf0c61595ac Mon Sep 17 00:00:00 2001 From: SCY Date: Wed, 14 Aug 2024 15:49:46 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=8C=93=EA=B8=80=EB=B0=A9=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=EC=A0=90=20=EB=B3=80=EA=B2=BD=20(#319)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 --- .../comment/domain/CommentWithRole.java | 14 ------ .../comment/repository/CommentRepository.java | 13 +---- .../repository/entity/CommentEntity.java | 4 ++ .../comment/service/CommentService.java | 49 ++++--------------- .../service/dto/CommentAllResponseItem.java | 16 +++++- .../dto/CommentRoomAllResponseItem.java | 16 +++++- .../repository/entity/MemberEntity.java | 4 +- .../offering/domain/OfferingWithRole.java | 14 ------ .../repository/OfferingRepository.java | 5 +- .../repository/entity/OfferingEntity.java | 10 ++-- 10 files changed, 52 insertions(+), 93 deletions(-) delete mode 100644 backend/src/main/java/com/zzang/chongdae/comment/domain/CommentWithRole.java delete mode 100644 backend/src/main/java/com/zzang/chongdae/offering/domain/OfferingWithRole.java diff --git a/backend/src/main/java/com/zzang/chongdae/comment/domain/CommentWithRole.java b/backend/src/main/java/com/zzang/chongdae/comment/domain/CommentWithRole.java deleted file mode 100644 index b81ae7057..000000000 --- a/backend/src/main/java/com/zzang/chongdae/comment/domain/CommentWithRole.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zzang.chongdae.comment.domain; - -import com.zzang.chongdae.comment.repository.entity.CommentEntity; -import com.zzang.chongdae.offeringmember.domain.OfferingMemberRole; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class CommentWithRole { - - private final CommentEntity comment; - private final OfferingMemberRole role; -} diff --git a/backend/src/main/java/com/zzang/chongdae/comment/repository/CommentRepository.java b/backend/src/main/java/com/zzang/chongdae/comment/repository/CommentRepository.java index cee837309..004835a42 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/repository/CommentRepository.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/repository/CommentRepository.java @@ -1,25 +1,14 @@ package com.zzang.chongdae.comment.repository; -import com.zzang.chongdae.comment.domain.CommentWithRole; import com.zzang.chongdae.comment.repository.entity.CommentEntity; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; public interface CommentRepository extends JpaRepository { - @Query(""" - SELECT new com.zzang.chongdae.comment.domain.CommentWithRole(c, om.role) - FROM CommentEntity as c JOIN OfferingMemberEntity as om - ON c.offering = om.offering AND c.member = om.member - WHERE om.offering = :offering - ORDER BY c.createdAt - """) - List findAllWithRoleByOffering(OfferingEntity offering); + List findAllByOfferingOrderByCreatedAt(OfferingEntity offering); Optional findTopByOfferingOrderByCreatedAtDesc(OfferingEntity offering); - - Boolean existsByOffering(OfferingEntity offering); } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/repository/entity/CommentEntity.java b/backend/src/main/java/com/zzang/chongdae/comment/repository/entity/CommentEntity.java index 28d48244b..8cacf4715 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/repository/entity/CommentEntity.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/repository/entity/CommentEntity.java @@ -42,4 +42,8 @@ public class CommentEntity extends BaseTimeEntity { public CommentEntity(MemberEntity member, OfferingEntity offering, String content) { this(null, member, offering, content); } + + public boolean isOwnedBy(MemberEntity other) { + return this.member.isSame(other); + } } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java b/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java index f61e44d6e..4da6fe0ca 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java @@ -1,23 +1,18 @@ package com.zzang.chongdae.comment.service; -import com.zzang.chongdae.comment.domain.CommentWithRole; import com.zzang.chongdae.comment.repository.CommentRepository; import com.zzang.chongdae.comment.repository.entity.CommentEntity; import com.zzang.chongdae.comment.service.dto.CommentAllResponse; import com.zzang.chongdae.comment.service.dto.CommentAllResponseItem; -import com.zzang.chongdae.comment.service.dto.CommentCreatedAtResponse; import com.zzang.chongdae.comment.service.dto.CommentLatestResponse; import com.zzang.chongdae.comment.service.dto.CommentRoomAllResponse; import com.zzang.chongdae.comment.service.dto.CommentRoomAllResponseItem; import com.zzang.chongdae.comment.service.dto.CommentSaveRequest; import com.zzang.chongdae.global.exception.MarketException; -import com.zzang.chongdae.member.repository.MemberRepository; import com.zzang.chongdae.member.repository.entity.MemberEntity; -import com.zzang.chongdae.offering.domain.OfferingWithRole; import com.zzang.chongdae.offering.exception.OfferingErrorCode; import com.zzang.chongdae.offering.repository.OfferingRepository; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; -import com.zzang.chongdae.offeringmember.domain.OfferingMemberRole; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -28,7 +23,6 @@ public class CommentService { private final CommentRepository commentRepository; - private final MemberRepository memberRepository; private final OfferingRepository offeringRepository; public Long saveComment(CommentSaveRequest request, MemberEntity member) { @@ -41,52 +35,29 @@ public Long saveComment(CommentSaveRequest request, MemberEntity member) { } public CommentRoomAllResponse getAllCommentRoom(MemberEntity member) { - List offeringsWithRole = offeringRepository.findAllWithRoleByMember(member); - List responseItems = offeringsWithRole.stream() - .filter(offeringWithRole -> offeringWithRole.getOffering().hasParticipant()) - .map(this::toCommentRoomAllResponseItem) + List commentRooms = offeringRepository.findCommentRoomsByMember(member); + List responseItems = commentRooms.stream() + .map(commentsRoom -> toCommentRoomAllResponseItem(commentsRoom, member)) .toList(); return new CommentRoomAllResponse(responseItems); } - private CommentRoomAllResponseItem toCommentRoomAllResponseItem(OfferingWithRole offeringWithRole) { - OfferingEntity offering = offeringWithRole.getOffering(); - OfferingMemberRole role = offeringWithRole.getRole(); - return new CommentRoomAllResponseItem( - offering.getId(), - offering.getTitle(), - toCommentLatestResponse(offering), - role.isProposer()); - } - - private CommentLatestResponse toCommentLatestResponse(OfferingEntity offering) { - Optional rawComment = commentRepository.findTopByOfferingOrderByCreatedAtDesc(offering); - return rawComment + private CommentRoomAllResponseItem toCommentRoomAllResponseItem(OfferingEntity offering, MemberEntity member) { + Optional comment = commentRepository.findTopByOfferingOrderByCreatedAtDesc(offering); + CommentLatestResponse commentLatestResponse = comment .map(CommentLatestResponse::new) .orElseGet(() -> new CommentLatestResponse(null, null)); + return new CommentRoomAllResponseItem(offering, member, commentLatestResponse); } public CommentAllResponse getAllComment(Long offeringId, MemberEntity member) { OfferingEntity offering = offeringRepository.findById(offeringId) .orElseThrow(() -> new MarketException(OfferingErrorCode.NOT_FOUND)); - List commentsWithRole = commentRepository.findAllWithRoleByOffering(offering); - List responseItems = commentsWithRole.stream() - .map(commentWithRole -> toCommentAllResponseItem(commentWithRole, member.getId())) + List comments = commentRepository.findAllByOfferingOrderByCreatedAt(offering); + List responseItems = comments.stream() + .map(comment -> new CommentAllResponseItem(comment, member)) .toList(); return new CommentAllResponse(responseItems); } - - private CommentAllResponseItem toCommentAllResponseItem(CommentWithRole commentWithRole, long loginMemberId) { - CommentEntity comment = commentWithRole.getComment(); - OfferingMemberRole role = commentWithRole.getRole(); - MemberEntity member = comment.getMember(); - return new CommentAllResponseItem( - comment.getId(), - new CommentCreatedAtResponse(comment.getCreatedAt()), - comment.getContent(), - member.getNickname(), - role.isProposer(), - member.isSameMember(loginMemberId)); - } } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentAllResponseItem.java b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentAllResponseItem.java index dd403c7c2..0dd1a0d0c 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentAllResponseItem.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentAllResponseItem.java @@ -1,9 +1,21 @@ package com.zzang.chongdae.comment.service.dto; +import com.zzang.chongdae.comment.repository.entity.CommentEntity; +import com.zzang.chongdae.member.repository.entity.MemberEntity; + public record CommentAllResponseItem(Long commentId, CommentCreatedAtResponse createdAt, String content, String nickname, - Boolean isProposer, - Boolean isMine) { + boolean isProposer, + boolean isMine) { + + public CommentAllResponseItem(CommentEntity comment, MemberEntity member) { + this(comment.getId(), + new CommentCreatedAtResponse(comment.getCreatedAt()), + comment.getContent(), + comment.getMember().getNickname(), + comment.getOffering().isProposedBy(comment.getMember()), + comment.isOwnedBy(member)); + } } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java index ca4fcc1d2..f68c5e1ba 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java @@ -1,7 +1,19 @@ package com.zzang.chongdae.comment.service.dto; +import com.zzang.chongdae.member.repository.entity.MemberEntity; +import com.zzang.chongdae.offering.repository.entity.OfferingEntity; + public record CommentRoomAllResponseItem(Long offeringId, String offeringTitle, - CommentLatestResponse latestComment, - Boolean isProposer) { + Boolean isProposer, + CommentLatestResponse latestComment) { + + public CommentRoomAllResponseItem(OfferingEntity offering, + MemberEntity member, + CommentLatestResponse latestComment) { + this(offering.getId(), + offering.getTitle(), + offering.isProposedBy(member), + latestComment); + } } diff --git a/backend/src/main/java/com/zzang/chongdae/member/repository/entity/MemberEntity.java b/backend/src/main/java/com/zzang/chongdae/member/repository/entity/MemberEntity.java index ff03b74ce..e840affb5 100644 --- a/backend/src/main/java/com/zzang/chongdae/member/repository/entity/MemberEntity.java +++ b/backend/src/main/java/com/zzang/chongdae/member/repository/entity/MemberEntity.java @@ -37,7 +37,7 @@ public MemberEntity(String nickname, String password) { this(null, nickname, password); } - public boolean isSameMember(Long memberId) { - return this.id.equals(memberId); + public boolean isSame(MemberEntity other) { + return this.equals(other); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/OfferingWithRole.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/OfferingWithRole.java deleted file mode 100644 index ab58d5cb5..000000000 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/OfferingWithRole.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zzang.chongdae.offering.domain; - -import com.zzang.chongdae.offering.repository.entity.OfferingEntity; -import com.zzang.chongdae.offeringmember.domain.OfferingMemberRole; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class OfferingWithRole { - - private final OfferingEntity offering; - private final OfferingMemberRole role; -} diff --git a/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java b/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java index 5fef7a15a..80e1cfba1 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java @@ -1,7 +1,6 @@ package com.zzang.chongdae.offering.repository; import com.zzang.chongdae.member.repository.entity.MemberEntity; -import com.zzang.chongdae.offering.domain.OfferingWithRole; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; import java.time.LocalDateTime; import java.util.List; @@ -12,12 +11,12 @@ public interface OfferingRepository extends JpaRepository { @Query(""" - SELECT new com.zzang.chongdae.offering.domain.OfferingWithRole(o, om.role) + SELECT o FROM OfferingEntity as o JOIN OfferingMemberEntity as om ON o.id = om.offering.id WHERE om.member = :member """) - List findAllWithRoleByMember(MemberEntity member); + List findCommentRoomsByMember(MemberEntity member); @Query(""" SELECT o diff --git a/backend/src/main/java/com/zzang/chongdae/offering/repository/entity/OfferingEntity.java b/backend/src/main/java/com/zzang/chongdae/offering/repository/entity/OfferingEntity.java index 96dafe7c3..692e8b3d8 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/repository/entity/OfferingEntity.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/repository/entity/OfferingEntity.java @@ -126,16 +126,16 @@ public OfferingMeeting toOfferingMeeting() { return new OfferingMeeting(deadline, meetingAddress, meetingAddressDetail, meetingAddressDong); } - public boolean hasParticipant() { - return currentCount > INITIAL_COUNT; - } - public boolean isStatusGrouping() { return this.roomStatus.isGrouping(); } + public boolean isProposedBy(MemberEntity other) { + return this.member.isSame(other); + } + public boolean isNotProposedBy(MemberEntity other) { - return !this.member.equals(other); + return !isProposedBy(other); } public void updateMeeting(OfferingMeeting offeringMeeting) {