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 012ab52..0882f50 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 @@ -1,14 +1,18 @@ package kr.co.vividnext.sodalive.can.coupon +import com.querydsl.core.types.dsl.DateTimePath +import com.querydsl.core.types.dsl.Expressions +import com.querydsl.core.types.dsl.StringTemplate import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.coupon.QCanCoupon.canCoupon import org.springframework.data.jpa.repository.JpaRepository +import java.time.LocalDateTime interface CanCouponRepository : JpaRepository, CanCouponQueryRepository interface CanCouponQueryRepository { fun getCouponTotalCount(): Int - fun getCouponList(offset: Long, limit: Long): List + fun getCouponList(offset: Long, limit: Long): List } class CanCouponQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : CanCouponQueryRepository { @@ -20,12 +24,38 @@ class CanCouponQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : .size } - override fun getCouponList(offset: Long, limit: Long): List { + override fun getCouponList(offset: Long, limit: Long): List { return queryFactory - .selectFrom(canCoupon) + .select( + QGetCouponListItemResponse( + canCoupon.id, + canCoupon.couponName, + canCoupon.can, + canCoupon.couponCount, + Expressions.ZERO, + getFormattedDate(canCoupon.validity), + canCoupon.isMultipleUse, + canCoupon.isActive + ) + ) + .from(canCoupon) .orderBy(canCoupon.id.desc()) .offset(offset) .limit(limit) .fetch() } + + private fun getFormattedDate(dateTimePath: DateTimePath): StringTemplate { + return Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})", + Expressions.dateTimeTemplate( + LocalDateTime::class.java, + "CONVERT_TZ({0},{1},{2})", + dateTimePath, + "UTC", + "Asia/Seoul" + ), + "%Y-%m-%d" + ) + } } 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 8fa9f8e..d8fbde0 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 @@ -72,17 +72,9 @@ class CanCouponService( val items = repository.getCouponList(offset = offset, limit = limit) .asSequence() .map { - val useCouponCount = couponNumberRepository.getUseCouponCount(id = it.id!!) - GetCouponListItemResponse( - id = it.id!!, - couponName = it.couponName, - can = it.can, - couponCount = it.couponCount, - useCouponCount = useCouponCount, - validity = it.validity.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), - isMultipleUse = it.isMultipleUse, - isActive = it.isActive - ) + val useCouponCount = couponNumberRepository.getUseCouponCount(id = it.id) + it.useCouponCount = useCouponCount + it } .toList() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponListResponse.kt index f26bab4..ff416a7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponListResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/GetCouponListResponse.kt @@ -1,16 +1,18 @@ package kr.co.vividnext.sodalive.can.coupon +import com.querydsl.core.annotations.QueryProjection + data class GetCouponListResponse( val totalCount: Int, val items: List ) -data class GetCouponListItemResponse( +data class GetCouponListItemResponse @QueryProjection constructor( val id: Long, val couponName: String, val can: Int, val couponCount: Int, - val useCouponCount: Int, + var useCouponCount: Int, val validity: String, val isMultipleUse: Boolean, val isActive: Boolean