From a17a6a41dad51438502da478ddabbf1193237e97 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 5 Mar 2025 00:39:49 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EB=A7=A4?= =?UTF-8?q?=EC=B2=B4=20=ED=8C=8C=ED=8A=B8=EB=84=88=20=EC=BD=94=EB=93=9C(pi?= =?UTF-8?q?d)=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminAdMediaPartnerController.kt | 10 +++++ .../marketing/AdminAdMediaPartnerService.kt | 35 +++++++++++++++ .../GetAdminAdMediaPartnerResponse.kt | 17 +++++++ .../marketing/AdMediaPartnerRepository.kt | 44 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/GetAdminAdMediaPartnerResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerController.kt index 64a7454..e83d063 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerController.kt @@ -1,7 +1,9 @@ package kr.co.vividnext.sodalive.admin.marketing import kr.co.vividnext.sodalive.common.ApiResponse +import org.springframework.data.domain.Pageable import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody @@ -21,4 +23,12 @@ class AdminAdMediaPartnerController(private val service: AdminAdMediaPartnerServ fun updateMediaPartner( @RequestBody request: UpdateAdMediaPartnerRequest ) = ApiResponse.ok(service.updateMediaPartner(request)) + + @GetMapping + fun getMediaPartnerList(pageable: Pageable) = ApiResponse.ok( + service.getMediaPartnerList( + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt index eb6f5fc..ba02fe0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt @@ -2,9 +2,11 @@ package kr.co.vividnext.sodalive.admin.marketing import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.marketing.AdMediaPartnerRepository +import kr.co.vividnext.sodalive.marketing.AdMediaPartnerType import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.net.URLEncoder @Service class AdminAdMediaPartnerService(private val repository: AdMediaPartnerRepository) { @@ -47,4 +49,37 @@ class AdminAdMediaPartnerService(private val repository: AdMediaPartnerRepositor entity.isActive = request.isActive } } + + fun getMediaPartnerList(offset: Long, limit: Long): List { + return repository.getMediaPartnerList(offset, limit) + .map { + val deepLinkValue = when (it.type) { + AdMediaPartnerType.SERIES -> "series" + AdMediaPartnerType.CONTENT -> "content" + AdMediaPartnerType.LIVE -> "live" + AdMediaPartnerType.CHANNEL -> "channel" + AdMediaPartnerType.MAIN -> "main" + } + + val link = URLEncoder.encode( + "$oneLinkHost?af_dp=voiceon%3A%2F%2F" + + "&deep_link_value=$deepLinkValue" + + "&deep_link_sub1=${it.pid}" + + "&deep_link_sub2=${it.utmSource}" + + "&deep_link_sub3=${it.utmMedium}" + + "&deep_link_sub4=${it.pidName}" + + "&utm_source=${it.utmSource}" + + "&utm_medium=${it.utmMedium}" + + "&utm_campaign=${it.pidName}", + "UTF-8" + ) + + it.link = link + it + } + } + + companion object { + private val oneLinkHost = "https://voiceon.onelink.me/RkTm" + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/GetAdminAdMediaPartnerResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/GetAdminAdMediaPartnerResponse.kt new file mode 100644 index 0000000..14e0b6d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/GetAdminAdMediaPartnerResponse.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.admin.marketing + +import com.querydsl.core.annotations.QueryProjection +import kr.co.vividnext.sodalive.marketing.AdMediaPartnerType + +data class GetAdminAdMediaPartnerResponse @QueryProjection constructor( + val id: Long, + val mediaGroup: String, + val pid: String, + val pidName: String, + val type: AdMediaPartnerType, + val utmSource: String, + val utmMedium: String, + val isActive: Boolean, + val createdAt: String, + var link: String +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/marketing/AdMediaPartnerRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/marketing/AdMediaPartnerRepository.kt index 955b70e..1970387 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/marketing/AdMediaPartnerRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/marketing/AdMediaPartnerRepository.kt @@ -1,14 +1,21 @@ package kr.co.vividnext.sodalive.marketing +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.marketing.GetAdminAdMediaPartnerResponse +import kr.co.vividnext.sodalive.admin.marketing.QGetAdminAdMediaPartnerResponse import kr.co.vividnext.sodalive.marketing.QAdMediaPartner.adMediaPartner import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository +import java.time.LocalDateTime interface AdMediaPartnerRepository : JpaRepository, AdMediaPartnerQueryRepository interface AdMediaPartnerQueryRepository { fun findByPid(pid: String): AdMediaPartner? + fun getMediaPartnerList(offset: Long, limit: Long): List } @Repository @@ -19,4 +26,41 @@ class AdMediaPartnerQueryRepositoryImpl(private val queryFactory: JPAQueryFactor .where(adMediaPartner.pid.eq(pid), adMediaPartner.isActive.isTrue) .fetchFirst() } + + override fun getMediaPartnerList(offset: Long, limit: Long): List { + return queryFactory + .select( + QGetAdminAdMediaPartnerResponse( + adMediaPartner.id, + adMediaPartner.mediaGroup, + adMediaPartner.pid, + adMediaPartner.pidName, + adMediaPartner.type, + adMediaPartner.utmSource, + adMediaPartner.utmMedium, + adMediaPartner.isActive, + getFormattedDate(adMediaPartner.createdAt), + Expressions.constant("") + ) + ) + .from(adMediaPartner) + .orderBy(adMediaPartner.isActive.desc(), adMediaPartner.id.asc()) + .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 %H:%i:%s" + ) + } }