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 ce1adfd..0785176 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 @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestPart import org.springframework.web.bind.annotation.RestController import org.springframework.web.multipart.MultipartFile @@ -116,4 +117,21 @@ class CreatorAdminContentSeriesController(private val service: CreatorAdminConte "콘텐츠를 삭제하였습니다." ) } + + @GetMapping("/content/search") + fun searchContentNotInSeries( + @RequestParam(value = "series_id") seriesId: Long, + @RequestParam(value = "search_word") searchWord: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.searchContentNotInSeries( + seriesId = seriesId, + searchWord = searchWord, + memberId = 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 bb8d784..f391285 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 @@ -4,6 +4,8 @@ import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seriesContent +import kr.co.vividnext.sodalive.creator.admin.content.series.content.QSearchContentNotInSeriesResponse +import kr.co.vividnext.sodalive.creator.admin.content.series.content.SearchContentNotInSeriesResponse import org.springframework.data.jpa.repository.JpaRepository interface CreatorAdminContentSeriesRepository : JpaRepository, CreatorAdminContentSeriesQueryRepository @@ -25,6 +27,13 @@ interface CreatorAdminContentSeriesQueryRepository { creatorId: Long, imageHost: String ): List + + fun searchContentNotInSeries( + seriesId: Long, + searchWord: String, + memberId: Long, + imageHost: String + ): List } class CreatorAdminContentSeriesQueryRepositoryImpl( @@ -113,4 +122,35 @@ class CreatorAdminContentSeriesQueryRepositoryImpl( .limit(limit) .fetch() } + + override fun searchContentNotInSeries( + seriesId: Long, + searchWord: String, + memberId: Long, + imageHost: String + ): List { + return queryFactory + .select( + QSearchContentNotInSeriesResponse( + audioContent.id, + audioContent.title, + audioContent.coverImage.prepend("/").prepend(imageHost) + ) + ) + .from(audioContent) + .leftJoin(seriesContent) + .on( + audioContent.id.eq(seriesContent.content.id) + .and(seriesContent.series.id.eq(seriesId)) + ) + .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)) + .and(seriesContent.id.isNull) + ) + .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 08e5d0e..b0317bc 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 @@ -9,6 +9,7 @@ import kr.co.vividnext.sodalive.content.hashtag.HashTag import kr.co.vividnext.sodalive.content.hashtag.HashTagRepository import kr.co.vividnext.sodalive.creator.admin.content.series.content.AddingContentToTheSeriesRequest import kr.co.vividnext.sodalive.creator.admin.content.series.content.RemoveContentToTheSeriesRequest +import kr.co.vividnext.sodalive.creator.admin.content.series.content.SearchContentNotInSeriesResponse import kr.co.vividnext.sodalive.creator.admin.content.series.genre.CreatorAdminContentSeriesGenreRepository import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.SeriesKeyword import kr.co.vividnext.sodalive.member.Member @@ -256,4 +257,17 @@ class CreatorAdminContentSeriesService( series.contentList.removeIf { it.content!!.id == request.contentId } } + + fun searchContentNotInSeries( + seriesId: Long, + searchWord: String, + memberId: Long + ): List { + return repository.searchContentNotInSeries( + seriesId, + searchWord, + memberId, + imageHost = coverImageHost + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/content/SearchContentNotInSeriesResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/content/SearchContentNotInSeriesResponse.kt new file mode 100644 index 0000000..79c9f8e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/content/SearchContentNotInSeriesResponse.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.creator.admin.content.series.content + +import com.querydsl.core.annotations.QueryProjection + +data class SearchContentNotInSeriesResponse @QueryProjection constructor( + val contentId: Long, + val title: String, + val coverImage: String +)