Merge pull request '관리자 - 시리즈 리스트 API 추가' (#224) from test into main

Reviewed-on: #224
This commit is contained in:
klaus 2024-10-14 10:10:43 +00:00
commit ce37060d94
5 changed files with 122 additions and 3 deletions

View File

@ -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))
}

View File

@ -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<Series, Long>, AdminContentSeriesQueryRepository
interface AdminContentSeriesQueryRepository {
fun getSeriesTotalCount(): Int
fun getSeriesList(
offset: Long,
limit: Long
): List<GetAdminSeriesListItem>
}
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<GetAdminSeriesListItem> {
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()
}
}

View File

@ -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)
}
}

View File

@ -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<GetAdminSeriesListItem>
)
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
)

View File

@ -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
}