From 7f70e508e46f023e93c81ba2defdf2e64a41663c Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 12:09:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EC=98=A4=ED=94=88=20/=20=EC=98=A4=ED=94=88=20=EC=98=88?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/content/AdminContentController.kt | 18 +++++++++++- .../admin/content/AdminContentRepository.kt | 29 +++++++++++++++++-- .../admin/content/AdminContentService.kt | 5 ++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt index 2b951e6..088d95b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt @@ -15,7 +15,15 @@ import org.springframework.web.bind.annotation.RestController @RequestMapping("/admin/audio-content") class AdminContentController(private val service: AdminContentService) { @GetMapping("/list") - fun getAudioContentList(pageable: Pageable) = ApiResponse.ok(service.getAudioContentList(pageable)) + fun getAudioContentList( + @RequestParam(value = "status", required = false) status: ContentReleaseStatus?, + pageable: Pageable + ) = ApiResponse.ok( + service.getAudioContentList( + status = status ?: ContentReleaseStatus.OPEN, + pageable + ) + ) @GetMapping("/search") fun searchAudioContent( @@ -28,3 +36,11 @@ class AdminContentController(private val service: AdminContentService) { @RequestBody request: UpdateAdminContentRequest ) = ApiResponse.ok(service.updateAudioContent(request)) } + +enum class ContentReleaseStatus { + // 콘텐츠가 공개된 상태 + OPEN, + + // 예약된 콘텐츠, 아직 공개되지 않은 상태 + SCHEDULED +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt index a62b247..f9819d9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt @@ -18,8 +18,13 @@ import java.time.LocalDateTime interface AdminContentRepository : JpaRepository, AdminAudioContentQueryRepository interface AdminAudioContentQueryRepository { - fun getAudioContentTotalCount(searchWord: String = ""): Int + fun getAudioContentTotalCount( + searchWord: String = "", + status: ContentReleaseStatus = ContentReleaseStatus.OPEN + ): Int + fun getAudioContentList( + status: ContentReleaseStatus = ContentReleaseStatus.OPEN, imageHost: String, offset: Long, limit: Long, @@ -32,7 +37,12 @@ interface AdminAudioContentQueryRepository { class AdminAudioContentQueryRepositoryImpl( private val queryFactory: JPAQueryFactory ) : AdminAudioContentQueryRepository { - override fun getAudioContentTotalCount(searchWord: String): Int { + override fun getAudioContentTotalCount( + searchWord: String, + status: ContentReleaseStatus + ): Int { + val now = LocalDateTime.now() + var where = audioContent.duration.isNotNull .and(audioContent.member.isNotNull) .and(audioContent.isActive.isTrue.or(audioContent.releaseDate.isNotNull)) @@ -44,6 +54,12 @@ class AdminAudioContentQueryRepositoryImpl( ) } + where = if (status == ContentReleaseStatus.SCHEDULED) { + where.and(audioContent.releaseDate.after(now)) + } else { + where.and(audioContent.releaseDate.before(now)) + } + return queryFactory .select(audioContent.id) .from(audioContent) @@ -53,11 +69,14 @@ class AdminAudioContentQueryRepositoryImpl( } override fun getAudioContentList( + status: ContentReleaseStatus, imageHost: String, offset: Long, limit: Long, searchWord: String ): List { + val now = LocalDateTime.now() + var where = audioContent.duration.isNotNull .and(audioContent.member.isNotNull) .and(audioContent.isActive.isTrue.or(audioContent.releaseDate.isNotNull)) @@ -69,6 +88,12 @@ class AdminAudioContentQueryRepositoryImpl( ) } + where = if (status == ContentReleaseStatus.SCHEDULED) { + where.and(audioContent.releaseDate.after(now)) + } else { + where.and(audioContent.releaseDate.before(now)) + } + return queryFactory .select( QGetAdminContentListItem( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt index 0edf5ab..d3ec4ac 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt @@ -20,16 +20,16 @@ class AdminContentService( @Value("\${cloud.aws.cloud-front.host}") private val coverImageHost: String ) { - fun getAudioContentList(pageable: Pageable): GetAdminContentListResponse { + fun getAudioContentList(status: ContentReleaseStatus, pageable: Pageable): GetAdminContentListResponse { val totalCount = repository.getAudioContentTotalCount() val audioContentAndThemeList = repository.getAudioContentList( + status = status, imageHost = coverImageHost, offset = pageable.offset, limit = pageable.pageSize.toLong() ) val audioContentList = audioContentAndThemeList - .asSequence() .map { val tags = repository .getHashTagList(audioContentId = it.audioContentId) @@ -44,7 +44,6 @@ class AdminContentService( ) it } - .toList() return GetAdminContentListResponse(totalCount, audioContentList) } -- 2.40.1 From 656fd9a1fa6515d3d85bf41c945a5a932f069d2d Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 12:12:21 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20-=20imageHost=20=EA=B0=92=20repos?= =?UTF-8?q?itory=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/content/AdminContentRepository.kt | 8 +++++--- .../sodalive/admin/content/AdminContentService.kt | 10 +--------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt index f9819d9..d01218d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.content.hashtag.QAudioContentHashTag.audioConten import kr.co.vividnext.sodalive.content.hashtag.QHashTag.hashTag import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCuration.audioContentCuration import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme +import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.time.LocalDateTime @@ -25,7 +26,6 @@ interface AdminAudioContentQueryRepository { fun getAudioContentList( status: ContentReleaseStatus = ContentReleaseStatus.OPEN, - imageHost: String, offset: Long, limit: Long, searchWord: String = "" @@ -35,7 +35,10 @@ interface AdminAudioContentQueryRepository { } class AdminAudioContentQueryRepositoryImpl( - private val queryFactory: JPAQueryFactory + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val imageHost: String ) : AdminAudioContentQueryRepository { override fun getAudioContentTotalCount( searchWord: String, @@ -70,7 +73,6 @@ class AdminAudioContentQueryRepositoryImpl( override fun getAudioContentList( status: ContentReleaseStatus, - imageHost: String, offset: Long, limit: Long, searchWord: String diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt index d3ec4ac..83ffd5b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt @@ -4,7 +4,6 @@ import kr.co.vividnext.sodalive.admin.content.curation.AdminContentCurationRepos import kr.co.vividnext.sodalive.admin.content.theme.AdminContentThemeRepository import kr.co.vividnext.sodalive.aws.cloudfront.AudioContentCloudFront import kr.co.vividnext.sodalive.common.SodaException -import org.springframework.beans.factory.annotation.Value import org.springframework.data.domain.Pageable import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -15,16 +14,12 @@ class AdminContentService( private val repository: AdminContentRepository, private val themeRepository: AdminContentThemeRepository, private val audioContentCloudFront: AudioContentCloudFront, - private val curationRepository: AdminContentCurationRepository, - - @Value("\${cloud.aws.cloud-front.host}") - private val coverImageHost: String + private val curationRepository: AdminContentCurationRepository ) { fun getAudioContentList(status: ContentReleaseStatus, pageable: Pageable): GetAdminContentListResponse { val totalCount = repository.getAudioContentTotalCount() val audioContentAndThemeList = repository.getAudioContentList( status = status, - imageHost = coverImageHost, offset = pageable.offset, limit = pageable.pageSize.toLong() ) @@ -52,14 +47,12 @@ class AdminContentService( if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") val totalCount = repository.getAudioContentTotalCount(searchWord) val audioContentAndThemeList = repository.getAudioContentList( - imageHost = coverImageHost, offset = pageable.offset, limit = pageable.pageSize.toLong(), searchWord = searchWord ) val audioContentList = audioContentAndThemeList - .asSequence() .map { val tags = repository .getHashTagList(audioContentId = it.audioContentId) @@ -74,7 +67,6 @@ class AdminContentService( ) it } - .toList() return GetAdminContentListResponse(totalCount, audioContentList) } -- 2.40.1 From 4eb4c193861ead0d1cf6d0cbfee5fe2a93e23f3e Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 12:23:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EC=A1=B0=ED=9A=8C=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EC=97=90=EB=8F=84=20status=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/admin/content/AdminContentService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt index 83ffd5b..7d79051 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt @@ -17,7 +17,7 @@ class AdminContentService( private val curationRepository: AdminContentCurationRepository ) { fun getAudioContentList(status: ContentReleaseStatus, pageable: Pageable): GetAdminContentListResponse { - val totalCount = repository.getAudioContentTotalCount() + val totalCount = repository.getAudioContentTotalCount(status = status) val audioContentAndThemeList = repository.getAudioContentList( status = status, offset = pageable.offset, -- 2.40.1 From 078e6011006e2cf4a53454f1cd8d6c13cd21a90c Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 12:25:26 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=EC=97=90=20content=20release=20status=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/content/AdminContentController.kt | 9 ++++++++- .../sodalive/admin/content/AdminContentService.kt | 9 +++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt index 088d95b..fa875fb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentController.kt @@ -27,9 +27,16 @@ class AdminContentController(private val service: AdminContentService) { @GetMapping("/search") fun searchAudioContent( + @RequestParam(value = "status", required = false) status: ContentReleaseStatus?, @RequestParam(value = "search_word") searchWord: String, pageable: Pageable - ) = ApiResponse.ok(service.searchAudioContent(searchWord, pageable)) + ) = ApiResponse.ok( + service.searchAudioContent( + status = status ?: ContentReleaseStatus.OPEN, + searchWord, + pageable + ) + ) @PutMapping fun modifyAudioContent( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt index 7d79051..ebf0445 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt @@ -43,10 +43,15 @@ class AdminContentService( return GetAdminContentListResponse(totalCount, audioContentList) } - fun searchAudioContent(searchWord: String, pageable: Pageable): GetAdminContentListResponse { + fun searchAudioContent( + status: ContentReleaseStatus, + searchWord: String, + pageable: Pageable + ): GetAdminContentListResponse { if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") - val totalCount = repository.getAudioContentTotalCount(searchWord) + val totalCount = repository.getAudioContentTotalCount(searchWord, status = status) val audioContentAndThemeList = repository.getAudioContentList( + status = status, offset = pageable.offset, limit = pageable.pageSize.toLong(), searchWord = searchWord -- 2.40.1