diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt index dd0eff5..cfd7b79 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController @RestController @@ -36,4 +37,22 @@ class CanCouponController(private val service: CanCouponService) { ApiResponse.ok(service.getCouponList(offset = pageable.offset, limit = pageable.pageSize.toLong())) } + + @GetMapping("/number-list") + @PreAuthorize("hasRole('ADMIN')") + fun getCouponNumberList( + @RequestParam couponId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getCouponNumberList( + couponId = couponId, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponRepository.kt index bf7d7b7..49a8b1e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponRepository.kt @@ -2,12 +2,14 @@ package kr.co.vividnext.sodalive.can.coupon import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.coupon.QCanCoupon.canCoupon +import kr.co.vividnext.sodalive.can.coupon.QCanCouponNumber.canCouponNumber import org.springframework.data.jpa.repository.JpaRepository interface CanCouponRepository : JpaRepository<CanCoupon, Long>, CanCouponQueryRepository interface CanCouponQueryRepository { fun getCouponList(offset: Long, limit: Long): List<CanCoupon> + fun getCouponNumberList(couponId: Long, offset: Long, limit: Long): List<GetCouponNumberListResponse> } class CanCouponQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : CanCouponQueryRepository { @@ -19,4 +21,18 @@ class CanCouponQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : .limit(limit) .fetch() } + + override fun getCouponNumberList(couponId: Long, offset: Long, limit: Long): List<GetCouponNumberListResponse> { + return queryFactory + .select( + QGetCouponNumberListResponse( + canCouponNumber.id, + canCouponNumber.couponNumber, + canCouponNumber.member.isNotNull + ) + ) + .from(canCouponNumber) + .where(canCouponNumber.canCoupon.id.eq(couponId)) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt index 7c38476..679b5a7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt @@ -38,4 +38,8 @@ class CanCouponService( } .toList() } + + fun getCouponNumberList(couponId: Long, offset: Long, limit: Long): List<GetCouponNumberListResponse> { + return repository.getCouponNumberList(couponId = couponId, offset = offset, limit = limit) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponNumberListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponNumberListResponse.kt new file mode 100644 index 0000000..a67d697 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponNumberListResponse.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.can.coupon + +import com.querydsl.core.annotations.QueryProjection + +data class GetCouponNumberListResponse @QueryProjection constructor( + val couponNumberId: Long, + val couponNumber: String, + val isUsed: Boolean +)