Skip to content

Commit a755a2d

Browse files
committed
feat: support paginated responses on API endpoints
1 parent 64d3ce8 commit a755a2d

26 files changed

+190
-67
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.ctrlhub.core.api.response
2+
3+
data class PaginatedList<T>(
4+
val data: List<T>,
5+
val pagination: PaginationMeta
6+
)
7+
8+
data class PaginationMeta(
9+
val page: PageMeta,
10+
val counts: CountsMeta,
11+
val requested: RequestedMeta,
12+
val offsets: OffsetsMeta
13+
)
14+
15+
data class CountsMeta(
16+
val resources: Int,
17+
val pages: Int
18+
)
19+
20+
data class PageMeta(
21+
val currentPage: Int,
22+
)
23+
24+
data class RequestedMeta(
25+
val offset: Int?,
26+
val limit: Int?
27+
)
28+
29+
data class OffsetsMeta(
30+
val previous: Int?,
31+
val next: Int?
32+
)

src/main/kotlin/com/ctrlhub/core/assets/equipment/EquipmentRouter.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ctrlhub.core.assets.equipment
22

33
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.api.response.PaginatedList
45
import com.ctrlhub.core.assets.equipment.resource.EquipmentItem
56
import com.ctrlhub.core.router.Router
67
import com.ctrlhub.core.router.request.FilterOption
@@ -25,9 +26,11 @@ enum class EquipmentIncludes(val value: String) : JsonApiIncludes {
2526
}
2627

2728
class EquipmentRequestParameters(
29+
offset: Int = 0,
30+
limit: Int = 100,
2831
filterOptions: List<FilterOption> = emptyList(),
2932
includes: List<EquipmentIncludes> = emptyList()
30-
) : RequestParametersWithIncludes<EquipmentIncludes>(filterOptions, includes)
33+
) : RequestParametersWithIncludes<EquipmentIncludes>(offset, limit, filterOptions, includes)
3134

