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

[Refactor/#93] 쿠폰 관련 리팩토링 진행 #99

Merged
merged 14 commits into from
Jan 17, 2025
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
[Refactor] 받은 쿠폰 조회 페이징 처리
82everywin committed Jan 16, 2025
commit 9828eeba293b23b0a9587711d7542eb8e440c746
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.appcenter.marketplace.domain.member_coupon.controller;

import com.appcenter.marketplace.domain.coupon.dto.res.CouponPageRes;
import com.appcenter.marketplace.domain.member_coupon.dto.res.IssuedCouponRes;
import com.appcenter.marketplace.domain.member_coupon.dto.res.CouponHandleRes;
import com.appcenter.marketplace.domain.member_coupon.service.MemberCouponService;
@@ -12,6 +13,7 @@

import java.util.List;

import static com.appcenter.marketplace.domain.member_coupon.MemberCouponType.*;
import static com.appcenter.marketplace.global.common.StatusCode.*;

@Tag(name = "[회원 쿠폰]", description = "[회원] 회원의 쿠폰 발급 및 사용처리, 리스트 확인")
@@ -32,31 +34,40 @@ public ResponseEntity<CommonResponse<Object>> issuedCoupon(@RequestParam(name="m
}

@Operation(summary = "사용 가능한 쿠폰 리스트", description = "쿠폰 리스트를 조회하면 기본적으로 조회되는 리스트입니다." +
"<br> '사용가능'한 쿠폰 리스트를 의미합니다." )
"<br> '사용가능'한 쿠폰 리스트를 의미합니다.<br>" +
"무한 스크롤 방식으로 hasNext가 true 면 마지막 데이터의 memberCouponId를 입력하여, 다음 페이지==다음 데이터를 받아올 수 있습니다." )
@GetMapping("/valid")
public ResponseEntity<CommonResponse<List<IssuedCouponRes>>> getCouponList(@RequestParam(name="memberId")Long memberId){
public ResponseEntity<CommonResponse<CouponPageRes<IssuedCouponRes>>> getCouponList(@RequestParam(name="memberId")Long memberId,
@RequestParam(name="memberCouponId", required = false) Long memberCouponId,
@RequestParam(name="size", defaultValue = "10")Integer size) {
return ResponseEntity.status(COUPON_FOUND.getStatus())
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getMemberCouponList(memberId)));
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getMemberCouponList(memberId, ISSUED, memberCouponId, size)));
}

@Operation(summary = "만료된 쿠폰 리스트", description = "기간이 만료된 쿠폰 리스트를 조회합니다." +
"<br> 조건은 다음과 같습니다." +
"1. 쿠폰의 deadLine(만료날짜) 이후여야 합니다." +
"2. 쿠폰은 발급받았지만, 사용처리가 되지 않아야 합니다.")
"1. 쿠폰의 deadLine(만료날짜) 이후여야 합니다. <br>" +
"2. 쿠폰은 발급받았지만, 사용처리가 되지 않아야 합니다. <br>" +
"무한 스크롤 방식으로 hasNext가 true 면 마지막 데이터의 memberCouponId를 입력하여, 다음 페이지==다음 데이터를 받아올 수 있습니다.")
@GetMapping("/expired")
public ResponseEntity<CommonResponse<List<IssuedCouponRes>>> getExpiredCouponList(@RequestParam(name="memberId")Long memberId){
public ResponseEntity<CommonResponse<CouponPageRes<IssuedCouponRes>>> getExpiredCouponList(@RequestParam(name="memberId")Long memberId,
@RequestParam(name="memberCouponId", required = false) Long memberCouponId,
@RequestParam(name="size", defaultValue = "10")Integer size){
return ResponseEntity.status(COUPON_FOUND.getStatus())
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getExpiredMemberCouponList(memberId)));
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getMemberCouponList(memberId, EXPIRED, memberCouponId, size)));
}

@Operation(summary = "사용완료된 쿠폰 리스트", description = "사용이 완료된 쿠폰 리스트를 조회합니다." +
"<br> 조건은 다음과 같습니다." +
"1. 쿠폰을 발급받고, 사용처리가 완료되어야 합니다." +
"2. 쿠폰의 deadLine(만료날짜)와는 상관이 없습니다.")
"1. 쿠폰을 발급받고, 사용처리가 완료되어야 합니다.<br>" +
"2. 쿠폰의 deadLine(만료날짜)와는 상관이 없습니다.<br>" +
"무한 스크롤 방식으로 hasNext가 true 면 마지막 데이터의 memberCouponId를 입력하여, 다음 페이지==다음 데이터를 받아올 수 있습니다.")
@GetMapping("/used")
public ResponseEntity<CommonResponse<List<IssuedCouponRes>>> getUsedCouponList(@RequestParam(name="memberId")Long memberId){
public ResponseEntity<CommonResponse<CouponPageRes<IssuedCouponRes>>> getUsedCouponList(@RequestParam(name="memberId")Long memberId,
@RequestParam(name="memberCouponId", required = false) Long memberCouponId,
@RequestParam(name="size", defaultValue = "10")Integer size){
return ResponseEntity.status(COUPON_FOUND.getStatus())
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getUsedMemberCouponList(memberId)));
.body(CommonResponse.from(COUPON_FOUND.getMessage(), memberCouponService.getMemberCouponList(memberId, USED, memberCouponId, size)));
}

