From 286629836c238f521c2751861dd0277e05606560 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 6 Feb 2024 23:59:51 +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=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorAdminCategoryController.kt | 52 +++++++++++++++++++ .../CreatorAdminCategoryRepository.kt | 49 +++++++++++++++++ .../category/CreatorAdminCategoryService.kt | 32 ++++++++++++ .../category/GetContentInCategoryResponse.kt | 9 ++++ .../SearchContentNotInCategoryResponse.kt | 8 +++ 5 files changed, 150 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryService.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/GetContentInCategoryResponse.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/SearchContentNotInCategoryResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryController.kt new file mode 100644 index 0000000..37aaeca --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryController.kt @@ -0,0 +1,52 @@ +package kr.co.vividnext.sodalive.creator.admin.content.category + +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.security.access.prepost.PreAuthorize +import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +@PreAuthorize("hasRole('CREATOR')") +@RequestMapping("/creator-admin/content-category") +class CreatorAdminCategoryController(private val service: CreatorAdminCategoryService) { + @GetMapping("/search") + fun searchContentNotInCategory( + @RequestParam(value = "category_id") categoryId: Long, + @RequestParam(value = "search_word") searchWord: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.searchContentNotInCategory( + categoryId = categoryId, + searchWord = searchWord, + memberId = member.id!! + ) + ) + } + + @GetMapping + fun getContentInCategory( + @RequestParam(value = "category_id") categoryId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getContentInCategory( + categoryId = categoryId, + memberId = member.id!!, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryRepository.kt new file mode 100644 index 0000000..013c15a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryRepository.kt @@ -0,0 +1,49 @@ +package kr.co.vividnext.sodalive.creator.admin.content.category + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.content.QAudioContent.audioContent +import kr.co.vividnext.sodalive.content.category.QCategoryContent.categoryContent +import org.springframework.stereotype.Repository + +@Repository +class CreatorAdminCategoryRepository(private val queryFactory: JPAQueryFactory) { + fun searchContentNotInCategory( + categoryId: Long, + searchWord: String, + memberId: Long + ): List { + return queryFactory + .select(QSearchContentNotInCategoryResponse(audioContent.id, audioContent.title)) + .from(audioContent) + .leftJoin(categoryContent) + .on(audioContent.id.eq(categoryContent.content.id).and(categoryContent.isActive.ne(true))) + .where( + audioContent.duration.isNotNull + .and(audioContent.member.isNotNull) + .and(audioContent.member.id.eq(memberId)) + .and(audioContent.isActive.isTrue.or(audioContent.releaseDate.isNotNull)) + .and(audioContent.title.contains(searchWord)) + ) + .fetch() + } + + fun getContentInCategory( + categoryId: Long, + memberId: Long, + offset: Long, + limit: Long + ): List { + return queryFactory + .select(QGetContentInCategoryResponse(audioContent.id, audioContent.title, audioContent.isAdult)) + .from(audioContent) + .leftJoin(categoryContent) + .on(audioContent.id.eq(categoryContent.content.id).and(categoryContent.isActive.isTrue)) + .where( + audioContent.duration.isNotNull + .and(audioContent.member.isNotNull) + .and(audioContent.member.id.eq(memberId)) + .and(audioContent.isActive.isTrue.or(audioContent.releaseDate.isNotNull)) + ) + .fetch() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryService.kt new file mode 100644 index 0000000..45021f6 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/CreatorAdminCategoryService.kt @@ -0,0 +1,32 @@ +package kr.co.vividnext.sodalive.creator.admin.content.category + +import org.springframework.stereotype.Service + +@Service +class CreatorAdminCategoryService(private val repository: CreatorAdminCategoryRepository) { + fun searchContentNotInCategory( + categoryId: Long, + searchWord: String, + memberId: Long + ): List { + return repository.searchContentNotInCategory( + categoryId, + searchWord, + memberId + ) + } + + fun getContentInCategory( + categoryId: Long, + memberId: Long, + offset: Long, + limit: Long + ): List { + return repository.getContentInCategory( + categoryId, + memberId, + offset, + limit + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/GetContentInCategoryResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/GetContentInCategoryResponse.kt new file mode 100644 index 0000000..4891a87 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/GetContentInCategoryResponse.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.creator.admin.content.category + +import com.querydsl.core.annotations.QueryProjection + +data class GetContentInCategoryResponse @QueryProjection constructor( + val contentId: Long, + val title: String, + val isAdult: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/SearchContentNotInCategoryResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/SearchContentNotInCategoryResponse.kt new file mode 100644 index 0000000..cf103c9 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/category/SearchContentNotInCategoryResponse.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.creator.admin.content.category + +import com.querydsl.core.annotations.QueryProjection + +data class SearchContentNotInCategoryResponse @QueryProjection constructor( + val contentId: Long, + val title: String +)