Приложение

This commit is contained in:
Халимов Рустам
2026-04-14 01:15:54 +03:00
parent 8399d32490
commit 1fb1be47dd
126 changed files with 6145 additions and 0 deletions
@@ -0,0 +1,22 @@
package core.network
import core.security.TokenManager
import okhttp3.Interceptor
import okhttp3.Response
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class AuthInterceptor @Inject constructor(
private val tokenManager: TokenManager
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val token = tokenManager.getToken()
val request = chain.request().newBuilder().apply {
token?.let {
addHeader("Authorization", "Bearer $it")
}
}.build()
return chain.proceed(request)
}
}
@@ -0,0 +1,46 @@
package core.network
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.Response
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class DynamicBaseUrlInterceptor @Inject constructor(
private val serverConfig: ServerConfig
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val newBaseUrlString = serverConfig.getBaseUrl()
val newBaseUrl = newBaseUrlString.toHttpUrlOrNull() ?: return chain.proceed(originalRequest)
val oldUrl = originalRequest.url
// Формируем новый URL.
// Retrofit-пути у нас начинаются БЕЗ слеша (например "auth/login")
// Поэтому мы просто берем путь из настроек и добавляем к нему путь запроса.
val newUrl = newBaseUrl.newBuilder().apply {
val pathSegments = oldUrl.pathSegments
// Добавляем сегменты пути запроса к базовому пути из настроек
pathSegments.forEach { segment ->
if (segment.isNotEmpty()) {
addEncodedPathSegment(segment)
}
}
// Копируем параметры запроса (query params)
for (i in 0 until oldUrl.querySize) {
addEncodedQueryParameter(
oldUrl.queryParameterName(i),
oldUrl.queryParameterValue(i)
)
}
}.build()
val newRequest = originalRequest.newBuilder()
.url(newUrl)
.build()
return chain.proceed(newRequest)
}
}
@@ -0,0 +1,49 @@
package core.network
import android.content.Context
import android.content.SharedPreferences
import com.google.gson.Gson
import core.domain.model.FeaturesConfig
import core.domain.model.ServerConfigModel
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class ServerConfig @Inject constructor(
private val context: Context,
private val gson: Gson
) {
private val prefs: SharedPreferences = context.getSharedPreferences("server_settings", Context.MODE_PRIVATE)
companion object {
const val DEFAULT_BASE_URL = "https://your-api.com/api/"
private const val KEY_BASE_URL = "base_url"
private const val KEY_CONFIG_DATA = "config_data"
}
fun getBaseUrl(): String {
return prefs.getString(KEY_BASE_URL, DEFAULT_BASE_URL) ?: DEFAULT_BASE_URL
}
fun setBaseUrl(url: String) {
val formattedUrl = if (url.endsWith("/")) url else "$url/"
prefs.edit().putString(KEY_BASE_URL, formattedUrl).apply()
}
fun saveServerConfig(config: ServerConfigModel) {
prefs.edit().putString(KEY_CONFIG_DATA, gson.toJson(config)).apply()
}
fun getServerConfig(): ServerConfigModel {
val json = prefs.getString(KEY_CONFIG_DATA, null) ?: return ServerConfigModel()
return try {
gson.fromJson(json, ServerConfigModel::class.java)
} catch (e: Exception) {
ServerConfigModel()
}
}
fun isFeatureEnabled(feature: (FeaturesConfig) -> Boolean): Boolean {
return feature(getServerConfig().features)
}
}