From 3ec0cf4facda56c059db0e2e5f7b3c0906270eea Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 26 Apr 2024 03:57:45 +0900 Subject: [PATCH] =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=81=EC=84=B8=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/series/ContentSeriesRepository.kt | 51 +---------------- .../content/series/ContentSeriesService.kt | 55 ++++++++++++++----- .../content/series/GetSeriesDetailResponse.kt | 12 +--- 3 files changed, 48 insertions(+), 70 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesRepository.kt index 3421838..81b047c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesRepository.kt @@ -1,8 +1,6 @@ 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.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.hashtag.QHashTag.hashTag import kr.co.vividnext.sodalive.content.series.content.GetSeriesContentMinMaxPriceResponse @@ -12,9 +10,7 @@ import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seri import kr.co.vividnext.sodalive.creator.admin.content.series.Series import kr.co.vividnext.sodalive.creator.admin.content.series.SeriesPublishedDaysOfWeek import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.QSeriesKeyword.seriesKeyword -import kr.co.vividnext.sodalive.member.QMember import org.springframework.data.jpa.repository.JpaRepository -import java.time.LocalDateTime interface ContentSeriesRepository : JpaRepository, ContentSeriesQueryRepository @@ -28,7 +24,7 @@ interface ContentSeriesQueryRepository { limit: Long ): List - fun getSeriesDetail(seriesId: Long, isAuth: Boolean, imageHost: String): GetSeriesDetailResponse? + fun getSeriesDetail(seriesId: Long, isAuth: Boolean): Series? fun getPublishedDaysOfWeek(seriesId: Long): Set fun getKeywordList(seriesId: Long): List fun getSeriesContentMinMaxPrice(seriesId: Long): GetSeriesContentMinMaxPriceResponse @@ -75,8 +71,7 @@ class ContentSeriesQueryRepositoryImpl( .fetch() } - override fun getSeriesDetail(seriesId: Long, isAuth: Boolean, imageHost: String): GetSeriesDetailResponse? { - val qCreator = QMember.member + override fun getSeriesDetail(seriesId: Long, isAuth: Boolean): Series? { var where = series.id.eq(seriesId) .and(series.isActive.isTrue) @@ -84,48 +79,8 @@ class ContentSeriesQueryRepositoryImpl( where = where.and(series.isAdult.isFalse) } - val formattedDate = Expressions.stringTemplate( - "DATE_FORMAT({0}, {1})", - Expressions.dateTimeTemplate( - LocalDateTime::class.java, - "CONVERT_TZ({0},{1},{2})", - series.createdAt, - "UTC", - "Asia/Seoul" - ), - "%Y-%m-%d" - ) - return queryFactory - .select( - QGetSeriesDetailResponse( - series.id, - series.title, - series.coverImage.prepend("/").prepend(imageHost), - series.introduction, - seriesGenre.genre, - series.isAdult, - series.writer, - series.studio, - formattedDate, - QGetSeriesDetailResponse_GetSeriesDetailCreator( - qCreator.id, - qCreator.nickname, - qCreator.profileImage.prepend("/").prepend(imageHost), - Expressions.constant(false) - ), - Expressions.constant(0), - Expressions.constant(0), - Expressions.constant(15), - Expressions.constant(0), - Expressions.constant(0), - Expressions.constant>(emptyList()), - Expressions.constant("") - ) - ) - .from(series) - .innerJoin(series.member, qCreator) - .innerJoin(series.genre, seriesGenre) + .selectFrom(series) .where(where) .fetchFirst() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesService.kt index d6c9e27..484a8bc 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesService.kt @@ -10,6 +10,8 @@ import kr.co.vividnext.sodalive.member.Member import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter @Service class ContentSeriesService( @@ -76,32 +78,59 @@ class ContentSeriesService( } fun getSeriesDetail(seriesId: Long, member: Member): GetSeriesDetailResponse { - val seriesDetail = repository.getSeriesDetail( + val series = repository.getSeriesDetail( seriesId = seriesId, - isAuth = member.auth != null, - imageHost = coverImageHost + isAuth = member.auth != null ) ?: throw SodaException("잘못된 시리즈 입니다.\n다시 시도해 주세요") - seriesDetail.creator.isFollow = explorerQueryRepository.isFollow( - creatorId = seriesDetail.creator.creatorId, + val isFollow = explorerQueryRepository.isFollow( + creatorId = series.member!!.id!!, memberId = member.id!! ) - seriesDetail.publishedDaysOfWeek = publishedDaysOfWeekText( + val publishedDaysOfWeek = publishedDaysOfWeekText( repository.getPublishedDaysOfWeek(seriesId = seriesId) ) - seriesDetail.keywordList = repository.getKeywordList(seriesId = seriesId) + val keywordList = repository.getKeywordList(seriesId = seriesId) .filter { it.isNotBlank() } val minMaxPrice = repository.getSeriesContentMinMaxPrice(seriesId = seriesId) - seriesDetail.minPrice = minMaxPrice.minPrice - seriesDetail.maxPrice = minMaxPrice.maxPrice - seriesDetail.rentalMinPrice = (minMaxPrice.minPrice * 0.7).toInt() - seriesDetail.rentalMaxPrice = (minMaxPrice.maxPrice * 0.7).toInt() + val minPrice = minMaxPrice.minPrice + val maxPrice = minMaxPrice.maxPrice + val rentalMinPrice = (minMaxPrice.minPrice * 0.7).toInt() + val rentalMaxPrice = (minMaxPrice.maxPrice * 0.7).toInt() - if (!seriesDetail.validate()) throw SodaException("잘못된 시리즈 입니다.\n다시 시도해 주세요") - return seriesDetail + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + return GetSeriesDetailResponse( + seriesId = seriesId, + title = series.title, + coverImage = "$coverImageHost/${series.coverImage}", + introduction = series.introduction, + genre = series.genre!!.genre, + isAdult = series.isAdult, + writer = series.writer, + studio = series.studio, + publishedDate = series.createdAt!! + .atZone(ZoneId.of("UTC")) + .withZoneSameInstant(ZoneId.of("Asia/Seoul")) + .toLocalDateTime() + .format(dateTimeFormatter), + creator = GetSeriesDetailResponse.GetSeriesDetailCreator( + creatorId = series.member!!.id!!, + nickname = series.member!!.nickname, + profileImage = "$coverImageHost/${series.member!!.profileImage}", + isFollow = isFollow + ), + rentalMinPrice = rentalMinPrice, + rentalMaxPrice = rentalMaxPrice, + rentalPeriod = 15, + minPrice = minPrice, + maxPrice = maxPrice, + keywordList = keywordList, + publishedDaysOfWeek = publishedDaysOfWeek + + ) } private fun publishedDaysOfWeekText(publishedDaysOfWeek: Set): String { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/GetSeriesDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/GetSeriesDetailResponse.kt index e9bb8d3..be90080 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/GetSeriesDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/GetSeriesDetailResponse.kt @@ -1,8 +1,6 @@ package kr.co.vividnext.sodalive.content.series -import com.querydsl.core.annotations.QueryProjection - -data class GetSeriesDetailResponse @QueryProjection constructor( +data class GetSeriesDetailResponse( val seriesId: Long, val title: String, val coverImage: String, @@ -21,14 +19,10 @@ data class GetSeriesDetailResponse @QueryProjection constructor( var keywordList: List, var publishedDaysOfWeek: String ) { - data class GetSeriesDetailCreator @QueryProjection constructor( + data class GetSeriesDetailCreator( val creatorId: Long, val nickname: String, - val coverImage: String, + val profileImage: String, var isFollow: Boolean ) - - fun validate(): Boolean { - return keywordList.isNotEmpty() && publishedDaysOfWeek.isBlank() - } }