Skip to content

Commit d82b726

Browse files
Merge remote-tracking branch 'origin/develop' into security
2 parents 22be37d + 302a496 commit d82b726

8 files changed

Lines changed: 111 additions & 11 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.skedgo.tripkit.data.database.locations.facility
2+
3+
4+
import androidx.annotation.Keep
5+
6+
@Keep
7+
data class FacilityLocation(
8+
var id: String = "",
9+
var cellId: String? = null,
10+
var lat: Double = 0.0,
11+
var lng: Double = 0.0,
12+
var address: String? = null,
13+
var timezone: String? = null,
14+
var city: String? = null,
15+
var region: String? = null,
16+
var name: String? = null,
17+
var facilityType: String? = null,
18+
) {
19+
fun toEntity(): FacilityLocationEntity =
20+
FacilityLocationEntity().apply {
21+
identifier = this@FacilityLocation.id
22+
cellId = this@FacilityLocation.cellId
23+
lat = this@FacilityLocation.lat
24+
lng = this@FacilityLocation.lng
25+
address = this@FacilityLocation.address
26+
timezone = this@FacilityLocation.timezone
27+
city = this@FacilityLocation.city
28+
region = this@FacilityLocation.region
29+
name = this@FacilityLocation.name
30+
facilityType = this@FacilityLocation.facilityType
31+
}
32+
}

TripKitData/src/main/java/com/skedgo/tripkit/data/database/locations/facility/FacilityRepositoryImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class FacilityRepositoryImpl(val tripGoDatabase2: TripKitDatabase) : FacilityRep
1919
it.identifier = it.identifier
2020
}
2121
tripGoDatabase2.facilityDao().saveAll(facilities)
22+
}.doOnError {
23+
it.printStackTrace()
2224
}
2325
.subscribeOn(Schedulers.io())
2426
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.skedgo.tripkit.data.database.locations.facility
2+
3+
enum class FacilityType(val type: String) {
4+
WATER_FOUNTAIN("Water-Fountain")
5+
}

