Skip to content

Commit b1cc56a

Browse files
committed
feat: implement equipment router
1 parent 8131ede commit b1cc56a

File tree

6 files changed

+619
-0
lines changed

6 files changed

+619
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.ctrlhub.core.assets.equipment
2+
3+
import com.ctrlhub.core.Api
4+
import com.ctrlhub.core.assets.equipment.resource.EquipmentItem
5+
import com.ctrlhub.core.router.Router
6+
import com.ctrlhub.core.router.request.FilterOption
7+
import com.ctrlhub.core.router.request.JsonApiIncludes
8+
import com.ctrlhub.core.router.request.RequestParametersWithIncludes
9+
import io.ktor.client.HttpClient
10+
11+
enum class EquipmentIncludes(val value: String) : JsonApiIncludes {
12+
Model("model"),
13+
ModelManufacturer("model.manufacturer"),
14+
ModelCategory("model.categories"),
15+
Vehicle("vehicle"),
16+
VehicleEquipment("vehicle.equipment"),
17+
VehicleSpecification("vehicle.specification"),
18+
VehicleSpecificationModel("vehicle.specification.model"),
19+
VehicleSpecificationModelManufacturer("vehicle.specification.model.manufacturer"),
20+
VehicleSpecificationModelCategories("vehicle.specification.model.categories");
21+
22+
override fun value(): String {
23+
return value
24+
}
25+
}
26+
27+
class EquipmentRequestParameters(
28+
filterOptions: List<FilterOption> = emptyList(),
29+
includes: List<EquipmentIncludes> = emptyList()
30+
) : RequestParametersWithIncludes<EquipmentIncludes>(filterOptions, includes)
31+
32+
enum class EquipmentSort(val value: String) {
33+
Name("name");
34+
}
35+
36+
class EquipmentRouter (httpClient: HttpClient) : Router(httpClient) {
37+
38+
/**
39+
* Retrieve a list of all equipment items
40+
*
41+
* @param organisationId String The organisation ID to retrieve all equipment items for
42+
* @param requestParameters RequestParameters An instance of EquipmentRequestParameters, capturing sorting, filtering and pagination based request params
43+
*
44+
* @return A list of all equipment items
45+
*/
46+
suspend fun all(
47+
organisationId: String,
48+
requestParameters: EquipmentRequestParameters = EquipmentRequestParameters()
49+
) : List<EquipmentItem> {
50+
return fetchJsonApiResources(
51+
"/v3/orgs/$organisationId/assets/equipment",
52+
requestParameters.toMap()
53+
)
54+
}
55+
56+
/**
57+
* Retrieve a single equipment item
58+
*
59+
* @param organisationId String The organisation ID related to the equipment item
60+
* @param equipmentId String The equipment ID to retrieve the item for
61+
* @param requestParameters RequestParameters An instance of EquipmentRequestParameters, capturing sorting, filtering and pagination based request params
62+
*
63+
* @return An equipment record
64+
*/
65+
suspend fun one(
66+
organisationId: String,
67+
equipmentId: String,
68+
requestParameters: EquipmentRequestParameters = EquipmentRequestParameters()
69+
): EquipmentItem {
70+
return fetchJsonApiResource(
71+
"/v3/orgs/$organisationId/assets/equipment/$equipmentId",
72+
requestParameters.toMap()
73+
)
74+
}
75+
}
76+
77+
val Api.equipment: EquipmentRouter
78+
get() = EquipmentRouter(httpClient)
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.ctrlhub.core.assets.equipment.resource
2+
3+
import com.ctrlhub.core.assets.vehicles.resource.Vehicle
4+
import com.fasterxml.jackson.annotation.JsonCreator
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
6+
import com.fasterxml.jackson.annotation.JsonProperty
7+
import com.github.jasminb.jsonapi.StringIdHandler
8+
import com.github.jasminb.jsonapi.annotations.Id
9+
import com.github.jasminb.jsonapi.annotations.Meta
10+
import com.github.jasminb.jsonapi.annotations.Relationship
11+
import com.github.jasminb.jsonapi.annotations.Type
12+
import java.time.LocalDateTime
13+
14+
@Type("equipment-items")
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
class EquipmentItem @JsonCreator constructor(
17+
@JsonProperty("id") @Id(StringIdHandler::class) var id: String = "",
18+
@JsonProperty("serial") var serial: String = "",
19+
@JsonProperty("status") var status: String? = null,
20+
21+
@Relationship("model")
22+
var model: EquipmentModel? = null,
23+
24+
@Relationship("vehicle")
25+
var vehicle: Vehicle? = null,
26+
27+
@Meta
28+
var meta: EquipmentMeta? = null,
29+
) {
30+
constructor() : this(
31+
id = "",
32+
serial = "",
33+
status = null
34+
)
35+
}
36+
37+
class EquipmentMeta @JsonCreator constructor(
38+
@JsonProperty("created_at") var createdAt: LocalDateTime? = null,
39+
@JsonProperty("modified_at") var modifiedAt: LocalDateTime? = null,
40+
@JsonProperty("exposure_count") var exposureCount: Int = 0
41+
) {
42+
constructor() : this(
43+
createdAt = null,
44+
modifiedAt = null,
45+
exposureCount = 0
46+
)
47+
}
48+
49+
@Type("equipment-models")
50+
@JsonIgnoreProperties(ignoreUnknown = true)
51+
class EquipmentModel @JsonCreator constructor(
52+
@JsonProperty("id") @Id(StringIdHandler::class) var id: String = "",
53+
@JsonProperty("name") var name: String = "",
54+
@JsonProperty("description") var description: String? = null,
55+
@JsonProperty("specification") var specification: EquipmentModelSpecification? = null,
56+
57+
@Relationship("category")
58+
var category: EquipmentCategory? = null,
59+
60+
@Relationship("manufacturer")
61+
var manufacturer: EquipmentManufacturer? = null,
62+
) {
63+
constructor(): this(
64+
id = "",
65+
name = "",
66+
description = null,
67+
specification = null,
68+
category = null,
69+
manufacturer = null
70+
)
71+
}
72+
73+
class EquipmentModelSpecification @JsonCreator constructor(
74+
@JsonProperty("vibration") vibration: EquipmentSpecificationVibration? = null
75+
) {
76+
constructor(): this(
77+
vibration = null
78+
)
79+
}
80+
81+
class EquipmentSpecificationVibration @JsonCreator constructor(
82+
@JsonProperty("magnitude") magnitude: Double = 0.0
83+
) {
84+
constructor(): this(
85+
magnitude = 0.0
86+
)
87+
}
88+
89+
@Type("equipment-categories")
90+
@JsonIgnoreProperties(ignoreUnknown = true)
91+
class EquipmentCategory @JsonCreator constructor(
92+
@JsonProperty("id") @Id(StringIdHandler::class) var id: String = "",
93+
@JsonProperty("name") var name: String = ""
94+
) {
95+
constructor() : this(
96+
id = "",
97+
name = ""
98+
)
99+
}
100+
101+
@Type("equipment-manufacturers")
102+
@JsonIgnoreProperties(ignoreUnknown = true)
103+
class EquipmentManufacturer @JsonCreator constructor(
104+
@JsonProperty("id") @Id(StringIdHandler::class) var id: String = "",
105+
@JsonProperty("name") var name: String = ""
106+
) {
107+
constructor(): this(
108+
id = "",
109+
name = ""
110+
)
111+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.ctrlhub.core.assets.equipment
2+
3+
import com.ctrlhub.core.assets.equipment.resource.EquipmentItem
4+
import com.ctrlhub.core.assets.vehicles.VehicleIncludes
5+
import com.ctrlhub.core.assets.vehicles.VehicleRequestParameters
6+
import com.ctrlhub.core.assets.vehicles.VehiclesRouter
7+
import com.ctrlhub.core.assets.vehicles.resource.Vehicle
8+
import com.ctrlhub.core.configureForTest
9+
import io.ktor.client.HttpClient
10+
import io.ktor.client.engine.mock.MockEngine
11+
import io.ktor.client.engine.mock.respond
12+
import io.ktor.http.HttpHeaders
13+
import io.ktor.http.HttpStatusCode
14+
import io.ktor.http.headersOf
15+
import kotlinx.coroutines.runBlocking
16+
import org.junit.jupiter.api.Test
17+
import java.nio.file.Files
18+
import java.nio.file.Paths
19+
import kotlin.test.assertIs
20+
import kotlin.test.assertNotNull
21+
22+
class EquipmentRouterTest {
23+
@Test
24+
fun `can retrieve all equipment items`() {
25+
val jsonFilePath = Paths.get("src/test/resources/assets/equipment/all-equipment-response-with-includes.json")
26+
val jsonContent = Files.readString(jsonFilePath)
27+
28+
val mockEngine = MockEngine { request ->
29+
respond(
30+
content = jsonContent,
31+
status = HttpStatusCode.OK,
32+
headers = headersOf(HttpHeaders.ContentType, "application/json")
33+
)
34+
}
35+
36+
val equipmentRouter = EquipmentRouter(httpClient = HttpClient(mockEngine).configureForTest())
37+
38+
runBlocking {
39+
val response = equipmentRouter.all(organisationId = "123", EquipmentRequestParameters(
40+
includes = listOf(
41+
EquipmentIncludes.ModelManufacturer,
42+
EquipmentIncludes.ModelCategory
43+
)
44+
))
45+
assertIs<List<EquipmentItem>>(response)
46+
assertNotNull(response[0].id)
47+
}
48+
}
49+
50+
@Test
51+
fun `can retrieve one equipment item`() {
52+
val jsonFilePath = Paths.get("src/test/resources/assets/equipment/one-equipment-response.json")
53+
val jsonContent = Files.readString(jsonFilePath)
54+
55+
val mockEngine = MockEngine { request ->
56+
respond(
57+
content = jsonContent,
58+
status = HttpStatusCode.OK,
59+
headers = headersOf(HttpHeaders.ContentType, "application/json")
60+
)
61+
}
62+
63+
val equipmentRouter = EquipmentRouter(httpClient = HttpClient(mockEngine).configureForTest())
64+
65+
runBlocking {
66+
val response = equipmentRouter.one(organisationId = "123", equipmentId = "123", EquipmentRequestParameters(
67+
includes = listOf(
68+
EquipmentIncludes.ModelManufacturer,
69+
EquipmentIncludes.ModelCategory
70+
)
71+
))
72+
73+
assertIs<EquipmentItem>(response)
74+
assertNotNull(response.id)
75+
}
76+
}
77+
78+
@Test
79+
fun `can retrieve an equipment item with includes`() {
80+
val jsonFilePath = Paths.get("src/test/resources/assets/equipment/one-equipment-response-with-includes.json")
81+
val jsonContent = Files.readString(jsonFilePath)
82+
83+
val mockEngine = MockEngine { request ->
84+
respond(
85+
content = jsonContent,
86+
status = HttpStatusCode.OK,
87+
headers = headersOf(HttpHeaders.ContentType, "application/json")
88+
)
89+
}
90+
91+
val equipmentRouter = EquipmentRouter(httpClient = HttpClient(mockEngine).configureForTest())
92+
93+
runBlocking {
94+
val response = equipmentRouter.one(organisationId = "123", equipmentId = "123", EquipmentRequestParameters(
95+
includes = listOf(
96+
EquipmentIncludes.ModelManufacturer,
97+
)
98+
))
99+
100+
assertIs<EquipmentItem>(response)
101+
assertNotNull(response.id)
102+
assertNotNull(response.model!!.name)
103+
assertNotNull(response.model!!.manufacturer!!.name)
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)