From 2a9eaead832219eca0b0d49671df091b315bb0e0 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 17 Apr 2024 00:02:26 +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=EB=A6=AC=EC=8A=A4=ED=8A=B8=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 | 44 +++++++++++++++++++ .../CreatorAdminContentSeriesService.kt | 17 ++++++- ...etCreatorAdminContentSeriesListResponse.kt | 14 ++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesListResponse.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 9f6fc90..cf49e55 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 @@ -3,9 +3,11 @@ package kr.co.vividnext.sodalive.creator.admin.content.series import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member +import org.springframework.data.domain.Pageable import org.springframework.lang.Nullable import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestMapping @@ -40,4 +42,20 @@ class CreatorAdminContentSeriesController(private val service: CreatorAdminConte ApiResponse.ok(service.modifySeries(image, requestString, member), "시리즈가 수정되었습니다.") } + + @GetMapping + fun getSeriesList( + pageable: Pageable, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getSeriesList( + 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 0c06767..88c3fef 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 @@ -8,6 +8,13 @@ interface CreatorAdminContentSeriesRepository : JpaRepository, Cre interface CreatorAdminContentSeriesQueryRepository { fun findByIdAndCreatorId(id: Long, creatorId: Long): Series? + fun getSeriesCount(creatorId: Long): Int + fun getSeriesList( + offset: Long, + limit: Long, + creatorId: Long, + imageHost: String + ): List } class CreatorAdminContentSeriesQueryRepositoryImpl( @@ -22,4 +29,41 @@ class CreatorAdminContentSeriesQueryRepositoryImpl( ) .fetchFirst() } + + override fun getSeriesCount(creatorId: Long): Int { + return queryFactory + .select(series.id) + .from(series) + .where( + series.member.id.eq(creatorId) + .and(series.isActive.isTrue) + ) + .fetch() + .size + } + + override fun getSeriesList( + offset: Long, + limit: Long, + creatorId: Long, + imageHost: String + ): List { + return queryFactory + .select( + QGetCreatorAdminContentSeriesListItem( + series.id, + series.title, + series.coverImage.prepend("/").prepend(imageHost) + ) + ) + .from(series) + .where( + series.member.id.eq(creatorId) + .and(series.isActive.isTrue) + ) + .orderBy(series.id.desc()) + .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 3721d12..8ae0c33 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 @@ -25,7 +25,10 @@ class CreatorAdminContentSeriesService( private val objectMapper: ObjectMapper, @Value("\${cloud.aws.s3.bucket}") - private val coverImageBucket: String + private val coverImageBucket: String, + + @Value("\${cloud.aws.cloud-front.host}") + private val coverImageHost: String ) { @Transactional fun createSeries(coverImage: MultipartFile?, requestString: String, member: Member) { @@ -156,4 +159,16 @@ class CreatorAdminContentSeriesService( series.studio = request.studio } } + + fun getSeriesList(offset: Long, limit: Long, creatorId: Long): GetCreatorAdminContentSeriesListResponse { + val totalCount = repository.getSeriesCount(creatorId = creatorId) + val seriesList = repository.getSeriesList( + offset = offset, + limit = limit, + creatorId = creatorId, + imageHost = coverImageHost + ) + + return GetCreatorAdminContentSeriesListResponse(totalCount, seriesList) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesListResponse.kt new file mode 100644 index 0000000..da32444 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/GetCreatorAdminContentSeriesListResponse.kt @@ -0,0 +1,14 @@ +package kr.co.vividnext.sodalive.creator.admin.content.series + +import com.querydsl.core.annotations.QueryProjection + +data class GetCreatorAdminContentSeriesListResponse( + val totalCount: Int, + val items: List +) + +data class GetCreatorAdminContentSeriesListItem @QueryProjection constructor( + val seriesId: Long, + val title: String, + val coverImageUrl: String +)