Skip to content

Commit

Permalink
feat: TalkRoom 좋아요 기능 구현 (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
AHNYUNKI committed Mar 27, 2024
1 parent 555e2c9 commit dfc3dcb
Show file tree
Hide file tree
Showing 13 changed files with 350 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ public class TalkRoomController {

private final TalkRoomService talkRoomService;

// TODO. 회원 도메인이 개발되면 변경 예정
@PostMapping("/talk-rooms")
public ApiResponse<TalkRoomResponse> createTalkRoom(@Valid @RequestBody TalkRoomCreateRequest request, @Auth
AuthContext authContext) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Void> likeTalkRoom(@PathVariable Long talkRoomId,
@Auth AuthContext authContext) {
talkRoomLikeService.likeTalkRoom(talkRoomId, authContext.getUserId());

return ApiResponse.<Void>builder()
.message("좋아요 성공")
.status(HttpStatus.OK)
.build();
}

@DeleteMapping("/talk-rooms/{talkRoomId}/likes")
public ApiResponse<Void> nuLikeTalkRoom(@PathVariable Long talkRoomId,
@Auth AuthContext authContext) {
talkRoomLikeService.unLikeTalkRoom(talkRoomId, authContext.getUserId());

return ApiResponse.<Void>builder()
.message("좋아요 취소")
.status(HttpStatus.OK)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ public class TalkRoomFindAllResponse {
private String content;
private String bookName;
private String bookImage;
private List<TalkRoomQueryReadingStatus> readingStatuses = new ArrayList<>();
private List<TalkRoomQueryReadingStatusResponse> readingStatuses = new ArrayList<>();
private List<TalkRoomLikeQueryResponse> likeCounts = new ArrayList<>();
private List<TalkRoomLikeUserIdResponse> userIds = new ArrayList<>();

@Builder
@QueryProjection
Expand All @@ -31,8 +33,16 @@ public TalkRoomFindAllResponse(Long talkRoomId, String userName, String title, S
this.bookImage = bookImage;
}

public void addTalkRoomStatus(List<TalkRoomQueryReadingStatus> readingStatuses) {
public void addTalkRoomStatus(List<TalkRoomQueryReadingStatusResponse> readingStatuses) {
this.readingStatuses = readingStatuses;
}

public void addTalkRoomLikeUserIds(List<TalkRoomLikeUserIdResponse> userIds) {
this.userIds = userIds;
}

public void addLikeCounts(List<TalkRoomLikeQueryResponse> likeCounts) {
this.likeCounts = likeCounts;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ public class TalkRoomFindOneResponse {
private String content;
private String bookName;
private String bookImage;
private List<TalkRoomQueryReadingStatus> readingStatuses = new ArrayList<>();
private List<TalkRoomQueryComments> comments = new ArrayList<>();
private List<TalkRoomQueryReadingStatusResponse> readingStatuses = new ArrayList<>();
private List<TalkRoomQueryCommentsResponse> comments = new ArrayList<>();
private Long likeCount;
private Long commentCount;
private List<TalkRoomLikeUserIdResponse> userIds = new ArrayList<>();

@Builder
@QueryProjection
Expand All @@ -32,12 +35,24 @@ public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, S
this.bookImage = bookImage;
}

public void addTalkRoomStatus(List<TalkRoomQueryReadingStatus> readingStatuses) {
public void addTalkRoomStatus(List<TalkRoomQueryReadingStatusResponse> readingStatuses) {
this.readingStatuses = readingStatuses;
}

public void addTalkRoomComments(List<TalkRoomQueryComments> comments) {
public void addTalkRoomComments(List<TalkRoomQueryCommentsResponse> comments) {
this.comments = comments;
}

public void addLikeCount(Long likeCount) {
this.likeCount = likeCount;
}

public void addCommentCount(Long commentCount) {
this.commentCount = commentCount;
}

public void addUserIds(List<TalkRoomLikeUserIdResponse> userIds) {
this.userIds = userIds;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@

@Getter
@NoArgsConstructor
public class TalkRoomQueryComments {
public class TalkRoomQueryCommentsResponse {

private Long commentId;
private String userName;
private String content;

@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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@

@Getter
@NoArgsConstructor
public class TalkRoomQueryReadingStatus {
public class TalkRoomQueryReadingStatusResponse {

private Long talkRoomId;

private ReadingStatus readingStatus;

@Builder
@QueryProjection
public TalkRoomQueryReadingStatus(Long talkRoomId, ReadingStatus readingStatus) {
public TalkRoomQueryReadingStatusResponse(Long talkRoomId, ReadingStatus readingStatus) {
this.talkRoomId = talkRoomId;
this.readingStatus = readingStatus;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}

}
Loading

0 comments on commit dfc3dcb

Please sign in to comment.