Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] TalkRoom 좋아요, 검색 쿼리 기능 구현 #44

Merged
merged 6 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.jisungin.api.talkroom.request.TalkRoomCreateRequest;
import com.jisungin.api.talkroom.request.TalkRoomEditRequest;
import com.jisungin.api.talkroom.request.TalkRoomSearchRequest;
import com.jisungin.application.response.PageResponse;
import com.jisungin.application.PageResponse;
import com.jisungin.application.talkroom.TalkRoomService;
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
Expand All @@ -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
@@ -1,5 +1,6 @@
package com.jisungin.api.talkroom.request;

import com.jisungin.application.OrderType;
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -17,18 +18,22 @@ public class TalkRoomSearchRequest {

private String order;

private String search;

@Builder
private TalkRoomSearchRequest(Integer page, Integer size, String order) {
private TalkRoomSearchRequest(Integer page, Integer size, String order, String search) {
this.page = page != null ? page : 1;
this.size = size != null ? size : 1;
this.order = order != null ? order : "recent";
this.search = search;
}

public TalkRoomSearchServiceRequest toService() {
return TalkRoomSearchServiceRequest.builder()
.page(page)
.size(size)
.order(order)
.search(search)
.orderType(OrderType.convertToOrderType(order))
.build();
}

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();
}

}
21 changes: 21 additions & 0 deletions src/main/java/com/jisungin/application/OrderType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.jisungin.application;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public enum OrderType {

RECENT("최신순"),
RECOMMEND("좋아요순");

private final String text;

public static OrderType convertToOrderType(String order) {
return switch (order) {
case "recent" -> RECENT;
case "recommend" -> RECOMMEND;
default -> RECENT;
};
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jisungin.application.response;
package com.jisungin.application;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.jisungin.application.talkroom;

import com.jisungin.application.response.PageResponse;
import com.jisungin.application.PageResponse;
import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest;
import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest;
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.lang.Math.max;
import static java.lang.Math.min;

import com.jisungin.application.OrderType;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -17,13 +18,16 @@ public class TalkRoomSearchServiceRequest {

private Integer size;

private String order;
private OrderType orderType;

private String search;

@Builder
private TalkRoomSearchServiceRequest(Integer page, Integer size, String order) {
private TalkRoomSearchServiceRequest(Integer page, Integer size, OrderType orderType, String search) {
this.page = page;
this.size = size;
this.order = order;
this.orderType = orderType;
this.search = search;
}

public long getOffset() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,29 @@ 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<TalkRoomLikeUserIdResponse> userIds = new ArrayList<>();
private Long likeCount;

@Builder
@QueryProjection
public TalkRoomFindAllResponse(Long talkRoomId, String userName, String title, String content, String bookName,
String bookImage) {
String bookImage, Long likeCount) {
this.talkRoomId = talkRoomId;
this.userName = userName;
this.title = title;
this.content = content;
this.bookName = bookName;
this.bookImage = bookImage;
this.likeCount = likeCount;
}

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

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

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,40 @@ 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
public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, String content, String bookName,
String bookImage) {
String bookImage, Long likeCount, Long commentCount) {
this.talkRoomId = talkRoomId;
this.userName = userName;
this.title = title;
this.content = content;
this.bookName = bookName;
this.bookImage = bookImage;
this.likeCount = likeCount;
this.commentCount = commentCount;
}

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 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 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);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.jisungin.domain.talkroom.repository;

import com.querydsl.core.types.NullExpression;
import com.querydsl.core.types.Order;
import com.querydsl.core.types.OrderSpecifier;

public class OrderByNull extends OrderSpecifier {
public static final OrderByNull DEFAULT = new OrderByNull();

private OrderByNull() {
super(Order.ASC, NullExpression.DEFAULT, NullHandling.Default);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.jisungin.domain.talkroom.repository;

import com.jisungin.application.response.PageResponse;
import com.jisungin.application.PageResponse;
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
Expand Down
Loading
Loading