Skip to content

Commit 8996813

Browse files
committed
feat: form schemas with raw JSON content associated with them
1 parent 23a6d74 commit 8996813

File tree

5 files changed

+112
-34
lines changed

5 files changed

+112
-34
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.ctrlhub.core
2+
3+
import com.ctrlhub.core.api.response.CountsMeta
4+
import com.ctrlhub.core.api.response.OffsetsMeta
5+
import com.ctrlhub.core.api.response.PageMeta
6+
import com.ctrlhub.core.api.response.PaginationMeta
7+
import com.ctrlhub.core.api.response.RequestedMeta
8+
import kotlinx.serialization.json.*
9+
10+
fun extractPaginationFromMeta(json: JsonObject): PaginationMeta {
11+
val pagination = json["meta"]?.jsonObject?.get("pagination")?.jsonObject
12+
?: throw IllegalStateException("Missing pagination metadata")
13+
14+
val currentPage = pagination["current_page"]?.jsonPrimitive?.intOrNull ?: 1
15+
16+
val countsJson = pagination["counts"]?.jsonObject ?: JsonObject(emptyMap())
17+
val counts = CountsMeta(
18+
resources = countsJson["resources"]?.jsonPrimitive?.intOrNull ?: 0,
19+
pages = countsJson["pages"]?.jsonPrimitive?.intOrNull ?: 1
20+
)
21+
22+
val requestedJson = pagination["requested"]?.jsonObject ?: JsonObject(emptyMap())
23+
val requested = RequestedMeta(
24+
offset = requestedJson["offset"]?.jsonPrimitive?.intOrNull,
25+
limit = requestedJson["limit"]?.jsonPrimitive?.intOrNull
26+
)
27+
28+
val offsetsJson = pagination["offsets"]?.jsonObject ?: JsonObject(emptyMap())
29+
val offsets = OffsetsMeta(
30+
previous = offsetsJson["previous"]?.jsonPrimitive?.intOrNull,
31+
next = offsetsJson["next"]?.jsonPrimitive?.intOrNull
32+
)
33+
34+
return PaginationMeta(
35+
page = PageMeta(currentPage = currentPage),
36+
counts = counts,
37+
requested = requested,
38+
offsets = offsets
39+
)
40+
}

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

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,69 @@ package com.ctrlhub.core.datacapture
22

33
import com.ctrlhub.core.api.response.PaginatedList
44
import com.ctrlhub.core.datacapture.response.FormSchema
5+
import com.ctrlhub.core.extractPaginationFromMeta
56
import com.ctrlhub.core.router.Router
67
import com.ctrlhub.core.router.request.RequestParameters
78
import io.ktor.client.HttpClient
9+
import io.ktor.client.call.body
10+
import kotlinx.serialization.json.*
811

