From e06a8ba236a7757c4b38636f5cd1cf26902afd67 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Tue, 15 Aug 2023 14:49:24 +0530 Subject: [PATCH] refactor(database): disallow injection of raw database types --- .../claw/database/injection/DatabaseModule.kt | 2 +- .../database/injection/InternalDatabaseApi.kt | 19 +++++++++++++++++++ .../claw/database/injection/QueriesModule.kt | 6 ++++-- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 database/src/main/kotlin/dev/msfjarvis/claw/database/injection/InternalDatabaseApi.kt diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt index 17ceb416..be5791c0 100644 --- a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt @@ -26,7 +26,7 @@ object DatabaseModule { private const val LOBSTERS_DATABASE_NAME = "SavedPosts.db" - @Provides + @[Provides InternalDatabaseApi] fun provideDatabase(@ForScope(ApplicationScope::class) context: Context): LobstersDatabase { val driver = AndroidSqliteDriver( diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/InternalDatabaseApi.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/InternalDatabaseApi.kt new file mode 100644 index 00000000..17c683ec --- /dev/null +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/InternalDatabaseApi.kt @@ -0,0 +1,19 @@ +/* + * Copyright © 2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.database.injection + +import javax.inject.Qualifier + +/** + * Neato workaround for not allowing the [dev.msfjarvis.claw.database.LobstersDatabase] type to be + * used directly by modules that depend on this one, as we prefer them to use the specific types + * from [QueriesModule] instead. A [Qualifier] applied to the + * [dev.msfjarvis.claw.database.LobstersDatabase] type makes all injection sites require it as well, + * and marking the annotation class' visibility as `internal` lets it stay visible to the Java code + * generated by Dagger but inaccessible by the Kotlin code we're writing ourselves. + */ +@Qualifier @Retention(AnnotationRetention.RUNTIME) internal annotation class InternalDatabaseApi diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/QueriesModule.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/QueriesModule.kt index e99c5376..1b9dcdb2 100644 --- a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/QueriesModule.kt +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/QueriesModule.kt @@ -19,12 +19,14 @@ import dev.msfjarvis.claw.database.local.SavedPostQueries object QueriesModule { @Provides - fun provideSavedPostsQueries(database: LobstersDatabase): SavedPostQueries { + fun provideSavedPostsQueries(@InternalDatabaseApi database: LobstersDatabase): SavedPostQueries { return database.savedPostQueries } @Provides - fun providePostCommentsQueries(database: LobstersDatabase): PostCommentsQueries { + fun providePostCommentsQueries( + @InternalDatabaseApi database: LobstersDatabase + ): PostCommentsQueries { return database.postCommentsQueries } }