Skip to content
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
Empty file modified jace/gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ public ApiResponse<MissionResDTO.GetHome> getHome(
@GetMapping("/users/me/missions")
public ApiResponse<MissionResDTO.GetMyMission> getMyMission(
@RequestParam MissionStatus missionCondition,
@RequestParam(required = false) Long cursorId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
){
BaseSuccessCode code = MissionSuccessCode.MyMissionOK;
return ApiResponse.onSuccess(code, missionService.getMyMission(missionCondition, cursorId, size));
return ApiResponse.onSuccess(code, missionService.getMyMission(missionCondition, page, size));
}

@PatchMapping("/users/me/missions/{missionId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,22 @@
import com.umcstudy.jace.domain.mission.dto.MissionResDTO;
import com.umcstudy.jace.domain.mission.entity.Mission;
import com.umcstudy.jace.domain.mission.entity.mapping.MissionUser;
import org.springframework.data.domain.Page;

import java.util.List;

public class MissionConverter {

public static MissionResDTO.MissionItem toMissionItem(Mission mission) {
return new MissionResDTO.MissionItem(
mission.getId().intValue(),
mission.getShop().getId().intValue(),
mission.getShop().getShopName(),
mission.getShop().getShopCategory().getShopCategoryName(),
mission.getMissionPay(),
mission.getMissionPoint(),
mission.getMissionCreateTime() != null ? mission.getMissionCreateTime().toLocalDate() : null
);
return MissionResDTO.MissionItem.builder()
.missionId(mission.getId().intValue())
.shopId(mission.getShop().getId().intValue())
.shopName(mission.getShop().getShopName())
.shopCategory(mission.getShop().getShopCategory().getShopCategoryName())
.missionPay(mission.getMissionPay())
.missionPoint(mission.getMissionPoint())
.createDate(mission.getMissionCreateTime() != null ? mission.getMissionCreateTime().toLocalDate() : null)
.build();
}

public static MissionResDTO.GetHome toGetHome(long clearMissionCnt, List<MissionResDTO.MissionItem> missionList, boolean hasNext) {
Expand All @@ -30,22 +31,28 @@ public static MissionResDTO.GetHome toGetHome(long clearMissionCnt, List<Mission

public static MissionResDTO.MyMissionItem toMyMissionItem(MissionUser missionUser) {
Mission mission = missionUser.getMission();
return new MissionResDTO.MyMissionItem(
missionUser.getId(),
mission.getId().intValue(),
mission.getShop().getId().intValue(),
mission.getShop().getShopName(),
mission.getShop().getShopCategory().getShopCategoryName(),
mission.getMissionPay(),
mission.getMissionPoint(),
missionUser.getMissionCondition()
);
return MissionResDTO.MyMissionItem.builder()
.userMissionId(missionUser.getId())
.missionId(mission.getId().intValue())
.shopId(mission.getShop().getId().intValue())
.shopName(mission.getShop().getShopName())
.shopCategory(mission.getShop().getShopCategory().getShopCategoryName())
.missionPay(mission.getMissionPay())
.missionPoint(mission.getMissionPoint())
.missionCondition(missionUser.getMissionCondition())
.build();
}

public static MissionResDTO.GetMyMission toGetMyMission(List<MissionResDTO.MyMissionItem> missionList, boolean hasNext) {
public static MissionResDTO.GetMyMission toGetMyMission(Page<MissionUser> page) {
List<MissionResDTO.MyMissionItem> missionList = page.getContent().stream()
.map(MissionConverter::toMyMissionItem)
.toList();
return MissionResDTO.GetMyMission.builder()
.missionList(missionList)
.hasNext(hasNext)
.currentPage(page.getNumber())
.totalPage(page.getTotalPages())
.totalCount(page.getTotalElements())
.hasNext(page.hasNext())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

public class MissionResDTO {

@Builder
public record MissionItem(
Integer missionId,
Integer shopId,
Expand All @@ -25,6 +26,7 @@ public record GetHome(
Boolean hasNext
){}

@Builder
public record MyMissionItem(
Long userMissionId,
Integer missionId,
Expand All @@ -39,6 +41,9 @@ public record MyMissionItem(
@Builder
public record GetMyMission(
List<MyMissionItem> missionList,
Integer currentPage,
Integer totalPage,
Long totalCount,
Boolean hasNext
){}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
public interface MissionRepository extends JpaRepository<Mission, Long> {

@Query("SELECT m FROM Mission m " +
"WHERE m.shop.shopAddress LIKE %:region% " +
"JOIN FETCH m.shop s " +
"JOIN FETCH s.shopCategory " +
"WHERE s.shopAddress LIKE %:region% " +
"AND (:cursorId IS NULL OR m.id < :cursorId) " +
"ORDER BY m.id DESC")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

order by를 제거하고 Pageable에게 정렬 책임을 위임하는 것이 나을 것 같습니다! Pageable에도 정렬조건이 있고, ORDER BY 절에 의한 정렬 쿼리가 작성되어 있다면 Hibernate가 sql을 파싱하는 과정에서 정렬 구문이 중복되거나 충돌하여 syntax 에러가 발생할 수 있기 때문입니다!

List<Mission> findByRegionWithCursor(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pageable 파라미터를 사용하면서 List 타입을 반환하면 다음 페이지의 존재 여부 파악이 되지 않습니다! Slice와 같은 타입으로 변경하시면 좋을 것 같아요!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,29 @@

import com.umcstudy.jace.domain.mission.entity.mapping.MissionUser;
import com.umcstudy.jace.domain.mission.enums.MissionStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface MissionUserRepository extends JpaRepository<MissionUser, Long> {

long countByUser_IdAndMissionCondition(Long userId, MissionStatus missionCondition);

@Query("SELECT mu FROM MissionUser mu " +
"WHERE mu.user.id = :userId " +
"AND mu.missionCondition = :missionCondition " +
"AND (:cursorId IS NULL OR mu.id < :cursorId) " +
"ORDER BY mu.id DESC")
List<MissionUser> findByUserIdAndConditionWithCursor(
@Query(value = "SELECT mu FROM MissionUser mu " +
"JOIN FETCH mu.mission m " +
"JOIN FETCH m.shop s " +
"JOIN FETCH s.shopCategory " +
"WHERE mu.user.id = :userId " +
"AND mu.missionCondition = :missionCondition " +
"ORDER BY mu.id DESC",
countQuery = "SELECT COUNT(mu) FROM MissionUser mu " +
"WHERE mu.user.id = :userId " +
"AND mu.missionCondition = :missionCondition")
Page<MissionUser> findByUserIdAndCondition(
@Param("userId") Long userId,
@Param("missionCondition") MissionStatus missionCondition,
@Param("cursorId") Long cursorId,
Pageable pageable
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import com.umcstudy.jace.domain.mission.enums.MissionStatus;
import com.umcstudy.jace.domain.mission.repository.MissionRepository;
import com.umcstudy.jace.domain.mission.repository.MissionUserRepository;
import com.umcstudy.jace.global.security.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand All @@ -25,7 +25,7 @@ public class MissionService {

@Transactional(readOnly = true)
public MissionResDTO.GetHome getHome(String region, Long cursorId, int size) {
Long userId = Long.parseLong(SecurityContextHolder.getContext().getAuthentication().getName());
Long userId = SecurityUtils.getCurrentUserId();

long clearMissionCnt = missionUserRepository.countByUser_IdAndMissionCondition(userId, MissionStatus.SUCCESS);

Expand All @@ -37,27 +37,19 @@ public MissionResDTO.GetHome getHome(String region, Long cursorId, int size) {

List<MissionResDTO.MissionItem> missionList = missions.stream()
.map(MissionConverter::toMissionItem)
.collect(Collectors.toList());
.toList();

return MissionConverter.toGetHome(clearMissionCnt, missionList, hasNext);
}

@Transactional(readOnly = true)
public MissionResDTO.GetMyMission getMyMission(MissionStatus missionCondition, Long cursorId, int size) {
Long userId = Long.parseLong(SecurityContextHolder.getContext().getAuthentication().getName());
public MissionResDTO.GetMyMission getMyMission(MissionStatus missionCondition, int page, int size) {
Long userId = SecurityUtils.getCurrentUserId();

List<MissionUser> missionUsers = missionUserRepository.findByUserIdAndConditionWithCursor(
userId, missionCondition, cursorId, PageRequest.of(0, size + 1));
boolean hasNext = missionUsers.size() > size;
if (hasNext) {
missionUsers = missionUsers.subList(0, size);
}

List<MissionResDTO.MyMissionItem> missionList = missionUsers.stream()
.map(MissionConverter::toMyMissionItem)
.collect(Collectors.toList());
Page<MissionUser> missionUsers = missionUserRepository.findByUserIdAndCondition(
userId, missionCondition, PageRequest.of(page, size));

return MissionConverter.toGetMyMission(missionList, hasNext);
return MissionConverter.toGetMyMission(missionUsers);
}

public MissionResDTO.PatchMissionSuc patchMissionSuc(Integer missionId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import com.umcstudy.jace.domain.review.dto.ReviewReqDTO;
import com.umcstudy.jace.domain.review.dto.ReviewResDTO;
import com.umcstudy.jace.domain.review.enums.ReviewSortType;
import com.umcstudy.jace.domain.review.exception.code.ReviewSuccessCode;
import com.umcstudy.jace.domain.review.service.ReviewService;
import com.umcstudy.jace.global.apiPayload.ApiResponse;
import com.umcstudy.jace.global.apiPayload.code.BaseSuccessCode;
import lombok.RequiredArgsConstructor;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

@RestController
Expand All @@ -16,6 +18,16 @@ public class ReviewController {

private final ReviewService reviewService;

@GetMapping("/users/me/reviews")
public ApiResponse<ReviewResDTO.GetMyReviews> getMyReviews(
@RequestParam(defaultValue = "ID") ReviewSortType sortBy,
@RequestParam(required = false) Long cursorId,
@RequestParam(defaultValue = "10") int size
) {
return ApiResponse.onSuccess(ReviewSuccessCode.MY_REVIEW_OK,
reviewService.getMyReviews(sortBy, cursorId, size));
}

@GetMapping("shops/{shopId}/reviews")
public ApiResponse<ReviewResDTO.GetReviews> getReviews(
@PathVariable Long shopId,
Expand All @@ -29,7 +41,7 @@ public ApiResponse<ReviewResDTO.GetReviews> getReviews(
@PostMapping("shops/{shopId}/reviews")
public ApiResponse<ReviewResDTO.PostReviewWrite> postReviewWrite(
@PathVariable Long shopId,
@RequestBody ReviewReqDTO.PostReviewWrite dto
@Valid @RequestBody ReviewReqDTO.PostReviewWrite dto
){
BaseSuccessCode code = ReviewSuccessCode.OK;
return ApiResponse.onSuccess(code, reviewService.postReviewWrite(dto, shopId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

public class ReviewConverter {

Expand Down Expand Up @@ -40,17 +39,17 @@ public static ReviewResDTO.PostReviewWrite toPostReviewWrite(Review review) {

public static ReviewResDTO.ReviewItem toReviewItem(Review review) {
List<String> imageUrls = review.getReviewImages().stream()
.map(image -> image.getReviewImageUrl())
.collect(Collectors.toList());

return new ReviewResDTO.ReviewItem(
review.getId(),
review.getUser().getName(),
review.getReviewContent(),
review.getReviewScore(),
review.getReviewContentTime(),
imageUrls
);
.map(ReviewImage::getReviewImageUrl)
.toList();

return ReviewResDTO.ReviewItem.builder()
.reviewId(review.getId())
.userName(review.getUser().getName())
.reviewContent(review.getReviewContent())
.reviewScore(review.getReviewScore())
.reviewContentTime(review.getReviewContentTime())
.reviewImageUrls(imageUrls)
.build();
}

public static ReviewResDTO.GetReviews toGetReviews(List<ReviewResDTO.ReviewItem> reviewList, boolean hasNext) {
Expand All @@ -59,4 +58,11 @@ public static ReviewResDTO.GetReviews toGetReviews(List<ReviewResDTO.ReviewItem>
.hasNext(hasNext)
.build();
}

public static ReviewResDTO.GetMyReviews toGetMyReviews(List<ReviewResDTO.ReviewItem> reviewList, boolean hasNext) {
return ReviewResDTO.GetMyReviews.builder()
.reviewList(reviewList)
.hasNext(hasNext)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package com.umcstudy.jace.domain.review.dto;

import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

import java.util.List;

public class ReviewReqDTO {

public record PostReviewWrite(
String reviewContents,
@NotBlank(message = "리뷰 내용은 필수입니다") @Size(max = 500, message = "리뷰 내용은 500자 이하여야 합니다") String reviewContents,
List<String> reviewImageUrl,
float reviewScore
@DecimalMin(value = "0.5", message = "평점은 0.5 이상이어야 합니다") @DecimalMax(value = "5.0", message = "평점은 5.0 이하여야 합니다") float reviewScore
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public record PostReviewWrite(
Integer reviewId
) {}

@Builder
public record ReviewItem(
Long reviewId,
String userName,
Expand All @@ -27,4 +28,10 @@ public record GetReviews(
List<ReviewItem> reviewList,
Boolean hasNext
) {}

@Builder
public record GetMyReviews(
List<ReviewItem> reviewList,
Boolean hasNext
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.umcstudy.jace.domain.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.BatchSize;

import java.math.BigDecimal;
import java.time.LocalDateTime;
Expand Down Expand Up @@ -45,6 +46,7 @@ public class Review {
@Column(name = "is_disabled", nullable = false)
private Boolean isDisabled;

@BatchSize(size = 10)
@Builder.Default
@OneToMany(mappedBy = "review", cascade = CascadeType.ALL)
private List<ReviewImage> reviewImages = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.umcstudy.jace.domain.review.enums;

public enum ReviewSortType {
ID, SCORE
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
@RequiredArgsConstructor
public enum ReviewSuccessCode implements BaseSuccessCode {
OK(HttpStatus.OK, "REVIEW200_1", "리뷰 작성에 성공했습니다."),
GET_OK(HttpStatus.OK, "REVIEW200_2", "리뷰 목록 조회에 성공했습니다."),;
GET_OK(HttpStatus.OK, "REVIEW200_2", "리뷰 목록 조회에 성공했습니다."),
MY_REVIEW_OK(HttpStatus.OK, "REVIEW200_3", "내 리뷰 목록 조회에 성공했습니다.");

private final HttpStatus status;
private final String code;
Expand Down
Loading