콘텐츠 메인
- 시리즈 탭 API
This commit is contained in:
@@ -2,15 +2,21 @@ package kr.co.vividnext.sodalive.content.series
|
||||
|
||||
import com.querydsl.core.types.dsl.Expressions
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory
|
||||
import kr.co.vividnext.sodalive.admin.content.series.genre.QSeriesGenre.seriesGenre
|
||||
import kr.co.vividnext.sodalive.content.ContentType
|
||||
import kr.co.vividnext.sodalive.content.QAudioContent.audioContent
|
||||
import kr.co.vividnext.sodalive.content.hashtag.QHashTag.hashTag
|
||||
import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCuration.audioContentCuration
|
||||
import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCurationItem.audioContentCurationItem
|
||||
import kr.co.vividnext.sodalive.content.series.content.GetSeriesContentMinMaxPriceResponse
|
||||
import kr.co.vividnext.sodalive.content.series.content.QGetSeriesContentMinMaxPriceResponse
|
||||
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.Series
|
||||
import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.QSeriesKeyword.seriesKeyword
|
||||
import kr.co.vividnext.sodalive.member.MemberRole
|
||||
import kr.co.vividnext.sodalive.member.QMember.member
|
||||
import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
|
||||
interface ContentSeriesRepository : JpaRepository<Series, Long>, ContentSeriesQueryRepository
|
||||
@@ -29,6 +35,9 @@ interface ContentSeriesQueryRepository {
|
||||
fun getKeywordList(seriesId: Long): List<String>
|
||||
fun getSeriesContentMinMaxPrice(seriesId: Long): GetSeriesContentMinMaxPriceResponse
|
||||
fun getRecommendSeriesList(isAuth: Boolean, contentType: ContentType, limit: Long): List<Series>
|
||||
fun getOriginalAudioDramaList(isAdult: Boolean, offset: Long = 0, limit: Long = 20): List<Series>
|
||||
fun getGenreList(isAdult: Boolean): List<GetSeriesGenreListResponse>
|
||||
fun findByCurationId(curationId: Long, memberId: Long, isAdult: Boolean): List<Series>
|
||||
}
|
||||
|
||||
class ContentSeriesQueryRepositoryImpl(
|
||||
@@ -133,4 +142,61 @@ class ContentSeriesQueryRepositoryImpl(
|
||||
.limit(limit)
|
||||
.fetch()
|
||||
}
|
||||
|
||||
override fun getOriginalAudioDramaList(isAdult: Boolean, offset: Long, limit: Long): List<Series> {
|
||||
var where = series.isOriginal.isTrue
|
||||
.and(series.isActive.isTrue)
|
||||
|
||||
if (!isAdult) {
|
||||
where = where.and(series.isAdult.isFalse)
|
||||
}
|
||||
|
||||
return queryFactory
|
||||
.selectFrom(series)
|
||||
.where(where)
|
||||
.orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc())
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.fetch()
|
||||
}
|
||||
|
||||
override fun getGenreList(isAdult: Boolean): List<GetSeriesGenreListResponse> {
|
||||
var where = seriesGenre.isActive.isTrue
|
||||
|
||||
if (!isAdult) {
|
||||
where = where.and(seriesGenre.isAdult.isFalse)
|
||||
}
|
||||
|
||||
return queryFactory
|
||||
.select(QGetSeriesGenreListResponse(seriesGenre.id, seriesGenre.genre))
|
||||
.from(seriesGenre)
|
||||
.where(where)
|
||||
.orderBy(seriesGenre.orders.asc())
|
||||
.fetch()
|
||||
}
|
||||
|
||||
override fun findByCurationId(curationId: Long, memberId: Long, isAdult: Boolean): List<Series> {
|
||||
val blockMemberCondition = blockMember.member.id.eq(member.id)
|
||||
.and(blockMember.isActive.isTrue)
|
||||
.and(blockMember.blockedMember.id.eq(memberId))
|
||||
|
||||
var where = series.isActive.isTrue
|
||||
.and(member.isActive.isTrue)
|
||||
.and(member.role.eq(MemberRole.CREATOR))
|
||||
.and(blockMember.id.isNull)
|
||||
|
||||
if (!isAdult) {
|
||||
where = where.and(series.isAdult.isFalse)
|
||||
}
|
||||
|
||||
return queryFactory
|
||||
.select(series)
|
||||
.from(audioContentCurationItem)
|
||||
.innerJoin(audioContentCurationItem.curation, audioContentCuration)
|
||||
.innerJoin(audioContentCurationItem.series, series)
|
||||
.innerJoin(series.member, member)
|
||||
.leftJoin(blockMember).on(blockMemberCondition)
|
||||
.where(where)
|
||||
.fetch()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,19 @@ class ContentSeriesService(
|
||||
@Value("\${cloud.aws.cloud-front.host}")
|
||||
private val coverImageHost: String
|
||||
) {
|
||||
fun getOriginalAudioDramaList(
|
||||
isAdult: Boolean,
|
||||
offset: Long = 0,
|
||||
limit: Long = 20
|
||||
): List<GetSeriesListResponse.SeriesListItem> {
|
||||
val originalAudioDramaList = repository.getOriginalAudioDramaList(isAdult, offset, limit)
|
||||
return seriesToSeriesListItem(originalAudioDramaList, isAdult)
|
||||
}
|
||||
|
||||
fun getGenreList(isAdult: Boolean): List<GetSeriesGenreListResponse> {
|
||||
return repository.getGenreList(isAdult = isAdult)
|
||||
}
|
||||
|
||||
fun getSeriesList(
|
||||
creatorId: Long,
|
||||
member: Member,
|
||||
@@ -170,6 +183,15 @@ class ContentSeriesService(
|
||||
return seriesToSeriesListItem(seriesList = seriesList, isAdult = member.auth != null)
|
||||
}
|
||||
|
||||
fun fetchSeriesByCurationId(
|
||||
curationId: Long,
|
||||
memberId: Long,
|
||||
isAdult: Boolean
|
||||
): List<GetSeriesListResponse.SeriesListItem> {
|
||||
val seriesList = repository.findByCurationId(curationId = curationId, memberId = memberId, isAdult = isAdult)
|
||||
return seriesToSeriesListItem(seriesList, isAdult)
|
||||
}
|
||||
|
||||
private fun seriesToSeriesListItem(
|
||||
seriesList: List<Series>,
|
||||
isAdult: Boolean
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package kr.co.vividnext.sodalive.content.series
|
||||
|
||||
import com.querydsl.core.annotations.QueryProjection
|
||||
|
||||
data class GetSeriesGenreListResponse @QueryProjection constructor(
|
||||
val id: Long,
|
||||
val genre: String
|
||||
)
|
||||
Reference in New Issue
Block a user