checkpoint before checking out feature/account-managed-gateway
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.osglab.account.config
|
||||
|
||||
import com.osglab.account.features.storekit.domain.StoreKitProduct
|
||||
import io.ktor.server.config.ApplicationConfig
|
||||
import java.net.URI
|
||||
import java.util.Base64
|
||||
@@ -16,6 +17,7 @@ data class AppConfig(
|
||||
val antiAbuse: AntiAbuseConfig,
|
||||
val apple: AppleConfig,
|
||||
val credits: CreditsConfig,
|
||||
val storeKit: StoreKitConfig = StoreKitConfig(),
|
||||
val providers: ProvidersConfig,
|
||||
val integrity: IntegrityConfig,
|
||||
val admin: AdminConfig = AdminConfig(),
|
||||
@@ -76,10 +78,32 @@ data class AppConfig(
|
||||
)
|
||||
val credits = CreditsConfig(
|
||||
signupTrial = config.positiveLong("app.credits.signupTrial", 1_000),
|
||||
referralInviter = config.positiveLong("app.credits.referralInviter", 3_000),
|
||||
referralInvitee = config.positiveLong("app.credits.referralInvitee", 3_000),
|
||||
referralInviter = config.positiveLong("app.credits.referralInviter", 1_000),
|
||||
referralInvitee = config.positiveLong("app.credits.referralInvitee", 1_000),
|
||||
referralBindingDays = config.positiveLong("app.credits.referralBindingDays", 7),
|
||||
)
|
||||
val storeKitEnabled = config.booleanOrDefault("app.storeKit.enabled", false)
|
||||
val storeKitAppAppleId = config.optionalValue("app.storeKit.appAppleId")?.let { raw ->
|
||||
raw.toLongOrNull()?.takeIf { it > 0 }
|
||||
?: throw ConfigValidationException("app.storeKit.appAppleId must be positive")
|
||||
}
|
||||
val storeKit = StoreKitConfig(
|
||||
enabled = storeKitEnabled,
|
||||
bundleId = config.valueOrDefault("app.storeKit.bundleId", apple.clientId),
|
||||
appAppleId = storeKitAppAppleId,
|
||||
products = config.storeKitProducts("app.storeKit.products"),
|
||||
)
|
||||
if (storeKitEnabled) {
|
||||
require(storeKit.bundleId == apple.clientId) {
|
||||
"app.storeKit.bundleId must match app.apple.clientId"
|
||||
}
|
||||
require(storeKit.appAppleId != null) {
|
||||
"app.storeKit.appAppleId is required when StoreKit is enabled"
|
||||
}
|
||||
require(storeKit.products.isNotEmpty()) {
|
||||
"app.storeKit.products is required when StoreKit is enabled"
|
||||
}
|
||||
}
|
||||
val providers = ProvidersConfig(
|
||||
volcengine = VolcengineConfig(
|
||||
endpoint = config.valueOrDefault(
|
||||
@@ -294,6 +318,7 @@ data class AppConfig(
|
||||
antiAbuse = antiAbuse,
|
||||
apple = apple,
|
||||
credits = credits,
|
||||
storeKit = storeKit,
|
||||
providers = providers,
|
||||
integrity = integrity,
|
||||
admin = admin,
|
||||
@@ -359,6 +384,13 @@ data class CreditsConfig(
|
||||
val referralBindingDays: Long,
|
||||
)
|
||||
|
||||
data class StoreKitConfig(
|
||||
val enabled: Boolean = false,
|
||||
val bundleId: String = "com.osgkeyboard.ios",
|
||||
val appAppleId: Long? = null,
|
||||
val products: List<StoreKitProduct> = emptyList(),
|
||||
)
|
||||
|
||||
data class ProvidersConfig(
|
||||
val volcengine: VolcengineConfig,
|
||||
val deepSeek: DeepSeekConfig,
|
||||
@@ -492,6 +524,24 @@ private fun ApplicationConfig.positiveLong(path: String, default: Long): Long =
|
||||
?: throw ConfigValidationException("$path must be a positive integer")
|
||||
} ?: default
|
||||
|
||||
private fun ApplicationConfig.storeKitProducts(path: String): List<StoreKitProduct> {
|
||||
val raw = optionalValue(path) ?: return emptyList()
|
||||
val products = raw.split(',').map { entry ->
|
||||
val parts = entry.split(':', limit = 2).map(String::trim)
|
||||
if (parts.size != 2) {
|
||||
throw ConfigValidationException("$path must use productId:credits entries")
|
||||
}
|
||||
val credits = parts[1].toLongOrNull()?.takeIf { it > 0 }
|
||||
?: throw ConfigValidationException("$path credits must be positive integers")
|
||||
runCatching { StoreKitProduct(productId = parts[0], credits = credits) }
|
||||
.getOrElse { throw ConfigValidationException("$path contains an invalid product", it) }
|
||||
}
|
||||
if (products.map(StoreKitProduct::productId).distinct().size != products.size) {
|
||||
throw ConfigValidationException("$path contains duplicate product IDs")
|
||||
}
|
||||
return products
|
||||
}
|
||||
|
||||
private fun ApplicationConfig.boolean(path: String): Boolean =
|
||||
required(path).let {
|
||||
when (it.lowercase()) {
|
||||
|
||||
Reference in New Issue
Block a user