Skip to content

Commit

Permalink
Merge pull request #90 from Next-Room/feature/NextRoom-Android-89
Browse files Browse the repository at this point in the history
#89 feat: 구독 기능 구현
  • Loading branch information
juhwankim-dev authored Sep 1, 2024
2 parents efd7774 + f566ccd commit 51b5996
Show file tree
Hide file tree
Showing 37 changed files with 934 additions and 758 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.nextroom.nextroom.data.datasource

import com.nextroom.nextroom.data.network.ApiService
import com.nextroom.nextroom.domain.model.Mypage
import com.nextroom.nextroom.domain.model.Result
import com.nextroom.nextroom.domain.model.Ticket
import com.nextroom.nextroom.domain.model.UserSubscribeStatus
import com.nextroom.nextroom.domain.model.UserSubscription
import com.nextroom.nextroom.domain.model.mapOnSuccess
import javax.inject.Inject

Expand All @@ -17,7 +17,7 @@ class SubscriptionDataSource @Inject constructor(
}
}

suspend fun getUserSubscription(): Result<UserSubscription> {
suspend fun getUserSubscription(): Result<Mypage> {
return apiService.getMypageInfo().mapOnSuccess { it.data.toDomain() }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package com.nextroom.nextroom.data.network.response

import com.google.gson.annotations.SerializedName
import com.nextroom.nextroom.domain.model.SubscribeItem
import com.nextroom.nextroom.domain.model.UserSubscription
import com.nextroom.nextroom.domain.model.Mypage
import com.nextroom.nextroom.domain.model.SubscribeStatus

// TODO JH: 이름 변경 고려해보기
data class MypageDto(
@SerializedName("id") val id: String,
@SerializedName("subStatus") val subsName: String, // LARGE
@SerializedName("createdAt") val createdAt: String, // 2023-10-24 02:29:57
@SerializedName("expiryDate") val expiryDate: String, // 2023-11-23
@SerializedName("name") val name: String, // xx이스케이프 xx점
@SerializedName("status") val status: String, // FREE or SUBSCRIPTION
@SerializedName("startDate") val startDate: String?, // 2023-10-24 02:29:57
@SerializedName("expiryDate") val expiryDate: String?, // 2023-11-23
@SerializedName("createdAt") val createdAt: String, // 2023-11-23
) {
fun toDomain(): UserSubscription {
return UserSubscription(
type = SubscribeItem(id = id, name = subsName),
createdAt = createdAt,
fun toDomain(): Mypage {
return Mypage(
id = id,
name = name,
status = SubscribeStatus.ofValue(status),
startDate = startDate,
expiryDate = expiryDate,
createdAt = createdAt,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,26 @@ import com.nextroom.nextroom.domain.model.Ticket

data class TicketDto(
@SerializedName("id") val id: String,
@SerializedName("plan") val plan: String,
@SerializedName("subscriptionProductId") val subscriptionProductId: String,
@SerializedName("planId") val planId: String,
@SerializedName("productName") val productName: String,
@SerializedName("description") val description: String,
@SerializedName("subDescription") val subDescription: String,
@SerializedName("originPrice") val originPrice: Int?,
@SerializedName("sellPrice") val sellPrice: Int,
@SerializedName("discountRate") val discountRate: Int,
) {
fun toDomain(): Ticket {
return Ticket(
id = id,
plan = plan,
subscriptionProductId = subscriptionProductId,
planId = planId,
productName = productName,
description = description,
subDescription = subDescription,
originPrice = originPrice,
sellPrice = sellPrice,
discountRate = discountRate,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ data class UserSubscriptionStatusDto(
) {
fun toDomain(): UserSubscribeStatus {
val subsStatus = when (status.trim().uppercase()) {
"FREE" -> SubscribeStatus.Free
"HOLD" -> SubscribeStatus.Hold
"EXPIRATION" -> SubscribeStatus.Expiration
"SUBSCRIPTION" -> SubscribeStatus.Subscription
"SUBSCRIPTION_EXPIRATION" -> SubscribeStatus.SubscriptionExpiration
else -> SubscribeStatus.None
// "FREE" -> SubscribeStatus.Free
// "HOLD" -> SubscribeStatus.Hold
// "EXPIRATION" -> SubscribeStatus.Expiration
// "SUBSCRIPTION" -> SubscribeStatus.Subscription
// "SUBSCRIPTION_EXPIRATION" -> SubscribeStatus.SubscriptionExpiration
// else -> SubscribeStatus.None
else -> SubscribeStatus.Default
}
return UserSubscribeStatus(
subscriptionId = id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import com.nextroom.nextroom.data.datasource.SubscriptionDataSource
import com.nextroom.nextroom.data.datasource.TokenDataSource
import com.nextroom.nextroom.data.datasource.UserDataSource
import com.nextroom.nextroom.domain.model.LoginInfo
import com.nextroom.nextroom.domain.model.Mypage
import com.nextroom.nextroom.domain.model.Result
import com.nextroom.nextroom.domain.model.UserSubscribeStatus
import com.nextroom.nextroom.domain.model.UserSubscription
import com.nextroom.nextroom.domain.model.onSuccess
import com.nextroom.nextroom.domain.repository.AdminRepository
import kotlinx.coroutines.flow.Flow
Expand All @@ -26,6 +26,9 @@ class AdminRepositoryImpl @Inject constructor(

override val shopName: Flow<String> = settingDataSource.shopName

// TODO: 구독 서비스 정규 오픈시 삭제
var isDeveloperMode = false

override suspend fun login(adminCode: String, password: String): Result<LoginInfo> {
return authDataSource.login(adminCode, password).onSuccess {
settingDataSource.saveAdminInfo(adminCode = it.adminCode, shopName = it.shopName)
Expand All @@ -51,7 +54,14 @@ class AdminRepositoryImpl @Inject constructor(
return subscriptionDataSource.getUserSubscriptionStatus()
}

override suspend fun getUserSubscribe(): Result<UserSubscription> {
override suspend fun getUserSubscribe(): Result<Mypage> {
return subscriptionDataSource.getUserSubscription()
}

// TODO: 구독 서비스 정규 오픈시 삭제
override fun setDeveloperMode() {
isDeveloperMode = true
}

override fun getIsDeveloperMode() = isDeveloperMode
}
10 changes: 10 additions & 0 deletions domain/src/main/java/com/nextroom/nextroom/domain/model/Mypage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.nextroom.nextroom.domain.model

data class Mypage(
val id: String,
val name: String,
val status: SubscribeStatus,
val startDate: String?,
val expiryDate: String?,
val createdAt: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,22 @@ data class SubscribeItem(
*/
data class UserSubscribeStatus(
val subscriptionId: Long = 0L,
val subscribeStatus: SubscribeStatus = SubscribeStatus.None,
val subscribeStatus: SubscribeStatus = SubscribeStatus.Default,
val expiryDate: String = "",
val createdAt: String = "",
)

/**
* @property None 아무것도 아닌 상태 (현재 사용하지 않음)
* @property Free 무료 체험
* @property Hold 유예 기간 (무료 체험 끝)
* @property Expiration 유예 기간 만료
* @property Subscription 구독
* @property SubscriptionExpiration 구독 만료
* @property Default 아무것도 구독하지 않은 상태
* @property Subscribed 구독 중 상태
*/
enum class SubscribeStatus {
None, Free, Hold, Expiration, Subscription, SubscriptionExpiration
}
enum class SubscribeStatus(val value: String) {
Default("FREE"),
Subscribed("SUBSCRIPTION");

companion object {
fun ofValue(value: String): SubscribeStatus {
return entries.find { it.value.uppercase() == value.uppercase() } ?: Default
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ package com.nextroom.nextroom.domain.model

data class Ticket(
val id: String,
val plan: String,
val subscriptionProductId: String,
val planId: String,
val productName: String,
val description: String,
val subDescription: String,
val originPrice: Int?,
val sellPrice: Int,
val discountRate: Int,
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.nextroom.nextroom.domain.repository

import com.nextroom.nextroom.domain.model.LoginInfo
import com.nextroom.nextroom.domain.model.Mypage
import com.nextroom.nextroom.domain.model.Result
import com.nextroom.nextroom.domain.model.UserSubscribeStatus
import com.nextroom.nextroom.domain.model.UserSubscription
import kotlinx.coroutines.flow.Flow

interface AdminRepository {
Expand All @@ -19,5 +19,9 @@ interface AdminRepository {
suspend fun resign(): Result<Unit>
suspend fun verifyAdminCode(code: String): Boolean
suspend fun getUserSubscribeStatus(): Result<UserSubscribeStatus>
suspend fun getUserSubscribe(): Result<UserSubscription>
suspend fun getUserSubscribe(): Result<Mypage>

// TODO: 구독 서비스 정규 오픈시 삭제
fun setDeveloperMode()
fun getIsDeveloperMode(): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.nextroom.nextroom.presentation.common

import android.content.Context
import android.util.AttributeSet
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ProgressBar
import androidx.core.content.ContextCompat

class NRLoading @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
) : FrameLayout(context, attrs, defStyleAttr) {

init {
// 레이아웃의 크기를 부모의 크기로 설정
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)

// 배경을 투명하게 설정
setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent))

// ProgressBar를 가운데에 배치
val progressBar = ProgressBar(context).apply {
layoutParams = LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
).apply {
// 가운데 정렬
gravity = android.view.Gravity.CENTER
}
}

// 로딩중에 하위 뷰 터치 막기
setOnTouchListener { _, _ ->
true
}

// ProgressBar를 이 뷰에 추가
addView(progressBar)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.nextroom.nextroom.presentation.ui

object Constants {
const val MINI_PRODUCT = "mini_subscription"
const val MEDIUM_PRODUCT = "medium_subscription"
const val LARGE_PRODUCT = "large_subscription"
const val MEMBERSHIP_PRODUCT = "membership_subscription"
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ import com.nextroom.nextroom.presentation.common.NRDialog
import com.nextroom.nextroom.presentation.databinding.ActivityMainBinding
import com.nextroom.nextroom.presentation.extension.repeatOn
import com.nextroom.nextroom.presentation.extension.repeatOnStarted
import com.nextroom.nextroom.presentation.ui.billing.BillingViewModel
import com.nextroom.nextroom.presentation.util.BillingClientLifecycle
import com.nextroom.nextroom.presentation.util.WindowInsetsManager
import com.nextroom.nextroom.presentation.util.WindowInsetsManagerImpl
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity :
Expand All @@ -26,10 +29,10 @@ class MainActivity :
private lateinit var binding: ActivityMainBinding

private val viewModel: MainViewModel by viewModels()
// private val billingViewModel: BillingViewModel by viewModels()
private val billingViewModel: BillingViewModel by viewModels()

// @Inject
// lateinit var billingClientLifecycle: BillingClientLifecycle
@Inject
lateinit var billingClientLifecycle: BillingClientLifecycle

override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge(
Expand All @@ -42,7 +45,7 @@ class MainActivity :
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

// lifecycle.addObserver(billingClientLifecycle)
lifecycle.addObserver(billingClientLifecycle)

repeatOnStarted {
viewModel.event.collect(::observe)
Expand All @@ -52,11 +55,11 @@ class MainActivity :
if (!loggedIn) viewModel.logout()
}
}
// repeatOnStarted {
// billingViewModel.buyEvent.collect {
// billingClientLifecycle.launchBillingFlow(this@MainActivity, it)
// }
// }
repeatOnStarted {
billingViewModel.buyEvent.collect {
billingClientLifecycle.launchBillingFlow(this@MainActivity, it)
}
}
}

private fun observe(event: MainEvent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@ sealed interface AdminMainEvent {
data object NetworkError : AdminMainEvent
data object UnknownError : AdminMainEvent
data class ClientError(val message: String) : AdminMainEvent
data object OnResign : AdminMainEvent
}
Loading

0 comments on commit 51b5996

Please sign in to comment.