This commit is contained in:
2026-02-12 16:11:16 +03:00
parent 0ea2f64d0a
commit d157fd921e
13 changed files with 97 additions and 40 deletions

View File

@@ -48,6 +48,4 @@ dependencies {
api(libs.moshi)
api(libs.moshiKotlin)
api(libs.retrofitMoshi)
api(libs.retrofit.simplexml)
}

View File

@@ -1,4 +1,24 @@
package ru.fincode.tsudesk.core.network
class NetworkCall {
}
import retrofit2.HttpException
import ru.fincode.tsudesk.core.network.model.NetworkError
import ru.fincode.tsudesk.core.network.model.NetworkResult
import java.io.IOException
import java.net.SocketTimeoutException
suspend inline fun <T> safeApiCall(
crossinline block: suspend () -> T
): NetworkResult<T> {
return try {
NetworkResult.Success(block())
} catch (t: Throwable) {
NetworkResult.Error(t.toNetworkError())
}
}
fun Throwable.toNetworkError(): NetworkError = when (this) {
is SocketTimeoutException -> NetworkError.Timeout
is IOException -> NetworkError.NoInternet
is HttpException -> NetworkError.Http(code())
else -> NetworkError.Unknown(this)
}

View File

@@ -9,12 +9,13 @@ import retrofit2.Retrofit
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
import okhttp3.logging.HttpLoggingInterceptor
import ru.fincode.tsudesk.core.network.interceptor.DebugInterceptor
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
private const val TIMEOUT_SEC = 30L
private const val TIMEOUT = 30L
val logging = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
@@ -23,9 +24,9 @@ object NetworkModule {
@Singleton
fun provideOkHttpClient(): OkHttpClient =
OkHttpClient.Builder()
.connectTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
.readTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.addInterceptor(DebugInterceptor())
.build()

View File

@@ -1,2 +1,20 @@
package ru.fincode.tsudesk.core.network.interceptor
package ru.fincode.tsudesk.core.network.interceptor
import android.util.Log
import okhttp3.Interceptor
import okhttp3.Response
private const val TAG = "NETWORK_DEBUG"
class DebugInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
Log.d(TAG, "URL: ${request.url}")
Log.d(TAG, "Method: ${request.method}")
Log.d(TAG, "Headers: ${request.headers}")
return chain.proceed(request)
}
}

View File

@@ -1,2 +1,8 @@
package ru.fincode.tsudesk.core.network.model
package ru.fincode.tsudesk.core.network.model
sealed class NetworkError {
object NoInternet : NetworkError()
object Timeout : NetworkError()
data class Http(val code: Int) : NetworkError()
data class Unknown(val throwable: Throwable) : NetworkError()
}

View File

@@ -1,2 +1,6 @@
package ru.fincode.tsudesk.core.network.model
package ru.fincode.tsudesk.core.network.model
sealed class NetworkResult<out T> {
data class Success<T>(val data: T) : NetworkResult<T>()
data class Error(val error: NetworkError) : NetworkResult<Nothing>()
}

View File

@@ -1,4 +1,8 @@
package ru.fincode.tsudesk.core.network.model
class NetworkResultExt {
}
inline fun <T, R> NetworkResult<T>.map(
transform: (T) -> R
): NetworkResult<R> = when (this) {
is NetworkResult.Success -> NetworkResult.Success(transform(data))
is NetworkResult.Error -> this
}