diff --git a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java index 02a3aea..0523ad5 100644 --- a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java +++ b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java @@ -31,7 +31,6 @@ public class TalkRoomController { private final TalkRoomService talkRoomService; - // TODO. 회원 도메인이 개발되면 변경 예정 @PostMapping("/talk-rooms") public ApiResponse createTalkRoom(@Valid @RequestBody TalkRoomCreateRequest request, @Auth AuthContext authContext) { diff --git a/src/main/java/com/jisungin/api/talkroomlike/TalkRoomLikeController.java b/src/main/java/com/jisungin/api/talkroomlike/TalkRoomLikeController.java new file mode 100644 index 0000000..ad81678 --- /dev/null +++ b/src/main/java/com/jisungin/api/talkroomlike/TalkRoomLikeController.java @@ -0,0 +1,44 @@ +package com.jisungin.api.talkroomlike; + +import com.jisungin.api.ApiResponse; +import com.jisungin.api.oauth.Auth; +import com.jisungin.api.oauth.AuthContext; +import com.jisungin.application.talkroomlike.TalkRoomLikeService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RequestMapping("/v1") +@RestController +public class TalkRoomLikeController { + + private final TalkRoomLikeService talkRoomLikeService; + + @PostMapping("/talk-rooms/{talkRoomId}/likes") + public ApiResponse likeTalkRoom(@PathVariable Long talkRoomId, + @Auth AuthContext authContext) { + talkRoomLikeService.likeTalkRoom(talkRoomId, authContext.getUserId()); + + return ApiResponse.builder() + .message("좋아요 성공") + .status(HttpStatus.OK) + .build(); + } + + @DeleteMapping("/talk-rooms/{talkRoomId}/likes") + public ApiResponse nuLikeTalkRoom(@PathVariable Long talkRoomId, + @Auth AuthContext authContext) { + talkRoomLikeService.unLikeTalkRoom(talkRoomId, authContext.getUserId()); + + return ApiResponse.builder() + .message("좋아요 취소") + .status(HttpStatus.OK) + .build(); + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java index 3601052..0953fa6 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java @@ -17,7 +17,9 @@ public class TalkRoomFindAllResponse { private String content; private String bookName; private String bookImage; - private List readingStatuses = new ArrayList<>(); + private List readingStatuses = new ArrayList<>(); + private List likeCounts = new ArrayList<>(); + private List userIds = new ArrayList<>(); @Builder @QueryProjection @@ -31,8 +33,16 @@ public TalkRoomFindAllResponse(Long talkRoomId, String userName, String title, S this.bookImage = bookImage; } - public void addTalkRoomStatus(List readingStatuses) { + public void addTalkRoomStatus(List readingStatuses) { this.readingStatuses = readingStatuses; } + public void addTalkRoomLikeUserIds(List userIds) { + this.userIds = userIds; + } + + public void addLikeCounts(List likeCounts) { + this.likeCounts = likeCounts; + } + } diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java index a9c3a55..b4f7f39 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java @@ -17,8 +17,11 @@ public class TalkRoomFindOneResponse { private String content; private String bookName; private String bookImage; - private List readingStatuses = new ArrayList<>(); - private List comments = new ArrayList<>(); + private List readingStatuses = new ArrayList<>(); + private List comments = new ArrayList<>(); + private Long likeCount; + private Long commentCount; + private List userIds = new ArrayList<>(); @Builder @QueryProjection @@ -32,12 +35,24 @@ public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, S this.bookImage = bookImage; } - public void addTalkRoomStatus(List readingStatuses) { + public void addTalkRoomStatus(List readingStatuses) { this.readingStatuses = readingStatuses; } - public void addTalkRoomComments(List comments) { + public void addTalkRoomComments(List comments) { this.comments = comments; } + public void addLikeCount(Long likeCount) { + this.likeCount = likeCount; + } + + public void addCommentCount(Long commentCount) { + this.commentCount = commentCount; + } + + public void addUserIds(List userIds) { + this.userIds = userIds; + } + } diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeQueryResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeQueryResponse.java new file mode 100644 index 0000000..118c8f3 --- /dev/null +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeQueryResponse.java @@ -0,0 +1,22 @@ +package com.jisungin.application.talkroom.response; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class TalkRoomLikeQueryResponse { + + private Long talkRoomId; + private Long likeCount; + + @Builder + @QueryProjection + public TalkRoomLikeQueryResponse(Long talkRoomId, Long likeCount) { + this.talkRoomId = talkRoomId; + this.likeCount = likeCount; + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeUserIdResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeUserIdResponse.java new file mode 100644 index 0000000..8748b91 --- /dev/null +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomLikeUserIdResponse.java @@ -0,0 +1,22 @@ +package com.jisungin.application.talkroom.response; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class TalkRoomLikeUserIdResponse { + + private Long talkRoomId; + private Long userId; + + @Builder + @QueryProjection + public TalkRoomLikeUserIdResponse(Long talkRoomId, Long userId) { + this.talkRoomId = talkRoomId; + this.userId = userId; + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryCommentsResponse.java similarity index 76% rename from src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java rename to src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryCommentsResponse.java index d9d5489..34e549e 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryCommentsResponse.java @@ -7,7 +7,7 @@ @Getter @NoArgsConstructor -public class TalkRoomQueryComments { +public class TalkRoomQueryCommentsResponse { private Long commentId; private String userName; @@ -15,7 +15,7 @@ public class TalkRoomQueryComments { @Builder @QueryProjection - public TalkRoomQueryComments(Long commentId, String userName, String content) { + public TalkRoomQueryCommentsResponse(Long commentId, String userName, String content) { this.commentId = commentId; this.userName = userName; this.content = content; diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatus.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatusResponse.java similarity index 75% rename from src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatus.java rename to src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatusResponse.java index 8399f40..7a4a393 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatus.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryReadingStatusResponse.java @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor -public class TalkRoomQueryReadingStatus { +public class TalkRoomQueryReadingStatusResponse { private Long talkRoomId; @@ -16,7 +16,7 @@ public class TalkRoomQueryReadingStatus { @Builder @QueryProjection - public TalkRoomQueryReadingStatus(Long talkRoomId, ReadingStatus readingStatus) { + public TalkRoomQueryReadingStatusResponse(Long talkRoomId, ReadingStatus readingStatus) { this.talkRoomId = talkRoomId; this.readingStatus = readingStatus; } diff --git a/src/main/java/com/jisungin/application/talkroomlike/TalkRoomLikeService.java b/src/main/java/com/jisungin/application/talkroomlike/TalkRoomLikeService.java new file mode 100644 index 0000000..2a9bc29 --- /dev/null +++ b/src/main/java/com/jisungin/application/talkroomlike/TalkRoomLikeService.java @@ -0,0 +1,55 @@ +package com.jisungin.application.talkroomlike; + +import com.jisungin.domain.talkroom.TalkRoom; +import com.jisungin.domain.talkroom.repository.TalkRoomRepository; +import com.jisungin.domain.talkroomlike.TalkRoomLike; +import com.jisungin.domain.talkroomlike.repository.TalkRoomLikeRepository; +import com.jisungin.domain.user.User; +import com.jisungin.domain.user.repository.UserRepository; +import com.jisungin.exception.BusinessException; +import com.jisungin.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class TalkRoomLikeService { + + private final TalkRoomLikeRepository talkRoomLikeRepository; + private final TalkRoomRepository talkRoomRepository; + private final UserRepository userRepository; + + @Transactional + public void likeTalkRoom(Long talkRoomId, Long userId) { + TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId) + .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND)); + + User user = userRepository.findById(userId).orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + + if (talkRoomLikeRepository.findByTalkRoomIdAndUserId(talkRoomId, userId).isPresent()) { + throw new BusinessException(ErrorCode.LIKE_EXIST); + } + + TalkRoomLike talkRoomLike = TalkRoomLike.likeTalkRoom(user, talkRoom); + + talkRoomLikeRepository.save(talkRoomLike); + } + + + @Transactional + public void unLikeTalkRoom(Long talkRoomId, Long userId) { + TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId) + .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND)); + + User user = userRepository.findById(userId) + .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND)); + + TalkRoomLike talkRoomLike = talkRoomLikeRepository.findByTalkRoomIdAndUserId(talkRoom.getId(), user.getId()) + .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_LIKE_NOT_FOUND)); + + talkRoomLikeRepository.delete(talkRoomLike); + } + +} diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java index 0175155..0945dd7 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java @@ -4,18 +4,23 @@ import static com.jisungin.domain.comment.QComment.comment; import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom; import static com.jisungin.domain.talkroom.QTalkRoomRole.talkRoomRole; +import static com.jisungin.domain.talkroomlike.QTalkRoomLike.talkRoomLike; import static com.jisungin.domain.user.QUser.user; import com.jisungin.application.response.PageResponse; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; import com.jisungin.application.talkroom.response.QTalkRoomFindAllResponse; import com.jisungin.application.talkroom.response.QTalkRoomFindOneResponse; -import com.jisungin.application.talkroom.response.QTalkRoomQueryComments; -import com.jisungin.application.talkroom.response.QTalkRoomQueryReadingStatus; +import com.jisungin.application.talkroom.response.QTalkRoomLikeQueryResponse; +import com.jisungin.application.talkroom.response.QTalkRoomLikeUserIdResponse; +import com.jisungin.application.talkroom.response.QTalkRoomQueryCommentsResponse; +import com.jisungin.application.talkroom.response.QTalkRoomQueryReadingStatusResponse; import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; -import com.jisungin.application.talkroom.response.TalkRoomQueryComments; -import com.jisungin.application.talkroom.response.TalkRoomQueryReadingStatus; +import com.jisungin.application.talkroom.response.TalkRoomLikeQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomLikeUserIdResponse; +import com.jisungin.application.talkroom.response.TalkRoomQueryCommentsResponse; +import com.jisungin.application.talkroom.response.TalkRoomQueryReadingStatusResponse; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; @@ -28,6 +33,7 @@ public class TalkRoomRepositoryImpl implements TalkRoomRepositoryCustom { private final JPAQueryFactory queryFactory; + // 토크룸 페이징 조회 @Override public PageResponse findAllTalkRoom(TalkRoomSearchServiceRequest search) { @@ -35,11 +41,21 @@ public PageResponse findAllTalkRoom(TalkRoomSearchServi List findTalkRoom = findTalkRoomBySearch(search); //TalkRoomRole 컬렉션을 MAP 한방에 조회 - Map> talkRoomRoleMap = findTalkRoomRoleMap(toTalkRoomIds(findTalkRoom)); + Map> talkRoomRoleMap = findTalkRoomRoleMap( + toTalkRoomIds(findTalkRoom)); //루프를 돌면서 컬렉션 추가(추가 쿼리 실행X) findTalkRoom.forEach(t -> t.addTalkRoomStatus(talkRoomRoleMap.get(t.getTalkRoomId()))); + // 좋아요 추가 + Map> likeCountMap = talkRoomLikeCount(toTalkRoomIds(findTalkRoom)); + findTalkRoom.forEach(t -> t.addLikeCounts(likeCountMap.get(t.getTalkRoomId()))); + + // 좋아요한 유저 ID 정보들 + Map> talkRoomLikeUserMap = findTalkRoomLikeUserId( + toTalkRoomIds(findTalkRoom)); + findTalkRoom.forEach(t -> t.addTalkRoomLikeUserIds(talkRoomLikeUserMap.get(t.getTalkRoomId()))); + long totalCount = getTotalTalkRoomCount(); return PageResponse.builder() @@ -49,63 +65,141 @@ public PageResponse findAllTalkRoom(TalkRoomSearchServi .build(); } + // 토크룸 단건 조회 @Override public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { TalkRoomFindOneResponse findOneTalkRoom = findTalkRoomByTalkRoomId(talkRoomId); - List talkRoomRoles = findTalkRoomRoleByTalkRoomId(talkRoomId); + List talkRoomRoles = findTalkRoomRoleByTalkRoomId(talkRoomId); findOneTalkRoom.addTalkRoomStatus(talkRoomRoles); - List talkRoomComments = findCommentsByTalkRoomId(talkRoomId); + List talkRoomComments = findCommentsByTalkRoomId(talkRoomId); findOneTalkRoom.addTalkRoomComments(talkRoomComments); + findOneTalkRoom.addLikeCount(findOneTalkRoomLikeCount(talkRoomId)); + + findOneTalkRoom.addCommentCount(findOneTalkRoomCommentCount(talkRoomId)); + + List userIds = findOneTalkRoomLikeUserId(talkRoomId); + findOneTalkRoom.addUserIds(userIds); + return findOneTalkRoom; } - private List findCommentsByTalkRoomId(Long talkRoomId) { - return queryFactory.select(new QTalkRoomQueryComments( - comment.id.as("commentId"), + // 토크룸 페이징 조회 쿼리 + private List findTalkRoomBySearch(TalkRoomSearchServiceRequest search) { + return queryFactory.select(new QTalkRoomFindAllResponse( + talkRoom.id.as("talkRoomId"), user.name.as("userName"), - comment.content + talkRoom.title, + talkRoom.content, + book.title, + book.imageUrl.as("bookImage") )) - .from(comment) - .join(comment.talkRoom, talkRoom) - .join(comment.user, user) - .where(comment.talkRoom.id.eq(talkRoomId)) + .from(talkRoom) + .join(talkRoom.user, user) + .join(talkRoom.book, book) + .offset(search.getOffset()) + .limit(search.getSize()) + .orderBy(condition(search.getOrder())) .fetch(); } - private List findTalkRoomRoleByTalkRoomId(Long talkRoomId) { - return queryFactory.select(new QTalkRoomQueryReadingStatus( - talkRoom.id, - talkRoomRole.readingStatus - )) + // 쿼리에서 가져온 토크룸 ID를 List 객체에 넣어주는 로직 + private List toTalkRoomIds(List findTalkRoom) { + return findTalkRoom.stream() + .map(t -> t.getTalkRoomId()) + .collect(Collectors.toList()); + } + + // 토크룸 상태 가져온 후 Map<>에 넣어주는 로직 + private Map> findTalkRoomRoleMap(List talkRoomIds) { + List talkRoomRoles = queryFactory.select( + new QTalkRoomQueryReadingStatusResponse( + talkRoom.id, + talkRoomRole.readingStatus + )) .from(talkRoomRole) .join(talkRoomRole.talkRoom, talkRoom) - .where(talkRoomRole.talkRoom.id.eq(talkRoomId)) + .where(talkRoomRole.talkRoom.id.in(talkRoomIds)) + .fetch(); + + return talkRoomRoles.stream() + .collect(Collectors.groupingBy(TalkRoomQueryReadingStatusResponse::getTalkRoomId)); + } + + // 좋아요 총 개수 가져온 후 Map<>에 넣어주는 로직 + public Map> talkRoomLikeCount(List talkRoomId) { + List likeCount = queryFactory.select(new QTalkRoomLikeQueryResponse( + talkRoom.id.as("talkRoomId"), + talkRoomLike.count().as("likeCount") + )) + .from(talkRoomLike) + .join(talkRoomLike.talkRoom, talkRoom) + .where(talkRoomLike.talkRoom.id.in(talkRoomId)) + .groupBy(talkRoom.id) .fetch(); + + return likeCount.stream() + .collect(Collectors.groupingBy(TalkRoomLikeQueryResponse::getTalkRoomId)); } - private List toTalkRoomIds(List findTalkRoom) { - return findTalkRoom.stream() - .map(t -> t.getTalkRoomId()) - .collect(Collectors.toList()); + // 토크룸 좋아요 누른 사용자 ID 가져온 후 Map<>에 넣어주는 로직 + private Map> findTalkRoomLikeUserId(List talkRoomIds) { + List talkRoomLikeUserIds = queryFactory.select(new QTalkRoomLikeUserIdResponse( + talkRoom.id.as("talkRoomId"), + user.id.as("userId") + )) + .from(talkRoomLike) + .join(talkRoomLike.talkRoom, talkRoom) + .join(talkRoomLike.user, user) + .where(talkRoomLike.talkRoom.id.in(talkRoomIds)) + .fetch(); + + return talkRoomLikeUserIds.stream() + .collect(Collectors.groupingBy(TalkRoomLikeUserIdResponse::getTalkRoomId)); + } + + // 토크룸 좋아요 누른 사용자 ID 가져온 후 Map<>에 넣어주는 로직 + private List findOneTalkRoomLikeUserId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomLikeUserIdResponse( + talkRoom.id.as("talkRoomId"), + user.id.as("userId") + )) + .from(talkRoomLike) + .join(talkRoomLike.talkRoom, talkRoom) + .join(talkRoomLike.user, user) + .where(talkRoomLike.talkRoom.id.eq(talkRoomId)) + .fetch(); } - private Map> findTalkRoomRoleMap(List talkRoomIds) { - List talkRoomRoles = queryFactory.select(new QTalkRoomQueryReadingStatus( + // 토크룸 단건 조회 시 토크룸 상태 가져오는 쿼리 + private List findTalkRoomRoleByTalkRoomId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomQueryReadingStatusResponse( talkRoom.id, talkRoomRole.readingStatus )) .from(talkRoomRole) .join(talkRoomRole.talkRoom, talkRoom) - .where(talkRoomRole.talkRoom.id.in(talkRoomIds)) + .where(talkRoomRole.talkRoom.id.eq(talkRoomId)) .fetch(); + } - return talkRoomRoles.stream() - .collect(Collectors.groupingBy(TalkRoomQueryReadingStatus::getTalkRoomId)); + // 토크룸에 저장된 의견들 가져오는 쿼리 + private List findCommentsByTalkRoomId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomQueryCommentsResponse( + comment.id.as("commentId"), + user.name.as("userName"), + comment.content + )) + .from(comment) + .join(comment.talkRoom, talkRoom) + .join(comment.user, user) + .where(comment.talkRoom.id.eq(talkRoomId)) + .fetch(); } + // 토크룸 전체 개수 가져오는 쿼리 private long getTotalTalkRoomCount() { return queryFactory .select(talkRoom.count()) @@ -115,24 +209,7 @@ private long getTotalTalkRoomCount() { .fetchOne(); } - private List findTalkRoomBySearch(TalkRoomSearchServiceRequest search) { - return queryFactory.select(new QTalkRoomFindAllResponse( - talkRoom.id.as("talkRoomId"), - user.name.as("userName"), - talkRoom.title, - talkRoom.content, - book.title, - book.imageUrl.as("bookImage") - )) - .from(talkRoom) - .join(talkRoom.user, user) - .join(talkRoom.book, book) - .offset(search.getOffset()) - .limit(search.getSize()) - .orderBy(condition(search.getOrder())) - .fetch(); - } - + // 토크룸 단건 조회 쿼리 private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) { return queryFactory.select(new QTalkRoomFindOneResponse( talkRoom.id.as("talkRoomId"), @@ -149,6 +226,24 @@ private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) { .fetchOne(); } + // 토크룸 단건 조회 시 좋아요 총 개수 찾아오는 로직 + private Long findOneTalkRoomLikeCount(Long talkRoomId) { + return queryFactory.select(talkRoomLike.count()) + .from(talkRoomLike) + .join(talkRoomLike.talkRoom, talkRoom) + .where(talkRoomLike.talkRoom.id.eq(talkRoomId)) + .fetchOne(); + } + + // 토크룸 단건 조회 시 의견 총 개수 가져오는 로직 + private Long findOneTalkRoomCommentCount(Long talkRoomId) { + return queryFactory.select(comment.count()) + .from(comment) + .join(comment.talkRoom, talkRoom) + .where(comment.talkRoom.id.eq(talkRoomId)) + .fetchOne(); + } + /** * 아직 좋아요 기능이 구현 되지 않아 최신순으로만 정렬 */ diff --git a/src/main/java/com/jisungin/domain/talkroomlike/TalkRoomLike.java b/src/main/java/com/jisungin/domain/talkroomlike/TalkRoomLike.java index 9c55e0d..6e09bd0 100644 --- a/src/main/java/com/jisungin/domain/talkroomlike/TalkRoomLike.java +++ b/src/main/java/com/jisungin/domain/talkroomlike/TalkRoomLike.java @@ -3,7 +3,14 @@ import com.jisungin.domain.BaseEntity; import com.jisungin.domain.talkroom.TalkRoom; import com.jisungin.domain.user.User; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +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.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -33,4 +40,11 @@ private TalkRoomLike(User user, TalkRoom talkRoom) { this.talkRoom = talkRoom; } + public static TalkRoomLike likeTalkRoom(User user, TalkRoom talkRoom) { + return TalkRoomLike.builder() + .user(user) + .talkRoom(talkRoom) + .build(); + } + } diff --git a/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java b/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java new file mode 100644 index 0000000..fb33c44 --- /dev/null +++ b/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java @@ -0,0 +1,12 @@ +package com.jisungin.domain.talkroomlike.repository; + +import com.jisungin.domain.talkroomlike.TalkRoomLike; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TalkRoomLikeRepository extends JpaRepository { + + Optional findByTalkRoomIdAndUserId(Long talkRoomId, Long userId); +} diff --git a/src/main/java/com/jisungin/exception/ErrorCode.java b/src/main/java/com/jisungin/exception/ErrorCode.java index e6a3e33..39b131b 100644 --- a/src/main/java/com/jisungin/exception/ErrorCode.java +++ b/src/main/java/com/jisungin/exception/ErrorCode.java @@ -17,7 +17,8 @@ public enum ErrorCode { UNAUTHORIZED_REQUEST(400, "권한이 없는 사용자입니다."), COMMENT_NOT_FOUND(404, "의견을 찾을 수 없습니다."), REVIEW_NOT_FOUND(404, "리뷰를 찾을 수 없습니다."), - REQUEST_TIME_OUT(408, "요청 시간이 만료 되었습니다."); + TALK_ROOM_LIKE_NOT_FOUND(404, "토크방 좋아요를 찾을 수 없습니다."), + LIKE_EXIST(400, "이미 좋아요를 눌렀습니다."); private final int code;