Skip to content

Commit 945c5bc

Browse files
chore: Move flask filter logic from ViewModels to Services
Earlier, ViewModels were building flask filter queries themselves and passing them to Services. This was not good because this leaked the data retrieval logic into the ViewModels. Only the Services should be concerned with data retrieval and they should abstract out that logic. This change moves the logic into Services where it belongs. Fixes: #1344
1 parent 3ab8922 commit 945c5bc

File tree

5 files changed

+45
-45
lines changed

5 files changed

+45
-45
lines changed

app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,21 @@ class AttendeeService(
2727
return attendeeApi.deleteAttendee(id)
2828
}
2929

30-
fun getCustomFormsForAttendees(id: Long, filter: String): Single<List<CustomForm>> {
30+
fun getCustomFormsForAttendees(id: Long): Single<List<CustomForm>> {
3131
val formsSingle = attendeeDao.getCustomFormsForId(id)
3232
return formsSingle.flatMap {
3333
if (it.isNotEmpty())
3434
formsSingle
35-
else
35+
else {
36+
val filter = "[{\"name\":\"form\",\"op\":\"eq\",\"val\":\"order\"}]"
3637
attendeeApi.getCustomFormsForAttendees(id, filter)
3738
.map {
3839
attendeeDao.insertCustomForms(it)
3940
}
4041
.flatMap {
4142
formsSingle
4243
}
44+
}
4345
}
4446
}
4547
}

app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,7 @@ class AttendeeViewModel(
308308
}
309309

