시리즈에 속하지 않은 콘텐츠 찾기 API 추가
This commit is contained in:
		| @@ -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!! | ||||
|             ) | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<Series, Long>, CreatorAdminContentSeriesQueryRepository | ||||
| @@ -25,6 +27,13 @@ interface CreatorAdminContentSeriesQueryRepository { | ||||
|         creatorId: Long, | ||||
|         imageHost: String | ||||
|     ): List<GetCreatorAdminContentSeriesContentItem> | ||||
|  | ||||
|     fun searchContentNotInSeries( | ||||
|         seriesId: Long, | ||||
|         searchWord: String, | ||||
|         memberId: Long, | ||||
|         imageHost: String | ||||
|     ): List<SearchContentNotInSeriesResponse> | ||||
| } | ||||
|  | ||||
| class CreatorAdminContentSeriesQueryRepositoryImpl( | ||||
| @@ -113,4 +122,35 @@ class CreatorAdminContentSeriesQueryRepositoryImpl( | ||||
|             .limit(limit) | ||||
|             .fetch() | ||||
|     } | ||||
|  | ||||
|     override fun searchContentNotInSeries( | ||||
|         seriesId: Long, | ||||
|         searchWord: String, | ||||
|         memberId: Long, | ||||
|         imageHost: String | ||||
|     ): List<SearchContentNotInSeriesResponse> { | ||||
|         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() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<SearchContentNotInSeriesResponse> { | ||||
|         return repository.searchContentNotInSeries( | ||||
|             seriesId, | ||||
|             searchWord, | ||||
|             memberId, | ||||
|             imageHost = coverImageHost | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
| ) | ||||
		Reference in New Issue
	
	Block a user