Skip to content

Commit 536fea9

Browse files
Merge pull request #10 from DevelopersBreach/hide-openapi-key
Hide API key from code by using expect/actual for OpenAPI key
2 parents 825df3e + b070a44 commit 536fea9

File tree

9 files changed

+49
-9
lines changed

9 files changed

+49
-9
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: androidTest
1+
name: tests
22

33
on:
44
pull_request:
@@ -9,6 +9,8 @@ on:
99
jobs:
1010
build:
1111
runs-on: ubuntu-latest
12+
env:
13+
OPEN_API_KEY: ${{ secrets.OPEN_API_KEY }}
1214

1315
steps:
1416
- name: Checkout

composeApp/build.gradle.kts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import com.android.build.api.dsl.ApplicationDefaultConfig
12
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
23
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
34
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
45
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
56
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
67
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
8+
import java.util.Properties
79

810
plugins {
911
alias(libs.plugins.kotlinMultiplatform)
@@ -118,6 +120,9 @@ android {
118120
targetSdk = libs.versions.android.targetSdk.get().toInt()
119121
versionCode = 1
120122
versionName = "1.0"
123+
124+
val properties = getLocalProperties()
125+
setupBuildConfigFields(properties = properties)
121126
}
122127
packaging {
123128
resources {
@@ -133,6 +138,9 @@ android {
133138
sourceCompatibility = JavaVersion.VERSION_11
134139
targetCompatibility = JavaVersion.VERSION_11
135140
}
141+
buildFeatures {
142+
buildConfig = true
143+
}
136144
}
137145

138146
dependencies {
@@ -149,4 +157,25 @@ compose.desktop {
149157
packageVersion = "1.0.0"
150158
}
151159
}
160+
}
161+
162+
fun ApplicationDefaultConfig.setupBuildConfigFields(
163+
properties: Properties,
164+
) {
165+
fun secret(key: String): String = System.getenv(key) ?: properties.getProperty(key, "")
166+
167+
if (secret("OPEN_API_KEY").isEmpty()) {
168+
error("OPEN_API_KEY not set in local.properties")
169+
}
170+
171+
buildConfigField(type = "String", name = "OPEN_API_KEY", value = "\"${secret("OPEN_API_KEY")}\"")
172+
}
173+
174+
fun getLocalProperties(): Properties {
175+
return Properties().apply {
176+
val file = rootProject.file("local.properties")
177+
if (file.exists()) {
178+
file.inputStream().use { load(it) }
179+
}
180+
}
152181
}

composeApp/src/androidMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/Platform.android.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ class AndroidPlatform : Platform {
66
override val name: String = "Android ${Build.VERSION.SDK_INT}"
77
}
88

9-
actual fun getPlatform(): Platform = AndroidPlatform()
9+
actual fun getPlatform(): Platform = AndroidPlatform()
10+
11+
actual fun getOpenApiKey() = BuildConfig.OPEN_API_KEY

composeApp/src/commonMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/Platform.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ interface Platform {
44
val name: String
55
}
66

7-
expect fun getPlatform(): Platform
7+
expect fun getPlatform(): Platform
8+
9+
expect fun getOpenApiKey(): String

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

Lines changed: 0 additions & 3 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.developersbreach.kotlindictionarymultiplatform.data.detail.repository
22

33
import arrow.core.Either
4-
import com.developersbreach.kotlindictionarymultiplatform.core.network.API_KEY
54
import com.developersbreach.kotlindictionarymultiplatform.core.network.KtorHttpClient
65
import com.developersbreach.kotlindictionarymultiplatform.data.detail.model.KotlinTopicDetails
6+
import com.developersbreach.kotlindictionarymultiplatform.getOpenApiKey
77

88
class DetailRepository {
99

1010
suspend fun fetchTopic(topicId: String): Either<Throwable, KotlinTopicDetails> =
1111
Either.catch {
12-
KtorHttpClient.generateTopicDetails(topicId, API_KEY)
12+
KtorHttpClient.generateTopicDetails(topicId, getOpenApiKey())
1313
}
1414
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.developersbreach.kotlindictionarymultiplatform
2+
3+
actual fun getOpenApiKey(): String = ""
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.developersbreach.kotlindictionarymultiplatform
2+
3+
actual fun getOpenApiKey(): String = ""

composeApp/src/wasmJsMain/kotlin/com/developersbreach/kotlindictionarymultiplatform/Platform.wasmJs.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ class WasmPlatform : Platform {
44
override val name: String = "Web with Kotlin/Wasm"
55
}
66

7-
actual fun getPlatform(): Platform = WasmPlatform()
7+
actual fun getPlatform(): Platform = WasmPlatform()
8+
9+
actual fun getOpenApiKey(): String = ""

0 commit comments

Comments
 (0)