@Operation(summary = "회원 쿠폰 사용처리", description = "회원은 발급받은 memberCouponId로 사용처리를 할 수 있습니다." )
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
public interface MemberCouponRepositoryCustom {
boolean existCouponByMemberId(Long memberId, Long couponId);

List<IssuedCouponRes> findIssuedCouponResDtoByMemberId(Long memberId);
List<IssuedCouponRes> findExpiredCouponResDtoByMemberId(Long memberId);
List<IssuedCouponRes> findUsedMemberCouponResDtoByMemberId(Long memberId);
List<IssuedCouponRes> findIssuedCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size);
List<IssuedCouponRes> findExpiredCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size);
List<IssuedCouponRes> findUsedMemberCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size);
}
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import com.appcenter.marketplace.domain.member_coupon.dto.res.IssuedCouponRes;
import com.appcenter.marketplace.domain.member_coupon.dto.res.QIssuedCouponRes;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;

@@ -27,19 +28,19 @@ public boolean existCouponByMemberId(Long memberId, Long couponId) {
}

@Override
public List<IssuedCouponRes> findIssuedCouponResDtoByMemberId(Long memberId) {
public List<IssuedCouponRes> findIssuedCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size) {
// 만료되기 전의 쿠폰만 조회가 가능합니다.
return findCouponsByMemberId(memberId, false);
return findCouponsByMemberId(memberId, false, memberCouponId, size);
}

@Override
public List<IssuedCouponRes> findExpiredCouponResDtoByMemberId(Long memberId) {
public List<IssuedCouponRes> findExpiredCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size) {
// 발급 받은 쿠폰 중, 기간이 만료된 쿠폰만 조회합니다.
return findCouponsByMemberId(memberId, true);
return findCouponsByMemberId(memberId, true,memberCouponId, size);
}

@Override
public List<IssuedCouponRes> findUsedMemberCouponResDtoByMemberId(Long memberId) {
public List<IssuedCouponRes> findUsedMemberCouponResDtoByMemberId(Long memberId, Long memberCouponId, Integer size ) {
return jpaQueryFactory.select(new QIssuedCouponRes(memberCoupon.id,
coupon.id,
coupon.name,
@@ -48,12 +49,15 @@ public List<IssuedCouponRes> findUsedMemberCouponResDtoByMemberId(Long memberId)
memberCoupon.isUsed))
.from(coupon)
.join(memberCoupon).on(memberCoupon.coupon.id.eq(coupon.id))
.where(memberCoupon.member.id.eq(memberId)
.where(ltMemberCouponId(memberCouponId)
.and(memberCoupon.member.id.eq(memberId))
.and(memberCoupon.isUsed.eq(true)))
.orderBy(memberCoupon.id.desc())
.limit(size+1)
.fetch();
}

private List<IssuedCouponRes> findCouponsByMemberId(Long memberId, boolean isExpired) {
private List<IssuedCouponRes> findCouponsByMemberId(Long memberId, boolean isExpired,Long memberCouponId, Integer size) {
return jpaQueryFactory.select(new QIssuedCouponRes(memberCoupon.id,
coupon.id,
coupon.name,
@@ -62,13 +66,24 @@ private List<IssuedCouponRes> findCouponsByMemberId(Long memberId, boolean isExp
memberCoupon.isUsed))
.from(coupon)
.join(memberCoupon).on(memberCoupon.coupon.id.eq(coupon.id))
.where(memberCoupon.member.id.eq(memberId)
.where(ltMemberCouponId(memberCouponId)
.and(memberCoupon.member.id.eq(memberId))
.and(memberCoupon.isUsed.eq(false))
.and(isExpired
? memberCoupon.coupon.deadLine.before(LocalDateTime.now())
: memberCoupon.coupon.deadLine.after(LocalDateTime.now())))
.orderBy(memberCoupon.id.desc())
.limit(size+1)
.fetch();

}

private BooleanBuilder ltMemberCouponId(Long memberCouponId){
BooleanBuilder builder = new BooleanBuilder();
if( memberCouponId != null){
builder.and(memberCoupon.id.lt(memberCouponId));
}
return builder;
}
}