Skip to content
This repository was archived by the owner on Feb 17, 2020. It is now read-only.

Commit 6d88246

Browse files
committed
Move favourites handling entirely to FavoritesService
1 parent 2da7d3b commit 6d88246

5 files changed

Lines changed: 124 additions & 99 deletions

File tree

app/src/main/java/net/squanchy/favorites/FavoritesService.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.reactivex.Observable
44
import net.squanchy.favorites.view.FavoritesItem
55
import net.squanchy.schedule.ScheduleService
66
import net.squanchy.schedule.domain.view.Event
7+
import net.squanchy.schedule.domain.view.SchedulePage
78
import net.squanchy.service.repository.AuthService
89
import net.squanchy.support.lang.or
910

@@ -20,23 +21,28 @@ internal class FirestoreFavoritesService(
2021
) : FavoritesService {
2122

2223
override fun favorites(): Observable<List<FavoritesItem>> {
23-
return scheduleService.schedule(onlyFavorites = true)
24+
return scheduleService.schedule()
2425
.map { schedule -> schedule.pages }
2526
.flatMap { pages ->
26-
val flattenedItems = pages.map { page ->
27-
val eventsAsFavoriteItems = page.events.map { it.toFavoriteItem() }
28-
29-
if (eventsAsFavoriteItems.isNotEmpty()) {
30-
return@map listOf(FavoritesItem.Header(page.date)) + eventsAsFavoriteItems
31-
} else {
32-
return@map emptyList<FavoritesItem>()
33-
}
34-
}.flatten()
27+
val flattenedItems = pages.map { page -> page.asFavouritesDayViewModel() }
28+
.flatten()
3529

3630
return@flatMap Observable.just(flattenedItems)
3731
}
3832
}
3933

34+
private fun SchedulePage.asFavouritesDayViewModel(): List<FavoritesItem> {
35+
val eventsAsFavoriteItems = this.events
36+
.filter { it.favorited }
37+
.map { it.toFavoriteItem() }
38+
39+
if (eventsAsFavoriteItems.isNotEmpty()) {
40+
return listOf(FavoritesItem.Header(date)) + eventsAsFavoriteItems
41+
} else {
42+
return emptyList()
43+
}
44+
}
45+
4046
override fun currentUserIsSignedIn(): Observable<Boolean> {
4147
return authService.currentUser()
4248
.map { optionalUser -> optionalUser.map { user -> !user.isAnonymous }.or(false) }

app/src/main/java/net/squanchy/schedule/ScheduleService.kt

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.squanchy.schedule
33
import io.reactivex.Observable
44
import io.reactivex.Scheduler
55
import io.reactivex.functions.BiFunction
6+
import io.reactivex.functions.Function3
67
import io.reactivex.schedulers.Schedulers
78
import net.squanchy.schedule.domain.view.Event
89
import net.squanchy.schedule.domain.view.Schedule
@@ -21,7 +22,7 @@ import org.joda.time.LocalDate
2122

2223
interface ScheduleService {
2324

24-
fun schedule(onlyFavorites: Boolean = false): Observable<Schedule>
25+
fun schedule(): Observable<Schedule>
2526
}
2627

2728
class 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
}

app/src/test/java/net/squanchy/favorites/FirestoreFavoritesServiceTest.kt

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,55 @@ class FirestoreFavoritesServiceTest {
3737
favoritesService = FirestoreFavoritesService(authService, scheduleService)
3838
}
3939

40+
@Test
41+
fun `should exclude events that are not favorites`() {
42+
val schedule = aSchedule(
43+
pages = listOf(
44+
aSchedulePage(
45+
date = aDay().date,
46+
events = listOf(
47+
anEvent(id = "day 1 event 1", favorited = true),
48+
anEvent(id = "day 1 event 2", favorited = false),
49+
anEvent(id = "day 1 event 3", favorited = false)
50+
)
51+
),
52+
aSchedulePage(
53+
date = aDay().date.plusDays(1),
54+
events = listOf(
55+
anEvent(id = "day 2 event 1", favorited = false),
56+
anEvent(id = "day 2 event 2", favorited = false),
57+
anEvent(id = "day 2 event 3", favorited = false)
58+
)
59+
),
60+
aSchedulePage(
61+
date = aDay().date.plusDays(2),
62+
events = listOf(
63+
anEvent(id = "day 3 event 1", favorited = false),
64+
anEvent(id = "day 3 event 2", favorited = true),
65+
anEvent(id = "day 3 event 3", favorited = true)
66+
)
67+
)
68+
)
69+
)
70+
`when`(scheduleService.schedule()).thenReturn(Observable.just(schedule))
71+
72+
favoritesService.favorites()
73+
.test()
74+
.assertValue(
75+
listOf(
76+
aFavoriteHeaderListItem(aDay().date),
77+
aFavoriteItemListItem(anEvent(id = "day 1 event 1", favorited = true)),
78+
aFavoriteHeaderListItem(aDay().date.plusDays(2)),
79+
aFavoriteItemListItem(anEvent(id = "day 3 event 2", favorited = true)),
80+
aFavoriteItemListItem(anEvent(id = "day 3 event 3", favorited = true))
81+
)
82+
)
83+
}
84+
4085
@Test
4186
fun `should return an empty list when there are no favorite events`() {
4287
val schedule = aSchedule(pages = emptyList())
43-
`when`(scheduleService.schedule(onlyFavorites = true)).thenReturn(Observable.just(schedule))
88+
`when`(scheduleService.schedule()).thenReturn(Observable.just(schedule))
4489

4590
favoritesService.favorites()
4691
.test()
@@ -53,25 +98,25 @@ class FirestoreFavoritesServiceTest {
5398
pages = listOf(
5499
aSchedulePage(
55100
date = aDay().date,
56-
events = listOf(anEvent(id = "day 1 event 1"), anEvent(id = "day 1 event 2"))
101+
events = listOf(anEvent(id = "day 1 event 1", favorited = true), anEvent(id = "day 1 event 2", favorited = true))
57102
),
58103
aSchedulePage(
59104
date = aDay().date.plusDays(1),
60-
events = listOf(anEvent(id = "day 2 event 1"))
105+
events = listOf(anEvent(id = "day 2 event 1", favorited = true))
61106
)
62107
)
63108
)
64-
`when`(scheduleService.schedule(onlyFavorites = true)).thenReturn(Observable.just(schedule))
109+
`when`(scheduleService.schedule()).thenReturn(Observable.just(schedule))
65110

66111
favoritesService.favorites()
67112
.test()
68113
.assertValue(
69114
listOf(
70115
aFavoriteHeaderListItem(aDay().date),
71-
aFavoriteItemListItem(anEvent(id = "day 1 event 1")),
72-
aFavoriteItemListItem(anEvent(id = "day 1 event 2")),
116+
aFavoriteItemListItem(anEvent(id = "day 1 event 1", favorited = true)),
117+
aFavoriteItemListItem(anEvent(id = "day 1 event 2", favorited = true)),
73118
aFavoriteHeaderListItem(aDay().date.plusDays(1)),
74-
aFavoriteItemListItem(anEvent(id = "day 2 event 1"))
119+
aFavoriteItemListItem(anEvent(id = "day 2 event 1", favorited = true))
75120
)
76121
)
77122
}
@@ -83,7 +128,7 @@ class FirestoreFavoritesServiceTest {
83128
aSchedulePage(events = emptyList())
84129
)
85130
)
86-
`when`(scheduleService.schedule(onlyFavorites = true)).thenReturn(Observable.just(schedule))
131+
`when`(scheduleService.schedule()).thenReturn(Observable.just(schedule))
87132

88133
favoritesService.favorites()
89134
.test()

0 commit comments

Comments
 (0)