Skip to content

Commit

Permalink
Merge pull request #44 from jisung-in/feature/40-talkroom-like-and-se…
Browse files Browse the repository at this point in the history
…arh-api

[Feature] TalkRoom 좋아요, 검색 쿼리 기능 구현
  • Loading branch information
AHNYUNKI authored Mar 27, 2024
2 parents 555e2c9 + 658588a commit d428c29
Show file tree
Hide file tree
Showing 25 changed files with 1,597 additions and 293 deletions.
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

0 comments on commit d428c29

Please sign in to comment.