TripKitData/src/main/java/com/skedgo/tripkit/data/locations/LocationsResponse.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.skedgo.tripkit.data.database.locations.carparks.CarParkLocation;
88
import com.skedgo.tripkit.data.database.locations.carpods.CarPodLocation;
99
import com.skedgo.tripkit.data.database.locations.carrentals.CarRentalLocation;
10+
import com.skedgo.tripkit.data.database.locations.facility.FacilityLocation;
1011
import com.skedgo.tripkit.data.database.locations.facility.FacilityLocationEntity;
1112
import com.skedgo.tripkit.data.database.locations.freefloating.FreeFloatingLocationEntity;
1213
import com.skedgo.tripkit.data.database.locations.onstreetparking.OnStreetParkingLocation;
@@ -42,7 +43,7 @@ public static class Group {
4243
List<CarPodLocation> carPods;
4344
@SerializedName("carRentals")
4445
List<CarRentalLocation> carRentals;
45-
List<FacilityLocationEntity> facilities;
46+
List<FacilityLocation> facilities;
4647
@SerializedName("stops")
4748
private ArrayList<ScheduledStop> stops;
4849
@SerializedName("hashCode")
@@ -109,7 +110,7 @@ public List<CarPodLocation> getCarPods() {
109110
return carPods;
110111
}
111112

112-
public List<FacilityLocationEntity> getFacilities() {
113+
public List<FacilityLocation> getFacilities() {
113114
return facilities;
114115
}
115116
}

TripKitData/src/main/java/com/skedgo/tripkit/data/locations/StopsFetcher.kt

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.skedgo.tripkit.data.locations
22

3+
import com.google.gson.Gson
34
import com.skedgo.tripkit.agenda.ConfigRepository
45
import com.skedgo.tripkit.common.model.region.Region
56
import com.skedgo.tripkit.data.database.locations.bikepods.BikePodRepository
@@ -126,12 +127,20 @@ open class StopsFetcher(
126127
): Observable<List<LocationsResponse.Group>> {
127128
return createRequestBodiesAsync(cellIds, region, level)
128129
.flatMap { body ->
129-
val baseUrl = region.getURLs()!![0]
130-
val url = baseUrl.toHttpUrlOrNull()!!
131-
.newBuilder()
132-
.addPathSegment("locations.json")
133-
.build()
134-
fetchCellsAsync(url.toString(), body)
130+
val urls = region.getURLs().orEmpty()
131+
.mapNotNull { baseUrl ->
132+
baseUrl.toHttpUrlOrNull()
133+
?.newBuilder()
134+
?.addPathSegment("locations.json")
135+
?.build()
136+
?.toString()
137+
}
138+
139+
if (urls.isEmpty()) {
140+
Observable.error<List<LocationsResponse.Group>>(IllegalStateException("Region ${region.name ?: ""} does not provide valid location endpoints."))
141+
} else {
142+
fetchCellsFromAny(urls, body)
143+
}
135144
}
136145
}
137146

@@ -140,10 +149,28 @@ open class StopsFetcher(
140149
requestBody: LocationsRequestBody
141150
): Observable<List<LocationsResponse.Group>> {
142151
return api.fetchLocationsAsync(url, requestBody)
143-
.filter { response -> response != null && CollectionUtils.isNotEmpty(response.groups) }
152+
.filter { response ->
153+
response != null && CollectionUtils.isNotEmpty(response.groups)
154+
}
144155
.map { it.groups }
145156
}
146157

158+
private fun fetchCellsFromAny(
159+
urls: List<String>,
160+
requestBody: LocationsRequestBody
161+
): Observable<List<LocationsResponse.Group>> {
162+
val requests = urls.map { url ->
163+
fetchCellsAsync(url, requestBody)
164+
.onErrorResumeNext(Observable.empty())
165+
}
166+
167+
return Observable.merge(requests)
168+
.take(1)
169+
.switchIfEmpty(
170+
Observable.error(IllegalStateException("Failed to fetch locations from all region endpoints."))
171+
)
172+
}
173+
147174
private fun saveCellsAsync(cells: List<LocationsResponse.Group>): Observable<List<LocationsResponse.Group>> {
148175
// Saving cell ids, hash codes and saving stops will be performed in parallel.
149176
return Observable.merge(
@@ -197,7 +224,9 @@ open class StopsFetcher(
197224
.map { carPodRepository.saveCarPods(carPodMapper.toEntity(it.key, it.carPods)) }
198225
).plus(
199226
cells.filter { it.facilities != null && it.facilities.isNotEmpty() }
200-
.map { facilityRepository.saveFacilities(it.key, it.facilities) }
227+
.map {
228+
facilityRepository.saveFacilities(it.key, it.facilities.map { it.toEntity() })
229+
}
201230
)
202231
.toList()
203232
.let {
Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,42 @@
11
package com.skedgo.tripkit.booking.quickbooking
22

33
import com.google.gson.annotations.SerializedName
4+
import com.skedgo.tripkit.common.model.booking.confirmation.BookingConfirmationAction
45

56
data class ConfirmPaymentUpdateResponse(
67
val updateURL: String? = null,
78
val paymentIntentID: String? = null,
89
val clientSecret: String? = null,
910
val url: String? = null,
1011
val warning: String? = null,
12+
val actionRequired: ActionRequired? = null
1113
)
1214

1315
data class ConfirmPaymentError(
1416
val errorCode: Int,
1517
val title: String,
1618
val error: String,
1719
@SerializedName("usererror") val userError: Boolean
18-
)
20+
)
21+
22+
data class ActionRequired(
23+
val actions: List<BookingConfirmationAction>,
24+
val differences: List<Difference>,
25+
val message: String,
26+
val title: String
27+
) {
28+
data class Difference(
29+
val bookingType: String,
30+
val externalFrom: Location?,
31+
val externalTo: Location?,
32+
val from: Location,
33+
val to: Location
34+
) {
35+
36+
data class Location(
37+
val address: String,
38+
val lat: Double,
39+
val lng: Double
40+
)
41+
}
42+
}

trip-kit-booking/src/main/java/com/skedgo/tripkit/booking/quickbooking/QuickBookingApi.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ interface QuickBookingApi {
1717
@POST
1818
fun book(@Url url: String, @Body request: QuickBookRequest): Single<QuickBookResponse>
1919

20+
@GET
21+
fun book(@Url url: String): Single<QuickBookResponse>
22+
2023
@GET
2124
fun getBookingUpdate(@Url url: String): Single<RoutingResponse>
2225

trip-kit-booking/src/main/java/com/skedgo/tripkit/booking/quickbooking/QuickBookingService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import okhttp3.ResponseBody
88
interface QuickBookingService {
99
fun getQuickBooking(url: String): Single<List<QuickBooking>>
1010
fun quickBook(url: String, request: QuickBookRequest): Single<QuickBookResponse>
11+
fun quickBook(url: String): Single<QuickBookResponse>
1112
fun getBookingUpdate(url: String): Single<RoutingResponse>
1213
fun executeBookingAction(url: String): Single<QuickBookResponse>
1314
fun getPaymentIntent(url: String): Single<QuickBookingPaymentIntent>
@@ -34,6 +35,9 @@ interface QuickBookingService {
3435
override fun quickBook(url: String, request: QuickBookRequest): Single<QuickBookResponse> =
3536
api.book(url, request)
3637

38+
override fun quickBook(url: String): Single<QuickBookResponse> =
39+
api.book(url)
40+
3741
override fun getBookingUpdate(url: String): Single<RoutingResponse> =
3842
api.getBookingUpdate(url)
3943

0 commit comments

Comments
 (0)