콘텐츠 메인

- 시리즈 탭 API
This commit is contained in:
2025-02-07 02:58:13 +09:00
parent b1f82f9abe
commit 0f8fcbcaed
12 changed files with 595 additions and 6 deletions

View File

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

View File

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

View File

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