From fe5af96ff7f7b0d01f7b8359b70cae49b9f7b4ca Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 30 Apr 2026 12:47:25 +0900 Subject: [PATCH] =?UTF-8?q?feat(chat-quota):=20=EC=BF=BC=ED=84=B0=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20=EA=B3=84=EC=95=BD=EA=B3=BC=20=EA=B4=91?= =?UTF-8?q?=EA=B3=A0=20ad=20unit=20=EA=B5=AC=EC=84=B1=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 ++ .../sodalive/chat/talk/room/ChatRepository.kt | 28 +++++++++++++------ .../room/quota/ChatQuotaPurchaseRequest.kt | 19 ++++++++++++- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7e8d0a58..2bf5997e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -87,6 +87,7 @@ android { buildConfigField 'String', 'YANDEX_INLINE_BANNER_CHARACTER_TAB_AD_UNIT_ID', '"R-M-19140295-13"' buildConfigField 'String', 'YANDEX_INLINE_BANNER_ORIGINAL_TAB_AD_UNIT_ID', '"R-M-19140295-14"' buildConfigField 'String', 'YANDEX_INLINE_BANNER_TALK_TAB_AD_UNIT_ID', '"R-M-19140295-15"' + buildConfigField 'String', 'YANDEX_REWARDED_CHAT_QUOTA_AD_UNIT_ID', '"R-M-19140295-16"' buildConfigField 'String', 'BASE_URL', '"https://api.sodalive.net"' buildConfigField 'String', 'AGORA_API_BASE_URL', '"https://api.agora.io/api/speech-to-speech-translation/v2/"' buildConfigField 'String', 'AGORA_CUSTOMER_ID', '"de5dd9ea151f4a43ba1ad8411817b169"' @@ -130,6 +131,7 @@ android { buildConfigField 'String', 'YANDEX_INLINE_BANNER_CHARACTER_TAB_AD_UNIT_ID', '"R-M-19140297-13"' buildConfigField 'String', 'YANDEX_INLINE_BANNER_ORIGINAL_TAB_AD_UNIT_ID', '"R-M-19140297-14"' buildConfigField 'String', 'YANDEX_INLINE_BANNER_TALK_TAB_AD_UNIT_ID', '"R-M-19140297-15"' + buildConfigField 'String', 'YANDEX_REWARDED_CHAT_QUOTA_AD_UNIT_ID', '"R-M-19140297-16"' buildConfigField 'String', 'BASE_URL', '"https://test-api.sodalive.net"' buildConfigField 'String', 'AGORA_API_BASE_URL', '"https://api.agora.io/api/speech-to-speech-translation/v2/"' buildConfigField 'String', 'AGORA_CUSTOMER_ID', '"de5dd9ea151f4a43ba1ad8411817b169"' diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRepository.kt index b74bafe6..9f79487e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRepository.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRepository.kt @@ -13,6 +13,8 @@ import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.chat.talk.TalkApi import kr.co.vividnext.sodalive.chat.talk.room.db.ChatMessageDao import kr.co.vividnext.sodalive.chat.talk.room.quota.ChatQuotaPurchaseRequest +import kr.co.vividnext.sodalive.chat.talk.room.quota.ChatRoomQuotaCanOption +import kr.co.vividnext.sodalive.chat.talk.room.quota.ChatRoomQuotaChargeType import kr.co.vividnext.sodalive.chat.talk.room.quota.ChatQuotaStatusResponse import kr.co.vividnext.sodalive.common.ApiResponse import java.util.concurrent.Callable @@ -73,10 +75,18 @@ class ChatRepository( } /** 쿼터 구매 */ - fun purchaseChatQuota(roomId: Long, token: String): Single { + fun purchaseChatQuota( + roomId: Long, + token: String, + chargeType: ChatRoomQuotaChargeType, + canOption: ChatRoomQuotaCanOption? = null + ): Single { return talkApi.purchaseChatQuota( roomId = roomId, - request = ChatQuotaPurchaseRequest(), + request = ChatQuotaPurchaseRequest( + chargeType = chargeType, + canOption = canOption + ), authHeader = token ) .subscribeOn(Schedulers.io()) @@ -87,12 +97,14 @@ class ChatRepository( * 로컬에서 최근 20개 메시지 조회 */ fun getRecentMessagesFromLocal(roomId: Long): Single> { - return Single.fromCallable(Callable { - runCatching { - val entities = kotlinx.coroutines.runBlocking { chatDao.getRecentMessages(roomId) } - entities.map { it.toDomain() } - }.getOrDefault(emptyList()) - }).subscribeOn(Schedulers.io()) + return Single.fromCallable( + Callable { + runCatching { + val entities = kotlinx.coroutines.runBlocking { chatDao.getRecentMessages(roomId) } + entities.map { it.toDomain() } + }.getOrDefault(emptyList()) + } + ).subscribeOn(Schedulers.io()) } /** diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/quota/ChatQuotaPurchaseRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/quota/ChatQuotaPurchaseRequest.kt index 3820c8e2..2cc1c57d 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/quota/ChatQuotaPurchaseRequest.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/quota/ChatQuotaPurchaseRequest.kt @@ -5,5 +5,22 @@ import com.google.gson.annotations.SerializedName @Keep data class ChatQuotaPurchaseRequest( - @SerializedName("container") val container: String = "aos" + @SerializedName("container") val container: String = "aos", + @SerializedName("chargeType") val chargeType: ChatRoomQuotaChargeType, + @SerializedName("canOption") val canOption: ChatRoomQuotaCanOption? = null ) + +@Keep +enum class ChatRoomQuotaChargeType { + CAN, + AD +} + +@Keep +enum class ChatRoomQuotaCanOption( + val needCan: Int, + val quota: Int +) { + CAN_10(10, 15), + CAN_20(20, 40) +}