From 79e3d59a9aa857c108971cfecaed5d27b88e2805 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 14 Oct 2024 18:58:48 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=8B=9C?= =?UTF-8?q?=EB=A6=AC=EC=A6=88=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20API=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 --- .../series/AdminContentSeriesController.kt | 16 +++++ .../series/AdminContentSeriesRepository.kt | 70 +++++++++++++++++++ .../series/AdminContentSeriesService.kt | 17 +++++ .../series/GetAdminSeriesListResponse.kt | 19 +++++ .../vividnext/sodalive/menu/MenuRepository.kt | 3 - 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesService.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/GetAdminSeriesListResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesController.kt new file mode 100644 index 0000000..99987e2 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesController.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.admin.content.series + +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.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@PreAuthorize("hasRole('ADMIN')") +@RequestMapping("/admin/audio-content/series") +class AdminContentSeriesController(private val service: AdminContentSeriesService) { + @GetMapping + fun getSeriesList(pageable: Pageable) = ApiResponse.ok(service.getSeriesList(pageable)) +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesRepository.kt new file mode 100644 index 0000000..25b8f94 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesRepository.kt @@ -0,0 +1,70 @@ +package kr.co.vividnext.sodalive.admin.content.series + +import com.querydsl.core.types.dsl.CaseBuilder +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.admin.content.series.genre.QSeriesGenre.seriesGenre +import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series +import kr.co.vividnext.sodalive.creator.admin.content.series.Series +import kr.co.vividnext.sodalive.creator.admin.content.series.SeriesState +import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.beans.factory.annotation.Value +import org.springframework.data.jpa.repository.JpaRepository + +interface AdminContentSeriesRepository : JpaRepository, AdminContentSeriesQueryRepository + +interface AdminContentSeriesQueryRepository { + fun getSeriesTotalCount(): Int + fun getSeriesList( + offset: Long, + limit: Long + ): List +} + +class AdminContentSeriesQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val coverImageHost: String +) : AdminContentSeriesQueryRepository { + override fun getSeriesTotalCount(): Int { + val where = series.isActive.isTrue + .and(series.member.isNotNull) + + return queryFactory + .select(series.id) + .from(series) + .where(where) + .fetch() + .size + } + + override fun getSeriesList(offset: Long, limit: Long): List { + val where = series.isActive.isTrue + .and(series.member.isNotNull) + + return queryFactory + .select( + QGetAdminSeriesListItem( + series.id, + series.title, + series.introduction, + series.coverImage.prepend("/").prepend(coverImageHost), + member.nickname, + seriesGenre.genre, + CaseBuilder() + .`when`(series.state.eq(SeriesState.COMPLETE)).then("완결") + .`when`(series.state.eq(SeriesState.COMPLETE)).then("휴재") + .otherwise("연재중"), + series.isAdult + ) + ) + .from(series) + .innerJoin(series.member, member) + .innerJoin(series.genre, seriesGenre) + .where(where) + .offset(offset) + .limit(limit) + .orderBy(series.orders.desc()) + .fetch() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesService.kt new file mode 100644 index 0000000..6cb2df0 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/AdminContentSeriesService.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.admin.content.series + +import org.springframework.data.domain.Pageable +import org.springframework.stereotype.Service + +@Service +class AdminContentSeriesService(private val repository: AdminContentSeriesRepository) { + fun getSeriesList(pageable: Pageable): GetAdminSeriesListResponse { + val totalCount = repository.getSeriesTotalCount() + val items = repository.getSeriesList( + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + + return GetAdminSeriesListResponse(totalCount, items) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/GetAdminSeriesListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/GetAdminSeriesListResponse.kt new file mode 100644 index 0000000..739bce3 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/series/GetAdminSeriesListResponse.kt @@ -0,0 +1,19 @@ +package kr.co.vividnext.sodalive.admin.content.series + +import com.querydsl.core.annotations.QueryProjection + +data class GetAdminSeriesListResponse( + val totalCount: Int, + val items: List +) + +data class GetAdminSeriesListItem @QueryProjection constructor( + val id: Long, + val title: String, + val introduction: String, + val coverImageUrl: String, + val creatorNickname: String, + val genre: String, + val state: String, + val isAdult: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuRepository.kt index c5eb43f..63df405 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuRepository.kt @@ -27,16 +27,13 @@ class MenuQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : MenuQ ) .orderBy(menu.orders.asc()) .fetch() - .asSequence() .map { GetMenuResponse( title = it.title, route = it.route, items = if (it.children.isNotEmpty()) { it.children - .asSequence() .map { menu -> GetMenuResponse(menu.title, menu.route) } - .toList() } else { null } -- 2.40.1