관리자 - 시리즈 리스트 API 추가
This commit is contained in:
		| @@ -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()) | ||||
|             .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 | ||||
|                     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user