-
Notifications
You must be signed in to change notification settings - Fork 557
/
EventService.kt
133 lines (115 loc) · 4.56 KB
/
EventService.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package org.fossasia.openevent.general.event
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Single
import org.fossasia.openevent.general.event.feedback.Feedback
import org.fossasia.openevent.general.event.feedback.FeedbackApi
import org.fossasia.openevent.general.event.location.EventLocation
import org.fossasia.openevent.general.event.location.EventLocationApi
import org.fossasia.openevent.general.event.topic.EventTopic
import org.fossasia.openevent.general.event.topic.EventTopicApi
import org.fossasia.openevent.general.event.topic.EventTopicsDao
import org.fossasia.openevent.general.event.types.EventType
import org.fossasia.openevent.general.event.types.EventTypesApi
import java.util.Locale.filter
class EventService(
private val eventApi: EventApi,
private val eventDao: EventDao,
private val eventTopicApi: EventTopicApi,
private val eventTopicsDao: EventTopicsDao,
private val eventTypesApi: EventTypesApi,
private val eventLocationApi: EventLocationApi,
private val eventFeedbackApi: FeedbackApi
) {
fun getEvents(): Flowable<List<Event>> {
val eventsFlowable = eventDao.getAllEvents()
return eventsFlowable.switchMap {
if (it.isNotEmpty())
eventsFlowable
else
eventApi.getEvents()
.map {
eventDao.insertEvents(it)
eventTopicsDao.insertEventTopics(getEventTopicList(it))
}
.toFlowable()
.flatMap {
eventsFlowable
}
}
}
fun getEventLocations(): Single<List<EventLocation>> {
return eventLocationApi.getEventLocation()
}
private fun getEventTopicList(eventsList: List<Event>): List<EventTopic?> {
return eventsList
.filter { it.eventTopic != null }
.map { it.eventTopic }
.toList()
}
fun getEventTopics(): Flowable<List<EventTopic>> {
return eventTopicsDao.getAllEventTopics()
}
fun getEventTypes(): Single<List<EventType>> {
return eventTypesApi.getEventTypes()
}
fun getEventFeedback(id: Long): Single<List<Feedback>> {
return eventFeedbackApi.getEventFeedback(id)
}
fun getSearchEvents(eventName: String): Single<List<Event>> {
return eventApi.searchEvents("name", eventName).flatMap { apiList ->
var eventIds = apiList.map { it.id }.toList()
eventDao.getFavoriteEventWithinIds(eventIds).flatMap { favIds ->
updateFavorites(apiList, favIds)
}
}
}
fun getFavoriteEvents(): Flowable<List<Event>> {
return eventDao.getFavoriteEvents()
}
fun getEventsByLocation(locationName: String): Single<List<Event>> {
return eventApi.searchEvents("name", locationName).flatMap { apiList ->
val eventIds = apiList.map { it.id }.toList()
eventTopicsDao.insertEventTopics(getEventTopicList(apiList))
eventDao.getFavoriteEventWithinIds(eventIds).flatMap { favIds ->
updateFavorites(apiList, favIds)
}
}
}
fun updateFavorites(apiEvents: List<Event>, favEventIds: List<Long>): Single<List<Event>> {
apiEvents.map { if (favEventIds.contains(it.id)) it.favorite = true }
eventDao.insertEvents(apiEvents)
val eventIds = apiEvents.map { it.id }.toList()
return eventDao.getEventWithIds(eventIds)
}
fun getEvent(id: Long): Flowable<Event> {
return eventDao.getEvent(id)
}
fun getEventFromApi(id: Long): Single<Event> {
return eventApi.getEventFromApi(id)
}
fun getEventsUnderUser(eventId: String): Single<List<Event>> {
return eventApi.eventsUnderUser(eventId)
}
fun setFavorite(eventId: Long, favorite: Boolean): Completable {
return Completable.fromAction {
eventDao.setFavorite(eventId, favorite)
}
}
fun getSimilarEvents(id: Long): Flowable<List<Event>> {
val eventsFlowable = eventDao.getAllSimilarEvents(id)
return eventsFlowable.switchMap {
if (it.isNotEmpty())
eventsFlowable
else
eventTopicApi.getEventsUnderTopicId(id)
.toFlowable()
.map {
eventDao.insertEvents(it)
}
.flatMap {
eventsFlowable
}
}
}
}