9-
/**
10-
* A router that interacts with the form schemas realm of the Ctrl Hub API
11-
*/
12-
class FormSchemasRouter(httpClient: HttpClient): Router(httpClient) {
13-
14-
/**
15-
* Get all form schemas for a given form and organisation
16-
*
17-
* @param organisationId String The organisation ID to retrieve all for schemas for
18-
* @param formId String The form ID to retrieve all schemas for
19-
*
20-
* @return A paginated response of all form schemas
21-
*/
22-
suspend fun all(organisationId: String, formId: String, requestParameters: RequestParameters = RequestParameters()): PaginatedList<FormSchema> {
12+
class FormSchemasRouter(httpClient: HttpClient) : Router(httpClient) {
13+
14+
suspend fun all(
15+
organisationId: String,
16+
formId: String,
17+
requestParameters: RequestParameters = RequestParameters()
18+
): PaginatedList<FormSchema> {
2319
val endpoint = "/v3/orgs/${organisationId}/data-capture/forms/{$formId}/schemas"
2420

25-
return fetchPaginatedJsonApiResources(endpoint, requestParameters.toMap(), FormSchema::class.java)
21+
val response = performGet(endpoint, requestParameters.toMap())
22+
val jsonContent = Json.parseToJsonElement(response.body<String>()).jsonObject
23+
24+
val dataArray = jsonContent["data"]?.jsonArray ?: JsonArray(emptyList())
25+
val formSchemas = dataArray.mapNotNull { item ->
26+
item.jsonObjectOrNull()?.let { instantiateFormSchemaFromJson(it) }
27+
}
28+
29+
return PaginatedList(
30+
data = formSchemas,
31+
pagination = extractPaginationFromMeta(jsonContent)
32+
)
2633
}
34+
35+
suspend fun one(
36+
organisationId: String,
37+
formId: String,
38+
schemaId: String,
39+
requestParameters: RequestParameters = RequestParameters()
40+
): FormSchema {
41+
val endpoint = "/v3/orgs/$organisationId/data-capture/forms/$formId/schemas/$schemaId"
42+
43+
val response = performGet(endpoint, requestParameters.toMap())
44+
val jsonContent = Json.parseToJsonElement(response.body<String>()).jsonObject
45+
46+
val dataObject = jsonContent["data"]?.jsonObject
47+
?: throw IllegalStateException("Missing data object")
48+
49+
return instantiateFormSchemaFromJson(dataObject)
50+
}
51+
52+
private fun instantiateFormSchemaFromJson(json: JsonObject): FormSchema {
53+
val id = json["id"]?.jsonPrimitive?.content
54+
?: throw IllegalStateException("Missing id")
55+
56+
val attributes = json["attributes"]?.jsonObject ?: JsonObject(emptyMap())
57+
val model = attributes["model"]?.jsonObjectOrNull()
58+
val views = attributes["views"]?.jsonObjectOrNull()
59+
60+
return FormSchema(
61+
id = id,
62+
modelConfig = model,
63+
viewsConfig = views,
64+
modelConfigStr = model?.toString() ?: "",
65+
viewsConfigStr = views?.toString() ?: ""
66+
)
67+
}
68+
69+
private fun JsonElement.jsonObjectOrNull(): JsonObject? = this as? JsonObject
2770
}
Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
package com.ctrlhub.core.datacapture.response
22

3-
import com.fasterxml.jackson.annotation.JsonCreator
4-
import com.fasterxml.jackson.annotation.JsonProperty
5-
import com.fasterxml.jackson.databind.JsonNode
6-
import com.github.jasminb.jsonapi.StringIdHandler
7-
import com.github.jasminb.jsonapi.annotations.Id
83
import com.github.jasminb.jsonapi.annotations.Type
4+
import kotlinx.serialization.json.JsonObject
95

106
@Type("form-schemas")
11-
data class FormSchema @JsonCreator constructor(
12-
@Id(StringIdHandler::class) val id: String = "",
13-
14-
@JsonProperty("model")
15-
private val modelNode: JsonNode,
16-
17-
@JsonProperty("views")
18-
private val viewsNode: JsonNode?
19-
) {
20-
val model: String = modelNode.toString()
21-
val views: String? = viewsNode?.toString()
22-
}
7+
data class FormSchema (
8+
val id: String,
9+
val modelConfigStr: String,
10+
val viewsConfigStr: String,
11+
12+
val modelConfig: JsonObject?,
13+
val viewsConfig: JsonObject?,
14+
)

src/test/kotlin/com/ctrlhub/core/datacapture/FormSchemasRouterTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ class FormSchemasRouterTest {
4343
assertEquals(1, response.data.size)
4444
val formSchema = response.data[0]
4545
assertEquals("1.0.0", formSchema.id)
46-
assertTrue(formSchema.model.contains("properties"))
46+
assertTrue(formSchema.modelConfigStr.isNotEmpty())
47+
assertTrue(formSchema.viewsConfigStr.isNotEmpty())
4748
}
4849
}
4950
}

src/test/resources/datacapture/all-form-schemas-response.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
},
1717
"type": "object"
1818
},
19-
"views": null
19+
"views": {
20+
"test": true
21+
}
2022
},
2123
"relationships": {
2224
"form": {

0 commit comments

Comments
 (0)