@@ -3,6 +3,7 @@ package net.squanchy.schedule
33import io.reactivex.Observable
44import io.reactivex.Scheduler
55import io.reactivex.functions.BiFunction
6+ import io.reactivex.functions.Function3
67import io.reactivex.schedulers.Schedulers
78import net.squanchy.schedule.domain.view.Event
89import net.squanchy.schedule.domain.view.Schedule
@@ -21,7 +22,7 @@ import org.joda.time.LocalDate
2122
2223interface ScheduleService {
2324
24- fun schedule (onlyFavorites : Boolean = false ): Observable <Schedule >
25+ fun schedule (): Observable <Schedule >
2526}
2627
2728class FirestoreScheduleService (
@@ -31,41 +32,23 @@ class FirestoreScheduleService(
3132 private val checksum : Checksum
3233) : ScheduleService {
3334
34- override fun schedule (onlyFavorites : Boolean ): Observable <Schedule > = schedule(onlyFavorites, Schedulers .io())
35+ override fun schedule (): Observable <Schedule > = schedule(Schedulers .io())
3536
36- fun schedule (onlyFavorites : Boolean , observeScheduler : Scheduler ): Observable <Schedule > {
37+ fun schedule (observeScheduler : Scheduler ): Observable <Schedule > {
3738 val filteredDbSchedulePages = dbService.scheduleView()
3839 .observeOn(observeScheduler)
39- .filterByFavorites(onlyFavorites)
4040 .filterByTracks(tracksFilter.selectedTracks)
4141
4242 val domainSchedulePages = Observable .combineLatest(
4343 filteredDbSchedulePages,
4444 dbService.timezone(),
45+ authService.ifUserSignedInThenObservableFrom(dbService::favorites),
4546 toSortedDomainSchedulePages()
4647 )
4748
4849 return Observable .combineLatest(domainSchedulePages, dbService.timezone(), BiFunction (::Schedule ))
4950 }
5051
51- private fun Observable<List<FirestoreSchedulePage>>.filterByFavorites (onlyFavorites : Boolean ) =
52- when {
53- onlyFavorites -> this .removeNonFavorites()
54- else -> this
55- }
56-
57- private fun Observable<List<FirestoreSchedulePage>>.removeNonFavorites (): Observable <List <FirestoreSchedulePage >> {
58- return Observable .combineLatest(
59- this ,
60- authService.ifUserSignedInThenObservableFrom(dbService::favorites),
61- BiFunction { schedule, favorites ->
62- schedule.filterPagesEvents { favorites.includes(it.id) }
63- })
64- }
65-
66- private fun List<FirestoreFavorite>.includes (eventId : String ) =
67- mapNotNull { it.id }.contains(eventId)
68-
6952 private fun Observable<List<FirestoreSchedulePage>>.filterByTracks (selectedTracks : Observable <Set <Track >>) =
7053 Observable .combineLatest(
7154 this ,
@@ -90,19 +73,35 @@ class FirestoreScheduleService(
9073 track?.let { eventTrack -> allowedTracks.any { it.id == eventTrack.id } } ? : true
9174
9275 private fun toSortedDomainSchedulePages () =
93- BiFunction <List <FirestoreSchedulePage >, DateTimeZone , List <SchedulePage >> { pages, timeZone ->
94- pages.toSortedDomainSchedulePages(checksum, timeZone)
76+ Function3 <List <FirestoreSchedulePage >, DateTimeZone , List <FirestoreFavorite >, List < SchedulePage >> { pages, timeZone, favorites ->
77+ pages.toSortedDomainSchedulePages(checksum, timeZone, favorites )
9578 }
9679
97- private fun List<FirestoreSchedulePage>.toSortedDomainSchedulePages (checksum : Checksum , timeZone : DateTimeZone ) =
98- map { page -> page.toSortedDomainSchedulePage(checksum, timeZone) }
80+ private fun List<FirestoreSchedulePage>.toSortedDomainSchedulePages (
81+ checksum : Checksum ,
82+ timeZone : DateTimeZone ,
83+ favorites : List <FirestoreFavorite >
84+ ) =
85+ map { page -> page.toSortedDomainSchedulePage(checksum, timeZone, favorites) }
9986 .sortedBy(SchedulePage ::date)
10087
101- private fun FirestoreSchedulePage.toSortedDomainSchedulePage (checksum : Checksum , timeZone : DateTimeZone ): SchedulePage =
102- SchedulePage (
103- day.id,
104- LocalDate (day.date, timeZone),
105- events.map { it.toEvent(checksum, timeZone) }
106- .sortedWith(compareBy(Event ::startTime, { it.place.orNull()?.position ? : - 1 }))
107- )
88+ private fun FirestoreSchedulePage.toSortedDomainSchedulePage (
89+ checksum : Checksum ,
90+ timeZone : DateTimeZone ,
91+ favorites : List <FirestoreFavorite >
92+ ): SchedulePage = SchedulePage (
93+ day.id,
94+ LocalDate (day.date, timeZone),
95+ events.map { it.toEvent(checksum, timeZone, favorites) }
96+ .sortedByStartTimeAndRoom()
97+ )
98+
99+ private fun FirestoreEvent.toEvent (checksum : Checksum , timeZone : DateTimeZone , favorites : List <FirestoreFavorite >) =
100+ this .toEvent(checksum, timeZone, favorites.any { favorite -> favorite.id == this .id })
101+
102+ private fun List<Event>.sortedByStartTimeAndRoom () =
103+ sortedWith(compareBy(
104+ Event ::startTime,
105+ { it.place.orNull()?.position ? : - 1 }
106+ ))
108107}
0 commit comments