diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventRepository.kt index d8dfa4e..a78f36c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventRepository.kt @@ -1,22 +1,51 @@ package kr.co.vividnext.sodalive.admin.event.charge +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.admin.event.charge.QChargeEvent.chargeEvent import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository +import java.time.LocalDateTime @Repository interface AdminChargeEventRepository : JpaRepository, AdminChargeEventQueryRepository interface AdminChargeEventQueryRepository { - fun getChargeEventList(): List + fun getChargeEventList(): List } class AdminChargeEventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : AdminChargeEventQueryRepository { - override fun getChargeEventList(): List { + override fun getChargeEventList(): List { return queryFactory - .selectFrom(chargeEvent) + .select( + QGetChargeEventListResponse( + chargeEvent.id, + chargeEvent.title, + getFormattedDate(chargeEvent.startDate), + getFormattedDate(chargeEvent.endDate), + chargeEvent.availableCount, + chargeEvent.addPercent.multiply(100).castToNum(Int::class.java), + chargeEvent.isActive + ) + ) + .from(chargeEvent) .orderBy(chargeEvent.createdAt.desc()) .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 %H:%i" + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt index 27aad89..c36d54e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt @@ -4,7 +4,7 @@ import kr.co.vividnext.sodalive.common.SodaException import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.time.LocalDate +import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter @@ -13,13 +13,13 @@ import java.time.format.DateTimeFormatter class AdminChargeEventService(private val repository: AdminChargeEventRepository) { @Transactional fun createChargeEvent(request: CreateChargeEventRequest): Long { - val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val startDate = LocalDate.parse(request.startDateString, dateTimeFormatter).atTime(0, 0) + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") + val startDate = LocalDateTime.parse(request.startDateString, dateTimeFormatter) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - val endDate = LocalDate.parse(request.endDateString, dateTimeFormatter).atTime(23, 59, 59) + val endDate = LocalDateTime.parse(request.endDateString, dateTimeFormatter).withSecond(59) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() @@ -44,16 +44,16 @@ class AdminChargeEventService(private val repository: AdminChargeEventRepository chargeEvent.title = request.title } - val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") if (request.startDateString != null) { - chargeEvent.startDate = LocalDate.parse(request.startDateString, dateTimeFormatter).atTime(0, 0) + chargeEvent.startDate = LocalDateTime.parse(request.startDateString, dateTimeFormatter) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() } if (request.endDateString != null) { - chargeEvent.endDate = LocalDate.parse(request.endDateString, dateTimeFormatter).atTime(23, 59, 59) + chargeEvent.endDate = LocalDateTime.parse(request.endDateString, dateTimeFormatter).withSecond(59) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() @@ -74,27 +74,5 @@ class AdminChargeEventService(private val repository: AdminChargeEventRepository fun getChargeEventList(): List { return repository.getChargeEventList() - .map { - val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val startDate = it.startDate - .atZone(ZoneId.of("UTC")) - .withZoneSameInstant(ZoneId.of("Asia/Seoul")) - .format(dateTimeFormatter) - - val endDate = it.endDate - .atZone(ZoneId.of("UTC")) - .withZoneSameInstant(ZoneId.of("Asia/Seoul")) - .format(dateTimeFormatter) - - GetChargeEventListResponse( - id = it.id!!, - title = it.title, - startDate = startDate, - endDate = endDate, - availableCount = it.availableCount, - addPercent = (it.addPercent * 100).toInt(), - isActive = it.isActive - ) - } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/GetChargeEventListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/GetChargeEventListResponse.kt index ee6ae16..a751445 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/GetChargeEventListResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/GetChargeEventListResponse.kt @@ -1,6 +1,8 @@ package kr.co.vividnext.sodalive.admin.event.charge -data class GetChargeEventListResponse( +import com.querydsl.core.annotations.QueryProjection + +data class GetChargeEventListResponse @QueryProjection constructor( val id: Long, val title: String, val startDate: String,