Skip to content

Commit dad3e5a

Browse files
Adding missing dependency injection in implementation separated in modules
1 parent faab7a2 commit dad3e5a

File tree

9 files changed

+78
-38
lines changed

9 files changed

+78
-38
lines changed

composeApp/src/androidMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.compose.runtime.Composable
77
import androidx.compose.ui.tooling.preview.Preview
8-
import com.developersbreach.kotlindictionarymultiplatform.di.appModule
8+
import com.developersbreach.kotlindictionarymultiplatform.di.appModules
99
import org.koin.android.ext.koin.androidContext
1010
import org.koin.core.context.startKoin
1111

@@ -17,7 +17,7 @@ class MainActivity : ComponentActivity() {
1717

1818
startKoin {
1919
androidContext(this@MainActivity)
20-
modules(appModule)
20+
appModules()
2121
}
2222

2323
setContent {
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package com.developersbreach.kotlindictionarymultiplatform.core.network.api
22

33
import com.developersbreach.kotlindictionarymultiplatform.Log
4-
import com.developersbreach.kotlindictionarymultiplatform.core.network.client.KtorClientProvider
54
import com.developersbreach.kotlindictionarymultiplatform.core.network.parser.GeminiJsonParser
65
import com.developersbreach.kotlindictionarymultiplatform.core.network.request.GeminiPromptBuilder
76
import com.developersbreach.kotlindictionarymultiplatform.data.detail.model.KotlinTopicDetails
7+
import io.ktor.client.HttpClient
88
import io.ktor.client.request.post
99
import io.ktor.client.request.setBody
1010
import io.ktor.client.statement.bodyAsText
1111
import io.ktor.http.ContentType
1212
import io.ktor.http.contentType
13+
import kotlinx.serialization.json.Json
1314

14-
object GeminiApiService {
15-
15+
class GeminiApiService(
16+
private val client: HttpClient,
17+
private val json: Json,
18+
) {
1619
suspend fun generateTopicDetails(
1720
topicId: String,
1821
apiKey: String,
1922
): KotlinTopicDetails {
2023
val prompt = GeminiPromptBuilder.buildRequest(topicId)
2124
val requestBody = GeminiPromptBuilder.buildRequestBody(prompt)
2225

23-
val response = KtorClientProvider.client.post(
26+
val response = client.post(
2427
"https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent?key=$apiKey",
2528
) {
2629
contentType(ContentType.Application.Json)
@@ -30,9 +33,9 @@ object GeminiApiService {
3033
val responseBody = response.bodyAsText()
3134
Log.i("GeminiRawResponse", responseBody)
3235

33-
val cleanJson = GeminiJsonParser.extractCleanJson(responseBody, KtorClientProvider.json)
36+
val cleanJson = GeminiJsonParser.extractCleanJson(responseBody, json)
3437
Log.i("CleanJson", cleanJson)
3538

36-
return KtorClientProvider.json.decodeFromString(KotlinTopicDetails.serializer(), cleanJson)
39+
return json.decodeFromString(KotlinTopicDetails.serializer(), cleanJson)
3740
}
3841
}

composeApp/src/commonMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/core/network/client/KtorClientProvider.kt

Lines changed: 0 additions & 20 deletions
This file was deleted.

composeApp/src/commonMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/data/detail/repository/DetailRepository.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import com.developersbreach.kotlindictionarymultiplatform.core.network.api.Gemin
55
import com.developersbreach.kotlindictionarymultiplatform.data.detail.model.KotlinTopicDetails
66
import com.developersbreach.kotlindictionarymultiplatform.getOpenApiKey
77

8-
class DetailRepository {
8+
class DetailRepository(
9+
private val service: GeminiApiService,
10+
) {
911

1012
suspend fun fetchTopic(
1113
topicId: String,
1214
): Either<Throwable, KotlinTopicDetails> {
1315
return Either.catch {
14-
GeminiApiService.generateTopicDetails(
16+
service.generateTopicDetails(
1517
topicId = topicId,
1618
apiKey = getOpenApiKey(),
1719
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.developersbreach.kotlindictionarymultiplatform.di
2+
3+
import com.developersbreach.kotlindictionarymultiplatform.core.network.api.GeminiApiService
4+
import org.koin.dsl.module
5+
6+
internal val apiModule = module {
7+
single {
8+
GeminiApiService(client = get(), json = get())
9+
}
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.developersbreach.kotlindictionarymultiplatform.di
2+
3+
import org.koin.core.KoinApplication
4+
5+
internal fun KoinApplication.appModules() {
6+
modules(
7+
httpClientModule,
8+
apiModule,
9+
repositoryModule,
10+
viewModelModule,
11+
)
12+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.developersbreach.kotlindictionarymultiplatform.di
2+
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
5+
import io.ktor.serialization.kotlinx.json.json
6+
import kotlinx.serialization.json.Json
7+
import org.koin.dsl.module
8+
9+
internal val httpClientModule = module {
10+
single {
11+
Json {
12+
ignoreUnknownKeys = true
13+
prettyPrint = true
14+
}
15+
}
16+
17+
single {
18+
HttpClient {
19+
install(ContentNegotiation) {
20+
json(get())
21+
}
22+
}
23+
}
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.developersbreach.kotlindictionarymultiplatform.di
2+
3+
import com.developersbreach.kotlindictionarymultiplatform.data.detail.repository.DetailRepository
4+
import com.developersbreach.kotlindictionarymultiplatform.data.topic.repository.TopicRepository
5+
import org.koin.dsl.module
6+
7+
internal val repositoryModule = module {
8+
single {
9+
DetailRepository(get())
10+
}
11+
single {
12+
TopicRepository
13+
}
14+
}
Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
package com.developersbreach.kotlindictionarymultiplatform.di
22

3-
import com.developersbreach.kotlindictionarymultiplatform.data.detail.repository.DetailRepository
4-
import org.koin.dsl.module
3+
import androidx.lifecycle.SavedStateHandle
54
import com.developersbreach.kotlindictionarymultiplatform.ui.screens.detail.DetailViewModel
65
import com.developersbreach.kotlindictionarymultiplatform.ui.screens.topic.TopicViewModel
76
import org.koin.core.module.dsl.viewModel
8-
import androidx.lifecycle.SavedStateHandle
9-
import com.developersbreach.kotlindictionarymultiplatform.data.topic.repository.TopicRepository
10-
11-
val appModule = module {
12-
single { DetailRepository() }
13-
single { TopicRepository }
7+
import org.koin.dsl.module
148

9+
internal val viewModelModule = module {
1510
viewModel { (handle: SavedStateHandle) ->
1611
DetailViewModel(
1712
savedStateHandle = handle,

0 commit comments

Comments
 (0)