From b849de00dca7af01aa3b1a0cb98309055ab934bb Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 17 Apr 2024 18:08:40 +0900 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20API=20-=20=EC=8B=9C=EB=A6=AC?= =?UTF-8?q?=EC=A6=88=20=EC=BD=98=ED=85=90=EC=B8=A0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorAdminContentSeriesController.kt | 18 +++++++ .../CreatorAdminContentSeriesRepository.kt | 53 +++++++++++++++++++ .../CreatorAdminContentSeriesService.kt | 17 ++++++ ...reatorAdminContentSeriesContentResponse.kt | 15 ++++++ 4 files changed, 103 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesContentResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt index 0282f4b..2e0c6a0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt @@ -69,4 +69,22 @@ class CreatorAdminContentSeriesController(private val service: CreatorAdminConte ApiResponse.ok(service.getDetail(id = id, memberId = member.id!!)) } + + @GetMapping("/{id}/content") + fun getSeriesContent( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getSeriesContent( + seriesId = id, + offset = pageable.offset, + limit = pageable.pageSize.toLong(), + creatorId = member.id!! + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt index 88c3fef..14fd766 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt @@ -1,7 +1,9 @@ package kr.co.vividnext.sodalive.creator.admin.content.series import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series +import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seriesContent import org.springframework.data.jpa.repository.JpaRepository interface CreatorAdminContentSeriesRepository : JpaRepository, CreatorAdminContentSeriesQueryRepository @@ -15,6 +17,14 @@ interface CreatorAdminContentSeriesQueryRepository { creatorId: Long, imageHost: String ): List + + fun getSeriesContentCount(creatorId: Long): Int + fun getSeriesContentList( + offset: Long, + limit: Long, + creatorId: Long, + imageHost: String + ): List } class CreatorAdminContentSeriesQueryRepositoryImpl( @@ -66,4 +76,47 @@ class CreatorAdminContentSeriesQueryRepositoryImpl( .limit(limit) .fetch() } + + override fun getSeriesContentCount(creatorId: Long): Int { + return queryFactory + .select(seriesContent.id) + .from(seriesContent) + .innerJoin(seriesContent.series, series) + .innerJoin(seriesContent.content, audioContent) + .where( + series.member.id.eq(creatorId) + .and(audioContent.member.id.eq(creatorId)) + .and(series.isActive.isTrue) + ) + .fetch() + .size + } + + override fun getSeriesContentList( + offset: Long, + limit: Long, + creatorId: Long, + imageHost: String + ): List { + return queryFactory + .select( + QGetCreatorAdminContentSeriesContentItem( + audioContent.id, + audioContent.coverImage.prepend("/").prepend(imageHost), + audioContent.title, + audioContent.isAdult + ) + ) + .from(seriesContent) + .innerJoin(seriesContent.series, series) + .innerJoin(seriesContent.content, audioContent) + .where( + series.member.id.eq(creatorId) + .and(audioContent.member.id.eq(creatorId)) + .and(series.isActive.isTrue) + ) + .offset(offset) + .limit(limit) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt index 995a85d..c71e588 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt @@ -178,4 +178,21 @@ class CreatorAdminContentSeriesService( return series.toDetailResponse(imageHost = coverImageHost) } + + fun getSeriesContent( + seriesId: Long, + offset: Long, + limit: Long, + creatorId: Long + ): GetCreatorAdminContentSeriesContentResponse { + val totalCount = repository.getSeriesContentCount(creatorId = creatorId) + val seriesContentList = repository.getSeriesContentList( + offset = offset, + limit = limit, + creatorId = creatorId, + imageHost = coverImageHost + ) + + return GetCreatorAdminContentSeriesContentResponse(totalCount, seriesContentList) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesContentResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesContentResponse.kt new file mode 100644 index 0000000..fd9118f --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesContentResponse.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.creator.admin.content.series + +import com.querydsl.core.annotations.QueryProjection + +data class GetCreatorAdminContentSeriesContentResponse( + val totalCount: Int, + val items: List +) + +data class GetCreatorAdminContentSeriesContentItem @QueryProjection constructor( + val contentId: Long, + val coverImage: String, + val title: String, + val isAdult: Boolean +)