From eee59855cc32988a4c58c419a404f4b64f20c5a1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 7 Nov 2024 18:48:29 +0900 Subject: [PATCH 1/7] =?UTF-8?q?BundleAudioContent=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContent.kt | 11 --- .../content/AudioContentRepository.kt | 14 --- .../sodalive/content/AudioContentService.kt | 92 ++++++------------- .../sodalive/content/BundleAudioContent.kt | 22 ----- .../content/CreateAudioContentRequest.kt | 2 - 5 files changed, 28 insertions(+), 113 deletions(-) delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/BundleAudioContent.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt index 9d121eb..430f3d7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt @@ -9,8 +9,6 @@ import java.time.LocalDateTime import javax.persistence.CascadeType import javax.persistence.Column import javax.persistence.Entity -import javax.persistence.EnumType -import javax.persistence.Enumerated import javax.persistence.FetchType import javax.persistence.JoinColumn import javax.persistence.ManyToOne @@ -18,10 +16,6 @@ import javax.persistence.OneToMany import javax.persistence.OneToOne import javax.persistence.Table -enum class AudioContentType { - INDIVIDUAL, BUNDLE -} - enum class SortType { NEWEST, PRICE_HIGH, PRICE_LOW } @@ -36,8 +30,6 @@ data class AudioContent( var releaseDate: LocalDateTime? = null, val limited: Int? = null, var remaining: Int? = null, - @Enumerated(value = EnumType.STRING) - val type: AudioContentType = AudioContentType.INDIVIDUAL, val isGeneratePreview: Boolean = true, var isOnlyRental: Boolean = false, var isAdult: Boolean = false, @@ -63,7 +55,4 @@ data class AudioContent( @OneToMany(mappedBy = "audioContent", cascade = [CascadeType.ALL]) val audioContentHashTags: MutableList = mutableListOf() - - @OneToMany(mappedBy = "child", cascade = [CascadeType.ALL]) - var children: MutableList = mutableListOf() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index e417a61..acc85e7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -3,7 +3,6 @@ package kr.co.vividnext.sodalive.content import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.content.QAudioContent.audioContent -import kr.co.vividnext.sodalive.content.QBundleAudioContent.bundleAudioContent import kr.co.vividnext.sodalive.content.category.QCategoryContent.categoryContent import kr.co.vividnext.sodalive.content.comment.QAudioContentComment.audioContentComment import kr.co.vividnext.sodalive.content.like.QAudioContentLike.audioContentLike @@ -32,7 +31,6 @@ interface AudioContentRepository : JpaRepository, AudioConte interface AudioContentQueryRepository { fun findByIdAndActive(contentId: Long): AudioContent? fun findByIdAndCreatorId(contentId: Long, creatorId: Long): AudioContent? - fun findBundleByContentId(contentId: Long): List fun findByCreatorId( creatorId: Long, coverImageHost: String, @@ -147,18 +145,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetchOne() } - // 해당 컨텐츠가 속한 묶음(번들) 상품 리스트 검색 - override fun findBundleByContentId(contentId: Long): List { - return queryFactory - .select(bundleAudioContent.parent) - .from(bundleAudioContent) - .where( - bundleAudioContent.child.id.eq(contentId) - .and(bundleAudioContent.child.isActive.isTrue) - ) - .fetch() - } - override fun findByCreatorId( creatorId: Long, coverImageHost: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index a8d1519..2b9df4a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -160,14 +160,10 @@ class AudioContentService( } // contentFile 체크 - if (contentFile == null && request.type == AudioContentType.INDIVIDUAL) { + if (contentFile == null) { throw SodaException("콘텐츠를 선택해 주세요.") } - if (request.type == AudioContentType.BUNDLE && request.childIds == null) { - throw SodaException("묶음상품의 하위상품을 선택해 주세요.") - } - // 테마 체크 val theme = themeQueryRepository.findThemeByIdAndActive(id = request.themeId) ?: throw SodaException("잘못된 테마입니다. 다시 선택해 주세요.") @@ -178,7 +174,6 @@ class AudioContentService( val audioContent = AudioContent( title = request.title, detail = request.detail, - type = request.type, price = if (request.price > 0) { request.price } else { @@ -188,18 +183,12 @@ class AudioContentService( limited = request.limited, remaining = request.limited, isAdult = request.isAdult, - isGeneratePreview = if (request.type == AudioContentType.INDIVIDUAL) { - request.isGeneratePreview - } else { - false - }, + isGeneratePreview = request.isGeneratePreview, isOnlyRental = if (request.limited != null && request.limited > 0) false else request.isOnlyRental, isCommentAvailable = request.isCommentAvailable ) audioContent.theme = theme audioContent.member = member - audioContent.isActive = request.type == AudioContentType.BUNDLE - repository.save(audioContent) // 태그 분리, #추가, 등록 @@ -246,48 +235,34 @@ class AudioContentService( audioContent.coverImage = coverImagePath - if (contentFile != null && request.type == AudioContentType.INDIVIDUAL) { - // 콘텐츠 파일명 생성 - val contentFileName = generateFileName(prefix = "${audioContent.id}-content") + // 콘텐츠 파일명 생성 + val contentFileName = generateFileName(prefix = "${audioContent.id}-content") - // 콘텐츠 파일 업로드 - metadata = ObjectMetadata() - metadata.contentLength = contentFile.size - metadata.addUserMetadata( - "generate_preview", - if (request.price > 0) { - request.isGeneratePreview.toString() - } else { - "false" - } - ) - - if (request.previewStartTime != null && request.previewEndTime != null) { - metadata.addUserMetadata("preview_start_time", request.previewStartTime) - metadata.addUserMetadata("preview_end_time", request.previewEndTime) + // 콘텐츠 파일 업로드 + metadata = ObjectMetadata() + metadata.contentLength = contentFile.size + metadata.addUserMetadata( + "generate_preview", + if (request.price > 0) { + request.isGeneratePreview.toString() + } else { + "false" } + ) - val contentPath = s3Uploader.upload( - inputStream = contentFile.inputStream, - bucket = audioContentBucket, - filePath = "input/${audioContent.id}/$contentFileName", - metadata = metadata - ) - - audioContent.content = contentPath + if (request.previewStartTime != null && request.previewEndTime != null) { + metadata.addUserMetadata("preview_start_time", request.previewStartTime) + metadata.addUserMetadata("preview_end_time", request.previewEndTime) } - if (request.childIds != null && request.type == AudioContentType.BUNDLE) { - for (childId in request.childIds) { - val childContent = repository.findByIdAndActive(childId) - ?: continue + val contentPath = s3Uploader.upload( + inputStream = contentFile.inputStream, + bucket = audioContentBucket, + filePath = "input/${audioContent.id}/$contentFileName", + metadata = metadata + ) - val bundleAudioContent = BundleAudioContent() - bundleAudioContent.parent = audioContent - bundleAudioContent.child = childContent - audioContent.children.add(bundleAudioContent) - } - } + audioContent.content = contentPath return CreateAudioContentResponse(contentId = audioContent.id!!) } @@ -438,9 +413,6 @@ class AudioContentService( } fun getDetail(id: Long, member: Member, timezone: String): GetAudioContentDetailResponse { - // 묶음 콘텐츠 조회 - val bundleAudioContentList = repository.findBundleByContentId(contentId = id) - // 오디오 콘텐츠 조회 (content_id, 제목, 내용, 테마, 태그, 19여부, 이미지, 콘텐츠 PATH) val audioContent = repository.findByIdOrNull(id) ?: throw SodaException("잘못된 콘텐츠 입니다.\n다시 시도해 주세요.") @@ -455,23 +427,16 @@ class AudioContentService( memberId = member.id!! ) - // 구매 여부 확인 - val isExistsBundleAudioContent = bundleAudioContentList - .map { orderRepository.isExistOrdered(memberId = member.id!!, contentId = it.id!!) } - .contains(true) - val (isExistsAudioContent, orderType) = orderRepository.isExistOrderedAndOrderType( memberId = member.id!!, contentId = audioContent.id!! ) - val existOrdered = isExistsBundleAudioContent || isExistsAudioContent - // 차단된 사용자 체크 val isBlocked = blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = creatorId) - if (isBlocked && !existOrdered) throw SodaException("${creator.nickname}님의 요청으로 콘텐츠 접근이 제한됩니다.") + if (isBlocked && !isExistsAudioContent) throw SodaException("${creator.nickname}님의 요청으로 콘텐츠 접근이 제한됩니다.") - val orderSequence = if (existOrdered) { + val orderSequence = if (isExistsAudioContent) { limitedEditionOrderRepository.getOrderSequence( contentId = audioContent.id!!, memberId = member.id!! @@ -481,7 +446,7 @@ class AudioContentService( } if ( - !existOrdered && + !isExistsAudioContent && !audioContent.isActive && audioContent.releaseDate != null && audioContent.releaseDate!! < LocalDateTime.now() @@ -536,7 +501,6 @@ class AudioContentService( audioContentCloudFront.generateSignedURL( resourcePath = if ( isExistsAudioContent || - isExistsBundleAudioContent || audioContent.member!!.id!! == member.id!! || audioContent.price <= 0 ) { @@ -622,7 +586,7 @@ class AudioContentService( isAdult = audioContent.isAdult, isMosaic = audioContent.isAdult && member.auth == null, isOnlyRental = audioContent.isOnlyRental, - existOrdered = existOrdered, + existOrdered = isExistsAudioContent, orderType = orderType, remainingTime = remainingTime, creatorOtherContentList = creatorOtherContentList, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/BundleAudioContent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/BundleAudioContent.kt deleted file mode 100644 index 375e819..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/BundleAudioContent.kt +++ /dev/null @@ -1,22 +0,0 @@ -package kr.co.vividnext.sodalive.content - -import kr.co.vividnext.sodalive.common.BaseEntity -import javax.persistence.Entity -import javax.persistence.FetchType -import javax.persistence.JoinColumn -import javax.persistence.ManyToOne -import javax.persistence.Table - -@Entity -@Table(name = "bundle_content") -data class BundleAudioContent( - var isActive: Boolean = true -) : BaseEntity() { - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "parent_content_id", nullable = false) - var parent: AudioContent? = null - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "child_content_id", nullable = false) - var child: AudioContent? = null -} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt index 7a155c1..cc1b84a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt @@ -13,8 +13,6 @@ data class CreateAudioContentRequest( val isGeneratePreview: Boolean = false, val isOnlyRental: Boolean = false, val isCommentAvailable: Boolean = false, - val type: AudioContentType = AudioContentType.INDIVIDUAL, - val childIds: List? = null, val previewStartTime: String? = null, val previewEndTime: String? = null ) From d94ef1eb25a6a5d05902fd6ac96f4355f949f199 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 00:47:12 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20-=20=EA=B5=AC=EB=A7=A4=EC=98=B5=EC=85=98(=EB=AA=A8?= =?UTF-8?q?=EB=91=90,=20=EC=86=8C=EC=9E=A5=EB=A7=8C,=20=EB=8C=80=EC=97=AC?= =?UTF-8?q?=EB=A7=8C)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/content/AudioContent.kt | 8 ++++++++ .../co/vividnext/sodalive/content/AudioContentService.kt | 1 + .../sodalive/content/CreateAudioContentRequest.kt | 1 + 3 files changed, 10 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt index 430f3d7..2b6c768 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt @@ -9,6 +9,8 @@ import java.time.LocalDateTime import javax.persistence.CascadeType import javax.persistence.Column import javax.persistence.Entity +import javax.persistence.EnumType +import javax.persistence.Enumerated import javax.persistence.FetchType import javax.persistence.JoinColumn import javax.persistence.ManyToOne @@ -16,6 +18,10 @@ import javax.persistence.OneToMany import javax.persistence.OneToOne import javax.persistence.Table +enum class PurchaseOption { + BOTH, BUY_ONLY, RENT_ONLY +} + enum class SortType { NEWEST, PRICE_HIGH, PRICE_LOW } @@ -30,6 +36,8 @@ data class AudioContent( var releaseDate: LocalDateTime? = null, val limited: Int? = null, var remaining: Int? = null, + @Enumerated(value = EnumType.STRING) + val purchaseOption: PurchaseOption = PurchaseOption.BOTH, val isGeneratePreview: Boolean = true, var isOnlyRental: Boolean = false, var isAdult: Boolean = false, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 2b9df4a..790b549 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -183,6 +183,7 @@ class AudioContentService( limited = request.limited, remaining = request.limited, isAdult = request.isAdult, + purchaseOption = request.purchaseOption, isGeneratePreview = request.isGeneratePreview, isOnlyRental = if (request.limited != null && request.limited > 0) false else request.isOnlyRental, isCommentAvailable = request.isCommentAvailable diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt index cc1b84a..3c4e6bf 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/CreateAudioContentRequest.kt @@ -5,6 +5,7 @@ data class CreateAudioContentRequest( val detail: String, val tags: String, val price: Int, + val purchaseOption: PurchaseOption = PurchaseOption.BOTH, val limited: Int? = null, val timezone: String = "Asia/Seoul", val releaseDate: String? = null, From c46d6621ecdbdbe05f86ecb721f4edd7a20541a4 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 00:48:30 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20-=20=EA=B5=AC=EB=A7=A4=EC=98=B5=EC=85=98(=EB=AA=A8?= =?UTF-8?q?=EB=91=90,=20=EC=86=8C=EC=9E=A5=EB=A7=8C,=20=EB=8C=80=EC=97=AC?= =?UTF-8?q?=EB=A7=8C)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/content/AudioContentService.kt | 1 + .../vividnext/sodalive/content/GetAudioContentDetailResponse.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 790b549..e5f8907 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -588,6 +588,7 @@ class AudioContentService( isMosaic = audioContent.isAdult && member.auth == null, isOnlyRental = audioContent.isOnlyRental, existOrdered = isExistsAudioContent, + purchaseOption = audioContent.purchaseOption, orderType = orderType, remainingTime = remainingTime, creatorOtherContentList = creatorOtherContentList, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt index baf2cbc..d7346ef 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt @@ -23,6 +23,7 @@ data class GetAudioContentDetailResponse( val isMosaic: Boolean, val isOnlyRental: Boolean, val existOrdered: Boolean, + val purchaseOption: PurchaseOption, val orderType: OrderType?, val remainingTime: String?, val creatorOtherContentList: List, From 52ddefa6316a6a876be844ef0cd6e89af17b8a49 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 14:46:48 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20-=20=EA=B5=AC=EB=A7=A4=EC=98=B5=EC=85=98?= =?UTF-8?q?=EC=9D=B4=20RENT=5FONLY=20=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=EC=97=90=20=EC=9E=88=EB=8D=98=20isOnlyRental?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20true=20=EB=A1=9C=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/content/AudioContentService.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index e5f8907..993420c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -170,6 +170,14 @@ class AudioContentService( if (request.price in 1..4) throw SodaException("콘텐츠의 최소금액은 5캔 입니다.") + val isOnlyRental = if (request.limited != null && request.limited > 0) { + false + } else if (request.purchaseOption == PurchaseOption.RENT_ONLY) { + true + } else { + request.isOnlyRental + } + // DB에 값 추가 val audioContent = AudioContent( title = request.title, @@ -185,7 +193,7 @@ class AudioContentService( isAdult = request.isAdult, purchaseOption = request.purchaseOption, isGeneratePreview = request.isGeneratePreview, - isOnlyRental = if (request.limited != null && request.limited > 0) false else request.isOnlyRental, + isOnlyRental = isOnlyRental, isCommentAvailable = request.isCommentAvailable ) audioContent.theme = theme From 86dac7e2b44ffcecd47c08616fd0fdbb47be3bcf Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 14:50:56 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20-=20=EC=86=8C=EC=9E=A5=EB=A7=8C=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=20=EC=BD=98=ED=85=90=EC=B8=A0=EB=A5=BC=20?= =?UTF-8?q?=EB=8C=80=EC=97=AC=20=ED=95=98=EB=A0=A4=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=95=88=EB=82=B4=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/content/order/OrderService.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt index 4826816..d6c3e0e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt @@ -5,6 +5,7 @@ import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.content.AudioContent import kr.co.vividnext.sodalive.content.AudioContentRepository +import kr.co.vividnext.sodalive.content.PurchaseOption import kr.co.vividnext.sodalive.content.comment.AudioContentCommentRepository import kr.co.vividnext.sodalive.content.like.AudioContentLikeRepository import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem @@ -31,7 +32,7 @@ class OrderService( fun order(contentId: Long, orderType: OrderType, container: String, member: Member) { val content = audioContentRepository.findByIdAndActive(contentId) ?: throw SodaException("잘못된 콘텐츠 입니다\n다시 시도해 주세요.") - validateOrder(memberId = member.id!!, content = content) + validateOrder(memberId = member.id!!, content = content, orderType = orderType) val order = if (content.limited != null && content.remaining != null) { if (content.remaining!! <= 0) throw SodaException("해당 콘텐츠가 매진되었습니다.") @@ -75,11 +76,16 @@ class OrderService( return order } - private fun validateOrder(memberId: Long, content: AudioContent) { + private fun validateOrder(memberId: Long, content: AudioContent, orderType: OrderType) { if (memberId == content.member!!.id!!) throw SodaException("자신이 올린 콘텐츠는 구매할 수 없습니다.") + if (repository.isExistOrdered(memberId = memberId, contentId = content.id!!)) { throw SodaException("이미 구매한 콘텐츠 입니다.") } + + if (content.purchaseOption == PurchaseOption.BUY_ONLY && orderType == OrderType.RENTAL) { + throw SodaException("소장만 가능한 콘텐츠 입니다.\n앱 업데이트 후 구매해 주세요.") + } } fun getAudioContentOrderList( From cc695c115bf41c69da08709e67047ab764d90b98 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 14:54:53 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20-=20=EB=8C=80=EC=97=AC=EB=A7=8C=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=20=EC=BD=98=ED=85=90=EC=B8=A0=EB=A5=BC=20?= =?UTF-8?q?=EC=86=8C=EC=9E=A5=20=ED=95=98=EB=A0=A4=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=95=88=EB=82=B4=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/order/OrderService.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt index d6c3e0e..630b22a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt @@ -79,13 +79,14 @@ class OrderService( private fun validateOrder(memberId: Long, content: AudioContent, orderType: OrderType) { if (memberId == content.member!!.id!!) throw SodaException("자신이 올린 콘텐츠는 구매할 수 없습니다.") - if (repository.isExistOrdered(memberId = memberId, contentId = content.id!!)) { - throw SodaException("이미 구매한 콘텐츠 입니다.") - } + val existOrdered = repository.isExistOrdered(memberId = memberId, contentId = content.id!!) + if (existOrdered) throw SodaException("이미 구매한 콘텐츠 입니다.") - if (content.purchaseOption == PurchaseOption.BUY_ONLY && orderType == OrderType.RENTAL) { - throw SodaException("소장만 가능한 콘텐츠 입니다.\n앱 업데이트 후 구매해 주세요.") - } + val isOnlyRental = content.purchaseOption == PurchaseOption.RENT_ONLY || content.isOnlyRental + if (isOnlyRental && orderType == OrderType.KEEP) throw SodaException("대여만 가능한 콘텐츠 입니다.") + + val isOnlyBuy = content.purchaseOption == PurchaseOption.BUY_ONLY && orderType == OrderType.RENTAL + if (isOnlyBuy) throw SodaException("소장만 가능한 콘텐츠 입니다.\n앱 업데이트 후 구매해 주세요.") } fun getAudioContentOrderList( From 5820117c1a1109af1e6a2d2f1d72063ffb143459 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Nov 2024 17:15:19 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20-=20=EA=B8=B0=EC=A1=B4=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EC=99=80=EC=9D=98=20=ED=98=B8=ED=99=98=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20isOnlyRental=20=3D=3D=20true?= =?UTF-8?q?=20<=3D>=20PurchaseOption.RENT=5FONLY=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=ED=91=9C=ED=98=84=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContentService.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 993420c..4610561 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -577,6 +577,18 @@ class AudioContentService( false } + val isOnlyRental = if (audioContent.purchaseOption == PurchaseOption.RENT_ONLY) { + true + } else { + audioContent.isOnlyRental + } + + val purchaseOption = if (audioContent.isOnlyRental) { + PurchaseOption.RENT_ONLY + } else { + audioContent.purchaseOption + } + return GetAudioContentDetailResponse( contentId = audioContent.id!!, title = audioContent.title, @@ -594,9 +606,9 @@ class AudioContentService( isActivePreview = audioContent.isGeneratePreview, isAdult = audioContent.isAdult, isMosaic = audioContent.isAdult && member.auth == null, - isOnlyRental = audioContent.isOnlyRental, + isOnlyRental = isOnlyRental, existOrdered = isExistsAudioContent, - purchaseOption = audioContent.purchaseOption, + purchaseOption = purchaseOption, orderType = orderType, remainingTime = remainingTime, creatorOtherContentList = creatorOtherContentList,