Skip to content

Commit 35951dc

Browse files
committed
feat: allow selecting all tracks to add their recordings to a collection; use a list instead of set when adding to a collection to preserve order
At least until you refresh. If you refresh, it will be ordered based on the order the web service API returns them in (which is also different from the display order in MusicBrainz's web app).
1 parent 1076583 commit 35951dc

File tree

42 files changed

+271
-124
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+271
-124
lines changed

data/database/src/commonMain/kotlin/ly/david/musicsearch/data/database/dao/CollectionDao.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import app.cash.sqldelight.coroutines.mapToOne
77
import app.cash.sqldelight.paging3.QueryPagingSource
88
import kotlinx.coroutines.flow.Flow
99
import kotlinx.coroutines.flow.map
10-
import ly.david.musicsearch.shared.domain.coroutine.CoroutineDispatchers
1110
import ly.david.musicsearch.data.database.Database
1211
import ly.david.musicsearch.data.musicbrainz.models.core.CollectionMusicBrainzNetworkModel
1312
import ly.david.musicsearch.shared.domain.collection.CollectionSortOption
13+
import ly.david.musicsearch.shared.domain.coroutine.CoroutineDispatchers
1414
import ly.david.musicsearch.shared.domain.listitem.CollectionListItemModel
1515
import ly.david.musicsearch.shared.domain.network.MusicBrainzEntityType
1616
import lydavidmusicsearchdatadatabase.Collection
@@ -174,7 +174,7 @@ class CollectionDao(
174174
}
175175

176176
fun markDeletedCollections(
177-
collectionIds: Set<String>,
177+
collectionIds: List<String>,
178178
) {
179179
transacter.transaction {
180180
collectionIds.forEach { collectionId ->

data/database/src/commonMain/kotlin/ly/david/musicsearch/data/database/dao/CollectionEntityDao.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import app.cash.sqldelight.Query
44
import app.cash.sqldelight.coroutines.asFlow
55
import app.cash.sqldelight.coroutines.mapToOne
66
import kotlinx.coroutines.flow.Flow
7-
import ly.david.musicsearch.shared.domain.coroutine.CoroutineDispatchers
87
import ly.david.musicsearch.data.database.Database
8+
import ly.david.musicsearch.shared.domain.coroutine.CoroutineDispatchers
99
import lydavidmusicsearchdatadatabase.Collection_entity
1010

1111
class CollectionEntityDao(
@@ -47,7 +47,7 @@ class CollectionEntityDao(
4747

4848
fun markDeletedFromCollection(
4949
collectionId: String,
50-
collectableIds: Set<String>,
50+
collectableIds: List<String>,
5151
) {
5252
transacter.transaction {
5353
collectableIds.forEach { collectableId ->

data/database/src/commonMain/kotlin/ly/david/musicsearch/data/database/dao/TrackDao.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package ly.david.musicsearch.data.database.dao
22

33
import androidx.paging.PagingSource
4+
import app.cash.sqldelight.coroutines.asFlow
5+
import app.cash.sqldelight.coroutines.mapToOne
46
import app.cash.sqldelight.paging3.QueryPagingSource
57
import kotlinx.collections.immutable.ImmutableList
8+
import kotlinx.coroutines.flow.Flow
9+
import kotlinx.coroutines.flow.map
610
import ly.david.musicsearch.data.database.Database
711
import ly.david.musicsearch.data.database.mapper.combineToAliases
812
import ly.david.musicsearch.data.database.mapper.combineToArtistCredits
@@ -66,11 +70,14 @@ class TrackDao(
6670
}
6771
}
6872

69-
fun getNumberOfTracksByRelease(releaseId: String): Int =
73+
fun observeCountOfTracksByRelease(releaseId: String): Flow<Int> =
7074
transacter.getNumberOfTracksByRelease(
7175
releaseId = releaseId,
7276
query = "%%",
73-
).executeAsOne().toInt()
77+
)
78+
.asFlow()
79+
.mapToOne(coroutineDispatchers.io)
80+
.map { it.toInt() }
7481

7582
fun getTracksByRelease(
7683
releaseId: String,

data/musicbrainz/src/commonMain/kotlin/ly/david/musicsearch/data/musicbrainz/api/CollectionApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ interface CollectionApi {
1818
suspend fun addToCollection(
1919
collectionId: String,
2020
resourceUriPlural: String,
21-
mbids: Set<String>,
21+
mbids: List<String>,
2222
client: String = "MusicSearch",
2323
)
2424

@@ -43,7 +43,7 @@ interface CollectionApiImpl : CollectionApi {
4343
override suspend fun addToCollection(
4444
collectionId: String,
4545
resourceUriPlural: String,
46-
mbids: Set<String>,
46+
mbids: List<String>,
4747
client: String,
4848
) {
4949
httpClient.put {

data/repository/src/commonMain/kotlin/ly/david/musicsearch/data/repository/collection/CollectionRepositoryImpl.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class CollectionRepositoryImpl(
125125

126126
override fun markDeletedFromCollection(
127127
collection: CollectionListItemModel,
128-
collectableIds: Set<String>,
128+
collectableIds: List<String>,
129129
): Flow<Feedback<CollectionFeedback>> = flow {
130130
collectionEntityDao.markDeletedFromCollection(
131131
collectionId = collection.id,
@@ -190,7 +190,7 @@ class CollectionRepositoryImpl(
190190
override suspend fun addToCollection(
191191
collectionId: String,
192192
entityType: MusicBrainzEntityType,
193-
entityIds: Set<String>,
193+
entityIds: List<String>,
194194
): ActionableResult {
195195
val collection = collectionDao.getCollection(collectionId) ?: return ActionableResult("Does not exist")
196196

@@ -232,7 +232,7 @@ class CollectionRepositoryImpl(
232232
}
233233

234234
override fun markDeletedCollections(
235-
collectionIds: Set<String>,
235+
collectionIds: List<String>,
236236
): ActionableResult {
237237
collectionDao.markDeletedCollections(
238238
collectionIds = collectionIds,

data/repository/src/commonMain/kotlin/ly/david/musicsearch/data/repository/di/RepositoryDataModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import ly.david.musicsearch.data.repository.label.LabelsListRepositoryImpl
2323
import ly.david.musicsearch.data.repository.list.EntitiesListRepositoryImpl
2424
import ly.david.musicsearch.data.repository.list.ObserveCollectedCountImpl
2525
import ly.david.musicsearch.data.repository.list.ObserveLocalCountImpl
26+
import ly.david.musicsearch.data.repository.list.ObserveTrackCountImpl
2627
import ly.david.musicsearch.data.repository.list.ObserveVisitedCountImpl
2728
import ly.david.musicsearch.data.repository.listen.ListensListRepositoryImpl
2829
import ly.david.musicsearch.data.repository.metadata.MetadataRepositoryImpl
@@ -63,6 +64,7 @@ import ly.david.musicsearch.shared.domain.label.LabelsListRepository
6364
import ly.david.musicsearch.shared.domain.list.EntitiesListRepository
6465
import ly.david.musicsearch.shared.domain.list.ObserveCollectedCount
6566
import ly.david.musicsearch.shared.domain.list.ObserveLocalCount
67+
import ly.david.musicsearch.shared.domain.list.ObserveTrackCount
6668
import ly.david.musicsearch.shared.domain.list.ObserveVisitedCount
6769
import ly.david.musicsearch.shared.domain.listen.ListensListRepository
6870
import ly.david.musicsearch.shared.domain.metadata.MetadataRepository
@@ -128,6 +130,7 @@ val repositoryDataModule = module {
128130
singleOf(::ImageMetadataRepositoryImpl) bind ImageMetadataRepository::class
129131
singleOf(::MusicBrainzImageMetadataRepositoryImpl) bind MusicBrainzImageMetadataRepository::class
130132
singleOf(::ObserveLocalCountImpl) bind ObserveLocalCount::class
133+
singleOf(::ObserveTrackCountImpl) bind ObserveTrackCount::class
131134
singleOf(::ObserveCollectedCountImpl) bind ObserveCollectedCount::class
132135
singleOf(::ObserveVisitedCountImpl) bind ObserveVisitedCount::class
133136
singleOf(::ListensListRepositoryImpl) bind ListensListRepository::class
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ly.david.musicsearch.data.repository.list
2+
3+
import kotlinx.coroutines.flow.Flow
4+
import ly.david.musicsearch.data.database.dao.TrackDao
5+
import ly.david.musicsearch.shared.domain.list.ObserveTrackCount
6+
7+
class ObserveTrackCountImpl(
8+
private val trackDao: TrackDao,
9+
) : ObserveTrackCount {
10+
override fun invoke(releaseId: String): Flow<Int> {
11+
return trackDao.observeCountOfTracksByRelease(releaseId = releaseId)
12+
}
13+
}

data/repository/src/jvmTest/kotlin/ly/david/musicsearch/data/repository/collection/CollectionRepositoryImplTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ class CollectionRepositoryImplTest : KoinTest {
439439

440440
private suspend fun testDeletingACollection(repository: CollectionRepository) {
441441
repository.markDeletedCollections(
442-
collectionIds = setOf(newCollection.id),
442+
collectionIds = listOf(newCollection.id),
443443
)
444444
repository.observeAllCollections(
445445
username = "",
@@ -473,7 +473,7 @@ class CollectionRepositoryImplTest : KoinTest {
473473
}
474474

475475
repository.markDeletedCollections(
476-
collectionIds = setOf(NEW_COLLECTION_ID),
476+
collectionIds = listOf(NEW_COLLECTION_ID),
477477
)
478478
repository.deleteCollectionsMarkedForDeletion()
479479
repository.observeAllCollections(
@@ -594,7 +594,7 @@ class CollectionRepositoryImplTest : KoinTest {
594594
repository.addToCollection(
595595
collectionId = "1",
596596
entityType = MusicBrainzEntityType.ARTIST,
597-
entityIds = setOf(entityId),
597+
entityIds = listOf(entityId),
598598
)
599599
Assert.assertEquals(true, awaitItem())
600600
}

shared/domain/src/commonMain/kotlin/ly/david/musicsearch/shared/domain/collection/CollectionRepository.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ interface CollectionRepository {
3030

3131
fun markDeletedFromCollection(
3232
collection: CollectionListItemModel,
33-
collectableIds: Set<String>,
33+
collectableIds: List<String>,
3434
): Flow<Feedback<CollectionFeedback>>
3535

3636
fun unMarkDeletedFromCollection(
@@ -44,11 +44,11 @@ interface CollectionRepository {
4444
suspend fun addToCollection(
4545
collectionId: String,
4646
entityType: MusicBrainzEntityType,
47-
entityIds: Set<String>,
47+
entityIds: List<String>,
4848
): ActionableResult
4949

5050
fun markDeletedCollections(
51-
collectionIds: Set<String>,
51+
collectionIds: List<String>,
5252
): ActionableResult
5353

5454
fun unMarkDeletedCollections()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package ly.david.musicsearch.shared.domain.list
2+
3+
import kotlinx.coroutines.flow.Flow
4+
5+
interface ObserveTrackCount {
6+
operator fun invoke(releaseId: String): Flow<Int>
7+
}

0 commit comments

Comments
 (0)