시리즈에 속하지 않은 콘텐츠 찾기 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.PutMapping
|
||||||
import org.springframework.web.bind.annotation.RequestBody
|
import org.springframework.web.bind.annotation.RequestBody
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
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.RequestPart
|
||||||
import org.springframework.web.bind.annotation.RestController
|
import org.springframework.web.bind.annotation.RestController
|
||||||
import org.springframework.web.multipart.MultipartFile
|
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.content.QAudioContent.audioContent
|
||||||
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series
|
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.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
|
import org.springframework.data.jpa.repository.JpaRepository
|
||||||
|
|
||||||
interface CreatorAdminContentSeriesRepository : JpaRepository<Series, Long>, CreatorAdminContentSeriesQueryRepository
|
interface CreatorAdminContentSeriesRepository : JpaRepository<Series, Long>, CreatorAdminContentSeriesQueryRepository
|
||||||
|
@ -25,6 +27,13 @@ interface CreatorAdminContentSeriesQueryRepository {
|
||||||
creatorId: Long,
|
creatorId: Long,
|
||||||
imageHost: String
|
imageHost: String
|
||||||
): List<GetCreatorAdminContentSeriesContentItem>
|
): List<GetCreatorAdminContentSeriesContentItem>
|
||||||
|
|
||||||
|
fun searchContentNotInSeries(
|
||||||
|
seriesId: Long,
|
||||||
|
searchWord: String,
|
||||||
|
memberId: Long,
|
||||||
|
imageHost: String
|
||||||
|
): List<SearchContentNotInSeriesResponse>
|
||||||
}
|
}
|
||||||
|
|
||||||
class CreatorAdminContentSeriesQueryRepositoryImpl(
|
class CreatorAdminContentSeriesQueryRepositoryImpl(
|
||||||
|
@ -113,4 +122,35 @@ class CreatorAdminContentSeriesQueryRepositoryImpl(
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
.fetch()
|
.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.content.hashtag.HashTagRepository
|
||||||
import kr.co.vividnext.sodalive.creator.admin.content.series.content.AddingContentToTheSeriesRequest
|
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.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.genre.CreatorAdminContentSeriesGenreRepository
|
||||||
import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.SeriesKeyword
|
import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.SeriesKeyword
|
||||||
import kr.co.vividnext.sodalive.member.Member
|
import kr.co.vividnext.sodalive.member.Member
|
||||||
|
@ -256,4 +257,17 @@ class CreatorAdminContentSeriesService(
|
||||||
|
|
||||||
series.contentList.removeIf { it.content!!.id == request.contentId }
|
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