| @@ -14,6 +14,8 @@ import org.springframework.cache.annotation.Cacheable | |||||||
| import org.springframework.data.domain.Pageable | import org.springframework.data.domain.Pageable | ||||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||||
| import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||||
|  | import java.time.ZoneId | ||||||
|  | import java.time.format.DateTimeFormatter | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| class AudioContentMainService( | class AudioContentMainService( | ||||||
| @@ -107,6 +109,17 @@ class AudioContentMainService( | |||||||
|                     type = it.type, |                     type = it.type, | ||||||
|                     thumbnailImageUrl = "$imageHost/${it.thumbnailImage}", |                     thumbnailImageUrl = "$imageHost/${it.thumbnailImage}", | ||||||
|                     eventItem = if (it.type == AudioContentBannerType.EVENT && it.event != null) { |                     eventItem = if (it.type == AudioContentBannerType.EVENT && it.event != null) { | ||||||
|  |                         val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") | ||||||
|  |                         val startDate = it.event!!.startDate | ||||||
|  |                             .atZone(ZoneId.of("UTC")) | ||||||
|  |                             .withZoneSameInstant(ZoneId.of("Asia/Seoul")) | ||||||
|  |                             .format(dateTimeFormatter) | ||||||
|  |  | ||||||
|  |                         val endDate = it.event!!.endDate | ||||||
|  |                             .atZone(ZoneId.of("UTC")) | ||||||
|  |                             .withZoneSameInstant(ZoneId.of("Asia/Seoul")) | ||||||
|  |                             .format(dateTimeFormatter) | ||||||
|  |  | ||||||
|                         EventItem( |                         EventItem( | ||||||
|                             id = it.event!!.id!!, |                             id = it.event!!.id!!, | ||||||
|                             thumbnailImageUrl = if (!it.event!!.thumbnailImage.startsWith("https://")) { |                             thumbnailImageUrl = if (!it.event!!.thumbnailImage.startsWith("https://")) { | ||||||
| @@ -123,6 +136,8 @@ class AudioContentMainService( | |||||||
|                                 it.event!!.detailImage |                                 it.event!!.detailImage | ||||||
|                             }, |                             }, | ||||||
|                             popupImageUrl = null, |                             popupImageUrl = null, | ||||||
|  |                             startDate = startDate, | ||||||
|  |                             endDate = endDate, | ||||||
|                             link = it.event!!.link, |                             link = it.event!!.link, | ||||||
|                             title = it.event!!.title, |                             title = it.event!!.title, | ||||||
|                             isPopup = false |                             isPopup = false | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package kr.co.vividnext.sodalive.event | package kr.co.vividnext.sodalive.event | ||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.common.BaseEntity | import kr.co.vividnext.sodalive.common.BaseEntity | ||||||
|  | import java.time.LocalDateTime | ||||||
| import javax.persistence.Column | import javax.persistence.Column | ||||||
| import javax.persistence.Entity | import javax.persistence.Entity | ||||||
|  |  | ||||||
| @@ -20,6 +21,8 @@ data class Event( | |||||||
|     var isAdult: Boolean? = null, |     var isAdult: Boolean? = null, | ||||||
|     @Column(nullable = false) |     @Column(nullable = false) | ||||||
|     var isPopup: Boolean = false, |     var isPopup: Boolean = false, | ||||||
|  |     var startDate: LocalDateTime, | ||||||
|  |     var endDate: LocalDateTime, | ||||||
|     @Column(nullable = false) |     @Column(nullable = false) | ||||||
|     var isActive: Boolean = true |     var isActive: Boolean = true | ||||||
| ) : BaseEntity() | ) : BaseEntity() | ||||||
|   | |||||||
| @@ -47,9 +47,11 @@ class EventController(private val service: EventService) { | |||||||
|         @RequestParam(value = "link", required = false) link: String? = null, |         @RequestParam(value = "link", required = false) link: String? = null, | ||||||
|         @RequestParam(value = "title", required = false) title: String? = null, |         @RequestParam(value = "title", required = false) title: String? = null, | ||||||
|         @RequestParam(value = "isAdult", required = false) isAdult: Boolean? = null, |         @RequestParam(value = "isAdult", required = false) isAdult: Boolean? = null, | ||||||
|         @RequestParam(value = "isPopup") isPopup: Boolean |         @RequestParam(value = "isPopup") isPopup: Boolean, | ||||||
|  |         @RequestParam(value = "startDate") startDate: String, | ||||||
|  |         @RequestParam(value = "endDate") endDate: String | ||||||
|     ) = ApiResponse.ok( |     ) = ApiResponse.ok( | ||||||
|         service.save(thumbnail, detail, popup, link, title, isAdult, isPopup), |         service.save(thumbnail, detail, popup, link, title, isAdult, isPopup, startDate, endDate), | ||||||
|         "등록되었습니다." |         "등록되었습니다." | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
| @@ -63,9 +65,11 @@ class EventController(private val service: EventService) { | |||||||
|         @RequestParam(value = "link", required = false) link: String? = null, |         @RequestParam(value = "link", required = false) link: String? = null, | ||||||
|         @RequestParam(value = "title", required = false) title: String? = null, |         @RequestParam(value = "title", required = false) title: String? = null, | ||||||
|         @RequestParam(value = "isAdult", required = false) isAdult: Boolean? = null, |         @RequestParam(value = "isAdult", required = false) isAdult: Boolean? = null, | ||||||
|         @RequestParam(value = "isPopup", required = false) isPopup: Boolean? = null |         @RequestParam(value = "isPopup", required = false) isPopup: Boolean? = null, | ||||||
|  |         @RequestParam(value = "startDate", required = false) startDate: String? = null, | ||||||
|  |         @RequestParam(value = "endDate", required = false) endDate: String? = null | ||||||
|     ) = ApiResponse.ok( |     ) = ApiResponse.ok( | ||||||
|         service.update(id, thumbnail, detail, popup, link, title, isAdult, isPopup), |         service.update(id, thumbnail, detail, popup, link, title, isAdult, isPopup, startDate, endDate), | ||||||
|         "수정되었습니다." |         "수정되었습니다." | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,13 @@ | |||||||
| package kr.co.vividnext.sodalive.event | package kr.co.vividnext.sodalive.event | ||||||
|  |  | ||||||
|  | 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 com.querydsl.jpa.impl.JPAQueryFactory | ||||||
| import kr.co.vividnext.sodalive.event.QEvent.event | import kr.co.vividnext.sodalive.event.QEvent.event | ||||||
| import org.springframework.data.jpa.repository.JpaRepository | import org.springframework.data.jpa.repository.JpaRepository | ||||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||||
|  | import java.time.LocalDateTime | ||||||
|  |  | ||||||
| @Repository | @Repository | ||||||
| interface EventRepository : JpaRepository<Event, Long>, EventQueryRepository | interface EventRepository : JpaRepository<Event, Long>, EventQueryRepository | ||||||
| @@ -16,7 +20,10 @@ interface EventQueryRepository { | |||||||
| @Repository | @Repository | ||||||
| class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : EventQueryRepository { | class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : EventQueryRepository { | ||||||
|     override fun getEventList(isAdult: Boolean?): List<EventItem> { |     override fun getEventList(isAdult: Boolean?): List<EventItem> { | ||||||
|  |         val now = LocalDateTime.now() | ||||||
|         var where = event.isActive.isTrue |         var where = event.isActive.isTrue | ||||||
|  |             .and(event.startDate.loe(now)) | ||||||
|  |             .and(event.endDate.goe(now)) | ||||||
|  |  | ||||||
|         if (isAdult != null) { |         if (isAdult != null) { | ||||||
|             where = if (isAdult) { |             where = if (isAdult) { | ||||||
| @@ -40,6 +47,8 @@ class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Even | |||||||
|                     event.thumbnailImage, |                     event.thumbnailImage, | ||||||
|                     event.detailImage, |                     event.detailImage, | ||||||
|                     event.popupImage, |                     event.popupImage, | ||||||
|  |                     getFormattedDate(event.startDate), | ||||||
|  |                     getFormattedDate(event.endDate), | ||||||
|                     event.link, |                     event.link, | ||||||
|                     event.isAdult, |                     event.isAdult, | ||||||
|                     event.isPopup |                     event.isPopup | ||||||
| @@ -52,9 +61,12 @@ class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Even | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun getMainEventPopup(isAdult: Boolean): EventItem? { |     override fun getMainEventPopup(isAdult: Boolean): EventItem? { | ||||||
|  |         val now = LocalDateTime.now() | ||||||
|         var where = event.isActive.isTrue |         var where = event.isActive.isTrue | ||||||
|             .and(event.isPopup.isTrue) |             .and(event.isPopup.isTrue) | ||||||
|             .and(event.popupImage.isNotNull) |             .and(event.popupImage.isNotNull) | ||||||
|  |             .and(event.startDate.loe(now)) | ||||||
|  |             .and(event.endDate.goe(now)) | ||||||
|  |  | ||||||
|         where = if (isAdult) { |         where = if (isAdult) { | ||||||
|             where.and( |             where.and( | ||||||
| @@ -76,6 +88,8 @@ class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Even | |||||||
|                     event.thumbnailImage, |                     event.thumbnailImage, | ||||||
|                     event.detailImage, |                     event.detailImage, | ||||||
|                     event.popupImage, |                     event.popupImage, | ||||||
|  |                     getFormattedDate(event.startDate), | ||||||
|  |                     getFormattedDate(event.endDate), | ||||||
|                     event.link, |                     event.link, | ||||||
|                     event.isAdult, |                     event.isAdult, | ||||||
|                     event.isPopup |                     event.isPopup | ||||||
| @@ -86,4 +100,18 @@ class EventQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Even | |||||||
|             .orderBy(event.id.desc()) |             .orderBy(event.id.desc()) | ||||||
|             .fetchFirst() |             .fetchFirst() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private fun getFormattedDate(dateTimePath: DateTimePath<LocalDateTime>): 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" | ||||||
|  |         ) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -9,6 +9,9 @@ import org.springframework.data.repository.findByIdOrNull | |||||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||||
| import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||||
| import org.springframework.web.multipart.MultipartFile | import org.springframework.web.multipart.MultipartFile | ||||||
|  | import java.time.LocalDate | ||||||
|  | import java.time.ZoneId | ||||||
|  | import java.time.format.DateTimeFormatter | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| class EventService( | class EventService( | ||||||
| @@ -73,10 +76,23 @@ class EventService( | |||||||
|         link: String? = null, |         link: String? = null, | ||||||
|         title: String? = null, |         title: String? = null, | ||||||
|         isAdult: Boolean? = null, |         isAdult: Boolean? = null, | ||||||
|         isPopup: Boolean |         isPopup: Boolean, | ||||||
|  |         startDateString: String, | ||||||
|  |         endDateString: String | ||||||
|     ): Long { |     ): Long { | ||||||
|         if (detail == null && link.isNullOrBlank()) throw SodaException("상세이미지 혹은 링크를 등록하세요") |         if (detail == null && link.isNullOrBlank()) throw SodaException("상세이미지 혹은 링크를 등록하세요") | ||||||
|  |  | ||||||
|  |         val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") | ||||||
|  |         val startDate = LocalDate.parse(startDateString, dateTimeFormatter).atTime(0, 0) | ||||||
|  |             .atZone(ZoneId.of("Asia/Seoul")) | ||||||
|  |             .withZoneSameInstant(ZoneId.of("UTC")) | ||||||
|  |             .toLocalDateTime() | ||||||
|  |  | ||||||
|  |         val endDate = LocalDate.parse(endDateString, dateTimeFormatter).atTime(23, 59, 59) | ||||||
|  |             .atZone(ZoneId.of("Asia/Seoul")) | ||||||
|  |             .withZoneSameInstant(ZoneId.of("UTC")) | ||||||
|  |             .toLocalDateTime() | ||||||
|  |  | ||||||
|         val event = repository.save( |         val event = repository.save( | ||||||
|             Event( |             Event( | ||||||
|                 thumbnailImage = "", |                 thumbnailImage = "", | ||||||
| @@ -85,7 +101,9 @@ class EventService( | |||||||
|                 link = link, |                 link = link, | ||||||
|                 title = title, |                 title = title, | ||||||
|                 isAdult = isAdult, |                 isAdult = isAdult, | ||||||
|                 isPopup = isPopup |                 isPopup = isPopup, | ||||||
|  |                 startDate = startDate, | ||||||
|  |                 endDate = endDate | ||||||
|             ) |             ) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
| @@ -142,7 +160,9 @@ class EventService( | |||||||
|         link: String? = null, |         link: String? = null, | ||||||
|         title: String? = null, |         title: String? = null, | ||||||
|         isAdult: Boolean? = null, |         isAdult: Boolean? = null, | ||||||
|         isPopup: Boolean? = null |         isPopup: Boolean? = null, | ||||||
|  |         startDateString: String? = null, | ||||||
|  |         endDateString: String? = null | ||||||
|     ) { |     ) { | ||||||
|         if (id <= 0) throw SodaException("잘못된 요청입니다.") |         if (id <= 0) throw SodaException("잘못된 요청입니다.") | ||||||
|  |  | ||||||
| @@ -197,6 +217,21 @@ class EventService( | |||||||
|         if (isAdult != event.isAdult) { |         if (isAdult != event.isAdult) { | ||||||
|             event.isAdult = isAdult |             event.isAdult = isAdult | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") | ||||||
|  |         if (startDateString != null) { | ||||||
|  |             event.startDate = LocalDate.parse(startDateString, dateTimeFormatter).atTime(0, 0) | ||||||
|  |                 .atZone(ZoneId.of("Asia/Seoul")) | ||||||
|  |                 .withZoneSameInstant(ZoneId.of("UTC")) | ||||||
|  |                 .toLocalDateTime() | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (endDateString != null) { | ||||||
|  |             event.endDate = LocalDate.parse(endDateString, dateTimeFormatter).atTime(23, 59, 59) | ||||||
|  |                 .atZone(ZoneId.of("Asia/Seoul")) | ||||||
|  |                 .withZoneSameInstant(ZoneId.of("UTC")) | ||||||
|  |                 .toLocalDateTime() | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Transactional |     @Transactional | ||||||
|   | |||||||
| @@ -16,6 +16,8 @@ data class EventItem @QueryProjection constructor( | |||||||
|     @JsonProperty("thumbnailImageUrl") var thumbnailImageUrl: String, |     @JsonProperty("thumbnailImageUrl") var thumbnailImageUrl: String, | ||||||
|     @JsonProperty("detailImageUrl") var detailImageUrl: String? = null, |     @JsonProperty("detailImageUrl") var detailImageUrl: String? = null, | ||||||
|     @JsonProperty("popupImageUrl") var popupImageUrl: String? = null, |     @JsonProperty("popupImageUrl") var popupImageUrl: String? = null, | ||||||
|  |     @JsonProperty("startDate") var startDate: String, | ||||||
|  |     @JsonProperty("endDate") var endDate: String, | ||||||
|     @JsonProperty("link") val link: String? = null, |     @JsonProperty("link") val link: String? = null, | ||||||
|     @JsonProperty("isAdult") val isAdult: Boolean? = null, |     @JsonProperty("isAdult") val isAdult: Boolean? = null, | ||||||
|     @JsonProperty("isPopup") val isPopup: Boolean |     @JsonProperty("isPopup") val isPopup: Boolean | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user