310310
fun getCustomFormsForAttendees(eventId: Long) {
311-
val filter = "[{\"name\":\"form\",\"op\":\"eq\",\"val\":\"order\"}]"
312-
compositeDisposable.add(attendeeService.getCustomFormsForAttendees(eventId, filter)
311+
compositeDisposable.add(attendeeService.getCustomFormsForAttendees(eventId)
313312
.subscribeOn(Schedulers.io())
314313
.observeOn(AndroidSchedulers.mainThread())
315314
.doOnSubscribe {

app/src/main/java/org/fossasia/openevent/general/event/EventService.kt

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ class EventService(
5858
}
5959

6060
fun getEventsByLocation(locationName: String): Single<List<Event>> {
61-
return eventApi.searchEvents("name", locationName).flatMap { apiList ->
61+
val query = "[{\"name\":\"location-name\",\"op\":\"ilike\",\"val\":\"%$locationName%\"}]"
62+
return eventApi.searchEvents("name", query).flatMap { apiList ->
6263
val eventIds = apiList.map { it.id }.toList()
6364
eventTopicsDao.insertEventTopics(getEventTopicList(apiList))
6465
eventDao.getFavoriteEventWithinIds(eventIds).flatMap { favIds ->
@@ -82,8 +83,9 @@ class EventService(
8283
return eventApi.getEventFromApi(id)
8384
}
8485

85-
fun getEventsUnderUser(eventId: String): Single<List<Event>> {
86-
return eventApi.eventsUnderUser(eventId)
86+
fun getEventsUnderUser(eventIds: List<Long>): Single<List<Event>> {
87+
val query = buildQuery(eventIds)
88+
return eventApi.eventsUnderUser(query)
8789
}
8890

8991
fun setFavorite(eventId: Long, favorite: Boolean): Completable {
@@ -108,4 +110,33 @@ class EventService(
108110
}
109111
}
110112
}
113+
114+
private fun buildQuery(eventIds: List<Long>): String {
115+
var subQuery = ""
116+
117+
var eventId = -1L
118+
val idList = ArrayList<Long>()
119+
val eventIdAndTimes = mutableMapOf<Long, Int>()
120+
eventIds.forEach { it1 ->
121+
val times = eventIdAndTimes[it1]
122+
if (eventIdAndTimes.containsKey(it1) && times != null) {
123+
eventIdAndTimes[it1] = times + 1
124+
} else {
125+
eventIdAndTimes[it1] = 1
126+
}
127+
idList.add(it1)
128+
eventId = it1
129+
subQuery += ",{\"name\":\"id\",\"op\":\"eq\",\"val\":\"$eventId\"}"
130+
}
131+
132+
val formattedSubQuery = if (subQuery != "")
133+
subQuery.substring(1) // remove "," from the beginning
134+
else
135+
"" // if there are no orders
136+
137+
return if (idList.size == 1)
138+
"[{\"name\":\"id\",\"op\":\"eq\",\"val\":\"$eventId\"}]"
139+
else
140+
"[{\"or\":[$formattedSubQuery]}]"
141+
}
111142
}

app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ class EventsViewModel(private val eventService: EventService, private val prefer
3232
}
3333

3434
fun loadLocationEvents(loadingTag: Int) {
35-
val query = "[{\"name\":\"location-name\",\"op\":\"ilike\",\"val\":\"%$savedLocation%\"}]"
36-
3735
if (loadingTag == RELOADING_EVENTS || (loadingTag == INITIAL_FETCHING_EVENTS && mutableEvents.value == null)) {
38-
compositeDisposable.add(eventService.getEventsByLocation(query)
36+
compositeDisposable.add(eventService.getEventsByLocation(savedLocation.toString())
3937
.subscribeOn(Schedulers.io())
4038
.observeOn(AndroidSchedulers.mainThread())
4139
.doOnSubscribe {

app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserViewModel.kt

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ class OrdersUnderUserViewModel(
2424
val attendeesNumber: LiveData<ArrayList<Int>> = mutableAttendeesNumber
2525
private var eventIdMap = mutableMapOf<Long, Event>()
2626
private val eventIdAndTimes = mutableMapOf<Long, Int>()
27-
private var eventId: Long = -1
28-
private val idList = ArrayList<Long>()
2927
private val mutableMessage = SingleLiveEvent<String>()
3028
val message: LiveData<String> = mutableMessage
3129
private val mutableEventAndOrderIdentifier = MutableLiveData<List<Pair<Event, String>>>()
@@ -50,10 +48,11 @@ class OrdersUnderUserViewModel(
5048
}.subscribe({
5149
order = it
5250
mutableAttendeesNumber.value = it.map { it.attendees?.size } as ArrayList<Int>
53-
val query = buildQuery(it)
5451

55-
if (idList.size != 0)
56-
eventsUnderUser(query)
52+
val eventIds = it.filter { order -> order.event != null }.map { order -> order.event!!.id }
53+
if (eventIds.isNotEmpty()) {
54+
eventsUnderUser(eventIds)
55+
}
5756
else {
5857
mutableProgress.value = false
5958
mutableNoTickets.value = true
@@ -67,7 +66,7 @@ class OrdersUnderUserViewModel(
6766
)
6867
}
6968

70-
private fun eventsUnderUser(eventIds: String) {
69+
private fun eventsUnderUser(eventIds: List<Long>) {
7170
compositeDisposable.add(eventService.getEventsUnderUser(eventIds)
7271
.subscribeOn(Schedulers.io())
7372
.observeOn(AndroidSchedulers.mainThread())
@@ -98,35 +97,6 @@ class OrdersUnderUserViewModel(
9897
)
9998
}
10099

101-
private fun buildQuery(orderList: List<Order>): String {
102-
var subQuery = ""
103-
104-
eventIdAndTimes.clear()
105-
orderList.forEach {
106-
it.event?.id?.let { it1 ->
107-
val times = eventIdAndTimes[it1]
108-
if (eventIdAndTimes.containsKey(it1) && times != null) {
109-
eventIdAndTimes[it1] = times + 1
110-
} else {
111-
eventIdAndTimes[it1] = 1
112-
}
113-
idList.add(it1)
114-
eventId = it1
115-
subQuery += ",{\"name\":\"id\",\"op\":\"eq\",\"val\":\"$eventId\"}"
116-
}
117-
}
118-
119-
val formattedSubQuery = if (subQuery != "")
120-
subQuery.substring(1) // remove "," from the beginning
121-
else
122-
"" // if there are no orders
123-
124-
return if (idList.size == 1)
125-
"[{\"name\":\"id\",\"op\":\"eq\",\"val\":\"$eventId\"}]"
126-
else
127-
"[{\"or\":[$formattedSubQuery]}]"
128-
}
129-
130100
override fun onCleared() {
131101
super.onCleared()
132102
compositeDisposable.clear()

0 commit comments

Comments
 (0)