3235
enum class EquipmentSort(val value: String) {
3336
Name("name");
@@ -46,8 +49,8 @@ class EquipmentRouter (httpClient: HttpClient) : Router(httpClient) {
4649
suspend fun all(
4750
organisationId: String,
4851
requestParameters: EquipmentRequestParameters = EquipmentRequestParameters()
49-
) : List<EquipmentItem> {
50-
return fetchJsonApiResources(
52+
) : PaginatedList<EquipmentItem> {
53+
return fetchPaginatedJsonApiResources(
5154
"/v3/orgs/$organisationId/assets/equipment",
5255
requestParameters.toMap()
5356
)

src/main/kotlin/com/ctrlhub/core/assets/equipment/exposures/EquipmentExposuresRouter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ enum class EquipmentExposureIncludes(val value: String) : JsonApiIncludes {
2121
}
2222

2323
class EquipmentExposureRequestParameters(
24+
offset: Int = 0,
25+
limit: Int = 100,
2426
filterOptions: List<FilterOption> = emptyList(),
2527
includes: List<EquipmentExposureIncludes> = emptyList()
26-
) : RequestParametersWithIncludes<EquipmentExposureIncludes>(filterOptions, includes)
28+
) : RequestParametersWithIncludes<EquipmentExposureIncludes>(offset, limit, filterOptions, includes)
2729

2830
/**
2931
* An equipment exposure router that deals with the exposures realm of the Ctrl Hub API

src/main/kotlin/com/ctrlhub/core/assets/vehicles/VehicleCategoriesRouter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ctrlhub.core.assets.vehicles
22

33
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.api.response.PaginatedList
45
import com.ctrlhub.core.assets.vehicles.resource.VehicleCategory
56
import com.ctrlhub.core.router.Router
67
import com.ctrlhub.core.router.request.RequestParameters
@@ -19,8 +20,8 @@ class VehicleCategoriesRouter(httpClient: HttpClient) : Router(httpClient) {
1920
*
2021
* @return A list of vehicle categories
2122
*/
22-
suspend fun all(requestParameters: RequestParameters = RequestParameters()): List<VehicleCategory> {
23-
return fetchJsonApiResources(endpoint, requestParameters.toMap())
23+
suspend fun all(requestParameters: RequestParameters = RequestParameters()): PaginatedList<VehicleCategory> {
24+
return fetchPaginatedJsonApiResources(endpoint, requestParameters.toMap())
2425
}
2526
}
2627

src/main/kotlin/com/ctrlhub/core/assets/vehicles/VehicleInspectionsRouter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ctrlhub.core.assets.vehicles
22

3+
import com.ctrlhub.core.api.response.PaginatedList
34
import com.ctrlhub.core.assets.vehicles.resource.VehicleInspection
45
import com.ctrlhub.core.router.Router
56
import com.ctrlhub.core.router.request.RequestParameters
@@ -24,10 +25,10 @@ class VehicleInspectionsRouter(httpClient: HttpClient) : Router(httpClient) {
2425
organisationId: String,
2526
vehicleId: String,
2627
requestParameters: RequestParameters = RequestParameters()
27-
): List<VehicleInspection> {
28+
): PaginatedList<VehicleInspection> {
2829
val endpoint = "/v3/orgs/$organisationId/assets/vehicles/$vehicleId/inspections"
2930

30-
return fetchJsonApiResources(endpoint, requestParameters.toMap())
31+
return fetchPaginatedJsonApiResources(endpoint, requestParameters.toMap())
3132
}
3233

3334
/**

src/main/kotlin/com/ctrlhub/core/assets/vehicles/VehicleManufacturersRouter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ctrlhub.core.assets.vehicles
22

33
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.api.response.PaginatedList
45
import com.ctrlhub.core.assets.vehicles.resource.VehicleManufacturer
56
import com.ctrlhub.core.assets.vehicles.resource.VehicleModel
67
import com.ctrlhub.core.router.Router
@@ -29,8 +30,8 @@ class VehicleManufacturersRouter(httpClient: HttpClient) : Router(httpClient) {
2930
*
3031
* @return A list of vehicle manufacturers
3132
*/
32-
suspend fun all(requestParameters: RequestParameters = RequestParameters()): List<VehicleManufacturer> {
33-
return fetchJsonApiResources(endpoint, requestParameters.toMap())
33+
suspend fun all(requestParameters: RequestParameters = RequestParameters()): PaginatedList<VehicleManufacturer> {
34+
return fetchPaginatedJsonApiResources(endpoint, requestParameters.toMap())
3435
}
3536

3637
suspend fun models(manufacturerId: String, requestParameters: RequestParameters = RequestParameters()): List<VehicleModel> {

src/main/kotlin/com/ctrlhub/core/assets/vehicles/VehiclesRouter.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ctrlhub.core.assets.vehicles
22

33
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.api.response.PaginatedList
45
import com.ctrlhub.core.assets.vehicles.resource.Vehicle
56
import com.ctrlhub.core.iam.response.User
67
import com.ctrlhub.core.router.Router
@@ -29,9 +30,11 @@ enum class VehicleIncludes(val value: String) : JsonApiIncludes {
2930
}
3031

3132
class VehicleRequestParameters(
33+
offset: Int = 0,
34+
limit: Int = 100,
3235
filterOptions: List<FilterOption> = emptyList(),
3336
includes: List<VehicleIncludes> = emptyList()
34-
) : RequestParametersWithIncludes<VehicleIncludes>(filterOptions, includes)
37+
) : RequestParametersWithIncludes<VehicleIncludes>(offset, limit, filterOptions, includes)
3538

3639
/**
3740
* A vehicles router that deals with the vehicles realm of the Ctrl Hub API
@@ -49,8 +52,8 @@ class VehiclesRouter(httpClient: HttpClient) : Router(httpClient) {
4952
suspend fun all(
5053
organisationId: String,
5154
requestParameters: VehicleRequestParameters = VehicleRequestParameters()
52-
): List<Vehicle> {
53-
return fetchJsonApiResources(
55+
): PaginatedList<Vehicle> {
56+
return fetchPaginatedJsonApiResources(
5457
"/v3/orgs/$organisationId/assets/vehicles",
5558
requestParameters.toMap(),
5659
User::class.java

src/main/kotlin/com/ctrlhub/core/datacapture/FormsRouter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.ctrlhub.core.datacapture
22

33
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.api.response.PaginatedList
45
import com.ctrlhub.core.datacapture.response.Form
56
import com.ctrlhub.core.router.Router
67
import io.ktor.client.HttpClient
78

89
class FormsRouter(httpClient: HttpClient) : Router(httpClient) {
9-
suspend fun all(organisationId: String): List<Form> {
10-
return fetchJsonApiResources("/v3/orgs/${organisationId}/data-capture/forms", emptyMap(), Form::class.java)
10+
suspend fun all(organisationId: String): PaginatedList<Form> {
11+
return fetchPaginatedJsonApiResources("/v3/orgs/${organisationId}/data-capture/forms", emptyMap(), Form::class.java)
1112
}
1213

1314
suspend fun one(organisationId: String, formId: String): Form {

src/main/kotlin/com/ctrlhub/core/governance/OrganisationsRouter.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.ctrlhub.core.governance
22

33
import com.ctrlhub.core.Api
4-
import com.ctrlhub.core.Config
54
import com.ctrlhub.core.api.ApiClientException
65
import com.ctrlhub.core.api.ApiException
6+
import com.ctrlhub.core.api.response.PaginatedList
77
import com.ctrlhub.core.governance.response.Organisation
88
import com.ctrlhub.core.router.Router
99
import com.ctrlhub.core.router.request.RequestParameters
10-
import com.github.jasminb.jsonapi.ResourceConverter
1110
import io.ktor.client.*
12-
import io.ktor.client.call.*
1311
import io.ktor.client.plugins.*
1412

1513
/**
@@ -18,16 +16,9 @@ import io.ktor.client.plugins.*
1816
class OrganisationsRouter(httpClient: HttpClient) : Router(httpClient) {
1917
private val endpoint = "/v3/orgs"
2018

21-
suspend fun all(requestParameters: RequestParameters = RequestParameters()): List<Organisation> {
19+
suspend fun all(requestParameters: RequestParameters = RequestParameters()): PaginatedList<Organisation> {
2220
return try {
23-
val rawResponse = performGet(endpoint, requestParameters.toMap())
24-
val resourceConverter = ResourceConverter(Organisation::class.java)
25-
val jsonApiResponse = resourceConverter.readDocumentCollection<Organisation>(
26-
(rawResponse.body<ByteArray>()),
27-
Organisation::class.java
28-
)
29-
30-
jsonApiResponse.get()!!
21+
fetchPaginatedJsonApiResources(endpoint, requestParameters.toMap(), Organisation::class.java)
3122
} catch (e: ClientRequestException) {
3223
throw ApiClientException("all organisations GET request failed", e.response, e)
3324
} catch (e: Exception) {

0 commit comments

Comments
 (0)