Separate Hilt and Koin into their own product flavours
This commit is contained in:
parent
682fd71c2d
commit
1b8d0e836c
56 changed files with 496 additions and 72 deletions
|
|
@ -18,6 +18,8 @@ dependencies {
|
|||
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
|
||||
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
|
||||
api "io.insert-koin:koin-core:$koin_version"
|
||||
implementation "com.google.dagger:hilt-core:$hilt_version"
|
||||
kapt "com.google.dagger:hilt-compiler:$hilt_version"
|
||||
|
||||
api project(":model")
|
||||
|
||||
|
|
|
|||
|
|
@ -7,8 +7,9 @@ import org.fnives.test.showcase.network.shared.ExceptionWrapper
|
|||
import org.fnives.test.showcase.network.shared.exceptions.ParsingException
|
||||
import retrofit2.HttpException
|
||||
import retrofit2.Response
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class LoginErrorConverter {
|
||||
internal class LoginErrorConverter @Inject constructor() {
|
||||
|
||||
@Throws(ParsingException::class)
|
||||
suspend fun invoke(request: suspend () -> Response<LoginResponse>): LoginStatusResponses =
|
||||
|
|
|
|||
|
|
@ -7,8 +7,9 @@ import org.fnives.test.showcase.network.auth.model.LoginStatusResponses
|
|||
import org.fnives.test.showcase.network.shared.ExceptionWrapper
|
||||
import org.fnives.test.showcase.network.shared.exceptions.NetworkException
|
||||
import org.fnives.test.showcase.network.shared.exceptions.ParsingException
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class LoginRemoteSourceImpl constructor(
|
||||
internal class LoginRemoteSourceImpl @Inject constructor(
|
||||
private val loginService: LoginService,
|
||||
private val loginErrorConverter: LoginErrorConverter
|
||||
) : LoginRemoteSource {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@ import org.fnives.test.showcase.model.content.Content
|
|||
import org.fnives.test.showcase.model.content.ContentId
|
||||
import org.fnives.test.showcase.model.content.ImageUrl
|
||||
import org.fnives.test.showcase.network.shared.ExceptionWrapper
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class ContentRemoteSourceImpl(private val contentService: ContentService) : ContentRemoteSource {
|
||||
internal class ContentRemoteSourceImpl @Inject constructor(private val contentService: ContentService) : ContentRemoteSource {
|
||||
|
||||
override suspend fun get(): List<Content> =
|
||||
ExceptionWrapper.wrap {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
package org.fnives.test.showcase.network.di.hilt
|
||||
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import okhttp3.OkHttpClient
|
||||
import org.fnives.test.showcase.network.auth.LoginRemoteSource
|
||||
import org.fnives.test.showcase.network.auth.LoginRemoteSourceImpl
|
||||
import org.fnives.test.showcase.network.auth.LoginService
|
||||
import org.fnives.test.showcase.network.content.ContentRemoteSource
|
||||
import org.fnives.test.showcase.network.content.ContentRemoteSourceImpl
|
||||
import org.fnives.test.showcase.network.content.ContentService
|
||||
import org.fnives.test.showcase.network.di.setupLogging
|
||||
import org.fnives.test.showcase.network.session.AuthenticationHeaderInterceptor
|
||||
import org.fnives.test.showcase.network.session.AuthenticationHeaderUtils
|
||||
import org.fnives.test.showcase.network.session.SessionAuthenticator
|
||||
import org.fnives.test.showcase.network.shared.PlatformInterceptor
|
||||
import retrofit2.Converter
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.converter.moshi.MoshiConverterFactory
|
||||
import javax.inject.Singleton
|
||||
|
||||
@InstallIn(SingletonComponent::class)
|
||||
@Module
|
||||
object HiltNetworkModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideConverterFactory(): Converter.Factory = MoshiConverterFactory.create()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@SessionLessQualifier
|
||||
fun provideSessionLessOkHttpClient(enableLogging: Boolean) =
|
||||
OkHttpClient.Builder()
|
||||
.addInterceptor(PlatformInterceptor())
|
||||
.setupLogging(enableLogging)
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@SessionLessQualifier
|
||||
fun provideSessionLessRetrofit(
|
||||
baseUrl: String,
|
||||
converterFactory: Converter.Factory,
|
||||
@SessionLessQualifier okHttpClient: OkHttpClient
|
||||
) = Retrofit.Builder()
|
||||
.baseUrl(baseUrl)
|
||||
.addConverterFactory(converterFactory)
|
||||
.client(okHttpClient)
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@SessionQualifier
|
||||
internal fun provideSessionOkHttpClient(
|
||||
@SessionLessQualifier okHttpClient: OkHttpClient,
|
||||
sessionAuthenticator: SessionAuthenticator,
|
||||
authenticationHeaderUtils: AuthenticationHeaderUtils
|
||||
) =
|
||||
okHttpClient
|
||||
.newBuilder()
|
||||
.authenticator(sessionAuthenticator)
|
||||
.addInterceptor(AuthenticationHeaderInterceptor(authenticationHeaderUtils))
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@SessionQualifier
|
||||
fun provideSessionRetrofit(
|
||||
@SessionLessQualifier retrofit: Retrofit,
|
||||
@SessionQualifier okHttpClient: OkHttpClient
|
||||
) = retrofit.newBuilder()
|
||||
.client(okHttpClient)
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
internal fun bindContentRemoteSource(
|
||||
contentRemoteSourceImpl: ContentRemoteSourceImpl
|
||||
): ContentRemoteSource = contentRemoteSourceImpl
|
||||
|
||||
@Provides
|
||||
internal fun bindLoginRemoteSource(
|
||||
loginRemoteSource: LoginRemoteSourceImpl
|
||||
): LoginRemoteSource = loginRemoteSource
|
||||
|
||||
@Provides
|
||||
internal fun provideLoginService(@SessionLessQualifier retrofit: Retrofit): LoginService =
|
||||
retrofit.create(LoginService::class.java)
|
||||
|
||||
@Provides
|
||||
internal fun provideContentService(@SessionQualifier retrofit: Retrofit): ContentService =
|
||||
retrofit.create(ContentService::class.java)
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package org.fnives.test.showcase.network.di.hilt
|
||||
|
||||
import javax.inject.Qualifier
|
||||
|
||||
@Qualifier
|
||||
annotation class SessionLessQualifier
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package org.fnives.test.showcase.network.di.hilt
|
||||
|
||||
import javax.inject.Qualifier
|
||||
|
||||
@Qualifier
|
||||
annotation class SessionQualifier
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.fnives.test.showcase.network.di
|
||||
package org.fnives.test.showcase.network.di.koin
|
||||
|
||||
import okhttp3.OkHttpClient
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
|
|
@ -9,6 +9,7 @@ import org.fnives.test.showcase.network.auth.LoginService
|
|||
import org.fnives.test.showcase.network.content.ContentRemoteSource
|
||||
import org.fnives.test.showcase.network.content.ContentRemoteSourceImpl
|
||||
import org.fnives.test.showcase.network.content.ContentService
|
||||
import org.fnives.test.showcase.network.di.setupLogging
|
||||
import org.fnives.test.showcase.network.session.AuthenticationHeaderInterceptor
|
||||
import org.fnives.test.showcase.network.session.AuthenticationHeaderUtils
|
||||
import org.fnives.test.showcase.network.session.NetworkSessionExpirationListener
|
||||
|
|
@ -1,8 +1,9 @@
|
|||
package org.fnives.test.showcase.network.session
|
||||
|
||||
import okhttp3.Request
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class AuthenticationHeaderUtils(private val networkSessionLocalStorage: NetworkSessionLocalStorage) {
|
||||
internal class AuthenticationHeaderUtils @Inject constructor(private val networkSessionLocalStorage: NetworkSessionLocalStorage) {
|
||||
|
||||
fun hasToken(okhttpRequest: Request): Boolean =
|
||||
okhttpRequest.header(KEY) == networkSessionLocalStorage.session?.accessToken
|
||||
|
|
|
|||
|
|
@ -6,8 +6,9 @@ import okhttp3.Request
|
|||
import okhttp3.Response
|
||||
import okhttp3.Route
|
||||
import org.fnives.test.showcase.network.auth.LoginRemoteSourceImpl
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class SessionAuthenticator(
|
||||
internal class SessionAuthenticator @Inject constructor(
|
||||
private val networkSessionLocalStorage: NetworkSessionLocalStorage,
|
||||
private val loginRemoteSource: LoginRemoteSourceImpl,
|
||||
private val authenticationHeaderUtils: AuthenticationHeaderUtils,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package org.fnives.test.showcase.network.auth
|
|||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
import org.fnives.test.showcase.network.di.createNetworkModules
|
||||
import org.fnives.test.showcase.network.di.koin.createNetworkModules
|
||||
import org.fnives.test.showcase.network.mockserver.ContentData
|
||||
import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario
|
||||
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import kotlinx.coroutines.runBlocking
|
|||
import org.fnives.test.showcase.model.auth.LoginCredentials
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
import org.fnives.test.showcase.network.auth.model.LoginStatusResponses
|
||||
import org.fnives.test.showcase.network.di.createNetworkModules
|
||||
import org.fnives.test.showcase.network.di.koin.createNetworkModules
|
||||
import org.fnives.test.showcase.network.mockserver.ContentData
|
||||
import org.fnives.test.showcase.network.mockserver.ContentData.createExpectedLoginRequestJson
|
||||
import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package org.fnives.test.showcase.network.content
|
|||
import kotlinx.coroutines.runBlocking
|
||||
import okhttp3.mockwebserver.MockWebServer
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
import org.fnives.test.showcase.network.di.createNetworkModules
|
||||
import org.fnives.test.showcase.network.di.koin.createNetworkModules
|
||||
import org.fnives.test.showcase.network.session.NetworkSessionExpirationListener
|
||||
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
|
||||
import org.junit.jupiter.api.AfterEach
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package org.fnives.test.showcase.network.content
|
|||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
import org.fnives.test.showcase.network.di.createNetworkModules
|
||||
import org.fnives.test.showcase.network.di.koin.createNetworkModules
|
||||
import org.fnives.test.showcase.network.mockserver.ContentData
|
||||
import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScenario
|
||||
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package org.fnives.test.showcase.network.content
|
|||
import kotlinx.coroutines.runBlocking
|
||||
import org.fnives.test.showcase.model.network.BaseUrl
|
||||
import org.fnives.test.showcase.model.session.Session
|
||||
import org.fnives.test.showcase.network.di.createNetworkModules
|
||||
import org.fnives.test.showcase.network.di.koin.createNetworkModules
|
||||
import org.fnives.test.showcase.network.mockserver.ContentData
|
||||
import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScenario
|
||||
import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue