Skip to content
Open
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")
List<Mission> findByRegionWithCursor(
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