Merge pull request '관리자 - 시리즈 리스트 API 추가' (#224) from test into main
Reviewed-on: #224
This commit is contained in:
commit
ce37060d94
|
@ -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))
|
||||||
|
}
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
)
|
|
@ -27,16 +27,13 @@ class MenuQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : MenuQ
|
||||||
)
|
)
|
||||||
.orderBy(menu.orders.asc())
|
.orderBy(menu.orders.asc())
|
||||||
.fetch()
|
.fetch()
|
||||||
.asSequence()
|
|
||||||
.map {
|
.map {
|
||||||
GetMenuResponse(
|
GetMenuResponse(
|
||||||
title = it.title,
|
title = it.title,
|
||||||
route = it.route,
|
route = it.route,
|
||||||
items = if (it.children.isNotEmpty()) {
|
items = if (it.children.isNotEmpty()) {
|
||||||
it.children
|
it.children
|
||||||
.asSequence()
|
|
||||||
.map { menu -> GetMenuResponse(menu.title, menu.route) }
|
.map { menu -> GetMenuResponse(menu.title, menu.route) }
|
||||||
.toList()
|
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue