시리즈에 속하지 않은 콘텐츠 찾기 API 추가

This commit is contained in:
Klaus 2024-04-24 14:07:09 +09:00
parent 613298bdea
commit 9bc1c610ac
4 changed files with 81 additions and 0 deletions

View File

@ -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!!
)
)
}
}

View File

@ -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()
}
}

View File

@ -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
)
}
}

View File

@ -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
)