시리즈에 속하지 않은 콘텐츠 찾기 API 추가
This commit is contained in:
parent
613298bdea
commit
9bc1c610ac
|
@ -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
|
||||
)
|
Loading…
Reference in New Issue