Skip to content

Commit

Permalink
fix[be] : #4 - book 상세 : 댓글 좋아요
Browse files Browse the repository at this point in the history
  • Loading branch information
G1Huh committed Jan 8, 2025
1 parent f34f013 commit 767b73e
Show file tree
Hide file tree
Showing 28 changed files with 1,025 additions and 253 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package movlit.be.book.application.converter;

import movlit.be.book.domain.BookCommentLike;
import movlit.be.book.domain.BookCommentLikeCount;
import movlit.be.book.domain.entity.BookCommentLikeCountEntity;
import movlit.be.book.domain.entity.BookCommentLikeEntity;
import movlit.be.member.application.converter.MemberConverter;

public class BookCommentLikeCountConverter {
private BookCommentLikeCountConverter() {
// TODO : 공통적인 예외처리 등록해주기
}


// Domain -> Entity
public static BookCommentLikeCountEntity toEntity(BookCommentLikeCount bookCommentLikeCount) {
if(bookCommentLikeCount == null)
return null;
else
return BookCommentLikeCountEntity.builder()
.bookCommentLikeCountId(bookCommentLikeCount.getBookCommentLikeCountId())
.bookCommentEntity(BookCommentConverter.toEntity(bookCommentLikeCount.getBookComment()))
.count(bookCommentLikeCount.getCount())
.build();
}

// Entity -> Domain
public static BookCommentLikeCount toDomain(BookCommentLikeCountEntity bookCommentLikeCountEntity) {
if (bookCommentLikeCountEntity == null)
return null;
else
return BookCommentLikeCount.builder()
.bookCommentLikeCountId(bookCommentLikeCountEntity.getBookCommentLikeCountId())
.bookComment(BookCommentConverter.toDomain(bookCommentLikeCountEntity.getBookCommentEntity()))
.count(bookCommentLikeCountEntity.getCount())
.build();
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package movlit.be.book.application.service;

import lombok.RequiredArgsConstructor;
import movlit.be.book.domain.Book;
import movlit.be.book.domain.BookComment;
import movlit.be.book.domain.BookCommentLike;
import movlit.be.book.domain.repository.BookCommentLikeCountRepository;
import movlit.be.book.presentation.dto.BookCommentResponseDto;
import movlit.be.book.domain.repository.BookCommentLikeRepository;
import movlit.be.book.domain.repository.BookCommentRepository;
import movlit.be.common.util.ids.BookCommentId;
import movlit.be.common.util.ids.BookId;
import movlit.be.common.util.ids.MemberId;
import movlit.be.member.domain.Member;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class BookCommentReadService {
public static final int PAGE_SIZE = 10;


private final BookCommentRepository bookCommentRepository;
private final BookCommentLikeRepository bookCommentLikeRepository;
private final BookCommentLikeCountRepository bookCommentLikeCountRepository;

// 리뷰 리스트
public Slice<BookCommentResponseDto> getPagedBookComments(BookId bookId, MemberId memberId, Pageable pageable) {
Slice<BookCommentResponseDto> bookCommentPage = null;
if(memberId == null)
bookCommentPage = bookCommentRepository.findByBookId(bookId, pageable);
else
bookCommentPage = bookCommentRepository.findByBookIdAndMemberId(bookId, memberId, pageable);

System.out.println("$$$$$$$ 리뷰리스트 : " );
for (BookCommentResponseDto comment : bookCommentPage.getContent()) {
// 각 BookCommentResponseDto의 내용 출력
System.out.println("Comment TEXT: " + comment.getComment());
System.out.println("Comment LIKED: " + comment.isLiked());
System.out.println("COMMENTS NUM" + comment.getAllCommentsCount());
// 필요에 따라 추가 속성을 출력할 수 있습니다.
}

return bookCommentPage;
}

// 내가 작성한 도서 리뷰 찾기
public BookComment findByMemberAndBook(Member member, Book book) {
return bookCommentRepository.findByMemberAndBook(member, book);

}

public BookComment findByBookCommentId(BookCommentId bookCommentId) {
return bookCommentRepository.findByBookCommentId(bookCommentId);
}


// 댓글 좋아요 갯수
public int countLikesByCommentId(BookCommentId bookCommentId){
return bookCommentLikeCountRepository.countLikeByCommentId(bookCommentId);
}

// 해당 댓글 나의 좋아요 여부
public boolean isLikedByComment(BookComment bookComment, Member member){
if(bookCommentLikeRepository.findByBookCommentAndMember(bookComment, member) != null)
return true;
else
return false;
}

}
Original file line number Diff line number Diff line change
@@ -1,36 +1,38 @@
package movlit.be.book.application.converter.service;
package movlit.be.book.application.service;

import lombok.RequiredArgsConstructor;
import movlit.be.book.domain.Book;
import movlit.be.book.domain.BookComment;
import movlit.be.book.domain.BookCommentLike;
import movlit.be.book.domain.dto.BookCommentRequestDto;
import movlit.be.book.domain.BookCommentLikeCount;
import movlit.be.book.presentation.dto.BookCommentRequestDto;
import movlit.be.book.domain.entity.GenerateUUID;
import movlit.be.book.domain.repository.BookCommentLikeCountRepository;
import movlit.be.book.domain.repository.BookCommentLikeRepository;
import movlit.be.book.domain.repository.BookCommentRepository;
import movlit.be.common.exception.BookCommentAccessDenied;
import movlit.be.common.util.ids.BookCommentId;
import movlit.be.member.domain.Member;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class BookCommentWriteService {

private final BookCommentReadService bookCommentReadService;

private final BookCommentRepository bookCommentRepository;
private final BookCommentLikeRepository bookCommentLikeRepository;



private final BookCommentLikeCountRepository bookCommentLikeCountRepository;

// 도서 리뷰 등록
public BookComment registerBookComment(Member member, Book book, BookCommentRequestDto commentDto)
throws BookCommentAccessDenied {
// 한 사용자는 하나의 도서에 관해 1개의 리뷰만 등록 가능
BookComment savedComment = bookCommentRepository.findByMemberAndBook(member, book);
// 첫 리뷰라면 -> 리뷰 저장
if(savedComment == null){
if (savedComment == null) {
BookComment bookComment = BookComment.builder()
.bookCommentId(new BookCommentId(GenerateUUID.generateUUID()))
.book(book)
Expand All @@ -39,7 +41,7 @@ public BookComment registerBookComment(Member member, Book book, BookCommentRequ
.score(commentDto.getScore())
.build();
return bookCommentRepository.save(bookComment);
}else{
} else {
// 등록된 리뷰가 이미 있다면 -> update
return updateBookComment(member, book, savedComment.getBookCommentId(), commentDto);
}
Expand Down Expand Up @@ -83,12 +85,12 @@ public void deleteBookComment(Member member, Book book, BookCommentId bookCommen
if (bookComment != null) {
if (bookComment.getMember().getMemberId() == member.getMemberId()
&& bookComment.getBook().getBookId() == book.getBookId()) {
try{
try {
// 하드 삭제
System.out.println("^^삭제할 코멘트id " + bookCommentId);
bookCommentRepository.deleteById(bookCommentId);

}catch (Exception e){
} catch (Exception e) {
e.getMessage();
}
}
Expand All @@ -100,31 +102,53 @@ public void deleteBookComment(Member member, Book book, BookCommentId bookCommen


// 해당 도서 리뷰에 대한 좋아요 추가
@Transactional
public BookCommentLike addLike(Member member, Book book, BookComment bookComment) {
BookCommentLike bookCommentLike = bookCommentReadService.myCommentLikeStatus(member, book, bookComment);
BookCommentLike existingLike = bookCommentLikeRepository.findByBookCommentAndMember(bookComment, member);
System.out.println("&& existingLike : " + existingLike);
// 해당 리뷰 좋아요 기존 상태 정보 없다면 -> 새로 생성
if(bookCommentLike == null){
bookCommentLike = BookCommentLike.builder()
if (existingLike == null) {
// Like 추가
BookCommentLike bookCommentLike = BookCommentLike.builder()
.bookComment(bookComment)
.book(book)
.member(member)
.isLiked(true)
.build();
}else{
// 해당 리뷰 좋아요 기존 상태 정보 있다면 -> 현재 좋아요 상태 반대로 update
boolean oldLiked = bookCommentLike.getIsLiked();
bookCommentLike.setIsLiked(!oldLiked);
BookCommentLike savedLike = bookCommentLikeRepository.save(bookCommentLike);
// bookCommentLikeCount 증가
if (savedLike != null) {
BookCommentLikeCount existingCount = bookCommentLikeCountRepository.findByBookComment(bookComment);
if (existingCount == null) {
BookCommentLikeCount likeCount = BookCommentLikeCount.builder()
.bookComment(bookComment)
.count(0)
.build();
existingCount = bookCommentLikeCountRepository.save(likeCount);
}
bookCommentLikeCountRepository.increaseLikeCount(bookComment);
}
return savedLike;
} else {
return existingLike;
}

return bookCommentLikeRepository.save(bookCommentLike);

}

// 해당 도서 리뷰에 대한 좋아요 삭제
public BookCommentLike removeLike(Member member, Book book, BookComment bookComment){
return null;
@Transactional
public void removeLike(Member member, Book book, BookComment bookComment) throws Exception {
BookCommentLike existingLike = bookCommentLikeRepository.findByBookCommentAndMember(bookComment, member);
if(existingLike != null){
bookCommentLikeRepository.delete(existingLike);
BookCommentLikeCount existingCount = bookCommentLikeCountRepository.findByBookComment(bookComment);
if(existingCount != null && existingCount.getCount() > 0)
bookCommentLikeCountRepository.decreaseHeartCount(bookComment);

}else {
throw new Exception("좋아요를 삭제할 수 없습니다.");
}
}



}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package movlit.be.book.application.converter.service;
package movlit.be.book.application.service;

import java.util.List;
import lombok.RequiredArgsConstructor;
import movlit.be.book.domain.Book;
import movlit.be.book.domain.dto.BookDetailResponseDto;
import movlit.be.book.presentation.dto.BookDetailResponseDto;
import movlit.be.book.domain.Bookcrew;
import movlit.be.book.domain.repository.BookHeartCountRepository;
import movlit.be.book.domain.repository.BookHeartRepository;
import movlit.be.book.domain.repository.BookRepository;
import movlit.be.book.domain.repository.BookcrewRepository;
import movlit.be.common.util.ids.BookId;
import movlit.be.common.util.ids.MemberId;
import movlit.be.member.domain.Member;
import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -54,6 +53,7 @@ public Book findByBookId(BookId bookId) {
return bookRepository.findByBookId(bookId);
}

// 해당 책의 크루
public List<Bookcrew> findBookcrewByBook(Book book) {
return bookcrewRepository.findByBook(book);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package movlit.be.book.application.converter.service;
package movlit.be.book.application.service;

import lombok.RequiredArgsConstructor;
import movlit.be.book.domain.Book;
Expand Down
32 changes: 32 additions & 0 deletions be/src/main/java/movlit/be/book/domain/BookCommentLikeCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package movlit.be.book.domain;

import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import movlit.be.book.domain.entity.BookCommentEntity;
import org.hibernate.annotations.ColumnDefault;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@Builder
public class BookCommentLikeCount {

private Long bookCommentLikeCountId;
private BookComment bookComment;
private int count; // 해당 리뷰의 "좋아요"(like) 갯수
private Long version;

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;

@Entity
@Getter
Expand All @@ -32,7 +33,8 @@ public class BookCommentLikeCountEntity {
private BookCommentEntity bookCommentEntity;

@Column(nullable = false)
private Long count; // 해당 리뷰의 "좋아요"(like) 갯수
@ColumnDefault("0") // 기본값을 0으로 설정
private int count; // 해당 리뷰의 "좋아요"(like) 갯수

@Column
private Long version;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ public class BookCommentLikeEntity {
private MemberEntity memberEntity;

@Column(name = "is_liked")
private Boolean isLiked; // 도서 리뷰에 대한 좋아요 여부
private Boolean isLiked; // 해당 도서 리뷰에 대한 나의 "좋아요(like)" 여부

}
Loading

0 comments on commit 767b73e

Please sign in to comment.