diff --git a/libs/database/src/dbTest/java/org/fdroid/database/AppDaoTest.kt b/libs/database/src/dbTest/java/org/fdroid/database/AppDaoTest.kt index 77e09654b..1b19435db 100644 --- a/libs/database/src/dbTest/java/org/fdroid/database/AppDaoTest.kt +++ b/libs/database/src/dbTest/java/org/fdroid/database/AppDaoTest.kt @@ -108,6 +108,26 @@ internal class AppDaoTest : AppTest() { assertEquals(app1, appDao.getApp(packageName).getOrFail()?.toMetadataV2()?.sort()) } + @Test + fun testGetRepositoryIdsForApp() { + // initially, the app is in no repos + assertEquals(emptyList(), appDao.getRepositoryIdsForApp(packageName)) + + // insert same app into one repo + val repoId1 = repoDao.insertOrReplace(getRandomRepo()) + appDao.insert(repoId1, packageName, app1, locales) + assertEquals(listOf(repoId1), appDao.getRepositoryIdsForApp(packageName)) + + // insert the app into one more repo + val repoId2 = repoDao.insertOrReplace(getRandomRepo()) + appDao.insert(repoId2, packageName, app2, locales) + assertEquals(listOf(repoId1, repoId2), appDao.getRepositoryIdsForApp(packageName)) + + // when repo1 is disabled, it doesn't get returned anymore + repoDao.setRepositoryEnabled(repoId1, false) + assertEquals(listOf(repoId2), appDao.getRepositoryIdsForApp(packageName)) + } + @Test fun testUpdateCompatibility() { // insert two apps with one version each diff --git a/libs/database/src/main/java/org/fdroid/database/AppDao.kt b/libs/database/src/main/java/org/fdroid/database/AppDao.kt index 6a17deeb5..92c2240cd 100644 --- a/libs/database/src/main/java/org/fdroid/database/AppDao.kt +++ b/libs/database/src/main/java/org/fdroid/database/AppDao.kt @@ -70,6 +70,12 @@ public interface AppDao { */ public fun getApp(repoId: Long, packageName: String): App? + /** + * Returns a list of all enabled repositories identified by their [Repository.repoId] + * that contain the app identified by the given [packageName]. + */ + public fun getRepositoryIdsForApp(packageName: String): List + /** * Returns a limited number of apps with limited data. * Apps without name, icon or summary are at the end (or excluded if limit is too small). @@ -316,6 +322,11 @@ internal interface AppDaoInt : AppDao { WHERE repoId = :repoId AND packageName = :packageName""") override fun getApp(repoId: Long, packageName: String): App? + @Query("""SELECT repoId FROM ${AppMetadata.TABLE} + JOIN RepositoryPreferences AS pref USING (repoId) + WHERE pref.enabled = 1 AND packageName = :packageName""") + override fun getRepositoryIdsForApp(packageName: String): List + /** * Used for diffing. */