Skip to content

Commit a6efd54

Browse files
HMAI-336 - Visit queue event schema (#759)
* Add new controller models * Added visit queue event model * Add mapper to VisitQueueEvent * Add test for converting to visit queue event
1 parent 159ea61 commit a6efd54

File tree

7 files changed

+170
-0
lines changed

7 files changed

+170
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper
4+
import io.swagger.v3.oas.annotations.media.Schema
5+
import jakarta.validation.Valid
6+
import jakarta.validation.constraints.NotBlank
7+
import jakarta.validation.constraints.NotNull
8+
import java.time.LocalDateTime
9+
10+
@Schema(description = "Private prison visit request")
11+
data class CreateVisitRequest(
12+
@Schema(description = "Prisoner Id", example = "AF34567G", required = true)
13+
@field:NotBlank
14+
val prisonerId: String,
15+
@Schema(description = "Prison Id", example = "3-character code, example = MDI", required = true)
16+
@field:NotBlank
17+
val prisonId: String,
18+
@Schema(description = "Client visit reference", example = "Reference ID in the client system", required = true)
19+
@field:NotBlank
20+
val clientVisitReference: String,
21+
@Schema(description = "Visit Room", example = "A1", required = true)
22+
@field:NotBlank
23+
val visitRoom: String,
24+
@Schema(description = "Visit Type", example = "SOCIAL", required = true)
25+
@field:NotNull
26+
val visitType: VisitType,
27+
@Schema(description = "Visit Status", example = "BOOKED", required = true)
28+
@field:NotNull
29+
val visitStatus: VisitStatus,
30+
@Schema(description = "Visit Restriction", example = "OPEN", required = true)
31+
@field:NotNull
32+
val visitRestriction: VisitRestriction,
33+
@Schema(description = "The date and time of the visit", example = "2018-12-01T13:45:00", required = true)
34+
@field:NotNull
35+
val startTimestamp: LocalDateTime,
36+
@Schema(description = "The finishing date and time of the visit", example = "2018-12-01T13:45:00", required = true)
37+
@field:NotNull
38+
val endTimestamp: LocalDateTime,
39+
@Schema(description = "The date and time of when the visit was created in NEXUS", example = "2018-12-01T13:45:00", required = false)
40+
val createDateTime: LocalDateTime? = null,
41+
@Schema(description = "List of visitors associated with the visit", required = false)
42+
val visitors: Set<@Valid Visitor>? = setOf(),
43+
@Schema(description = "Username for user who actioned this request", required = false)
44+
val actionedBy: String?,
45+
) {
46+
fun toVisitQueueEvent(who: String): VisitQueueEvent {
47+
val objectMapper = ObjectMapper()
48+
49+
return VisitQueueEvent(
50+
eventType = VisitQueueEventType.CREATE,
51+
payload = objectMapper.writeValueAsString(modelToMap()),
52+
who = who,
53+
)
54+
}
55+
56+
private fun modelToMap(): Map<String, Any?> =
57+
mapOf(
58+
"prisonerId" to this.prisonerId,
59+
"prisonId" to this.prisonId,
60+
"clientVisitReference" to this.clientVisitReference,
61+
"visitRoom" to this.visitRoom,
62+
"visitType" to this.visitType,
63+
"visitStatus" to this.visitStatus,
64+
"visitRestriction" to this.visitRestriction,
65+
"startTimestamp" to this.startTimestamp.toString(),
66+
"endTimestamp" to this.endTimestamp.toString(),
67+
"createDateTime" to this.createDateTime.toString(),
68+
"visitors" to this.visitors?.map { mapOf("nomisPersonId" to it.nomisPersonId, "visitContact" to it.visitContact) },
69+
"actionedBy" to this.actionedBy,
70+
)
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
import java.time.ZoneId
4+
import java.time.ZonedDateTime
5+
import java.time.format.DateTimeFormatter
6+
7+
data class VisitQueueEvent(
8+
val eventType: VisitQueueEventType,
9+
val payload: String,
10+
val who: String,
11+
) {
12+
val `when`: String = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault()).format(ZonedDateTime.now())
13+
val service = "hmpps-integration-api"
14+
}
15+
16+
enum class VisitQueueEventType {
17+
CREATE,
18+
UPDATE,
19+
DELETE,
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
enum class VisitRestriction {
4+
OPEN,
5+
CLOSED,
6+
UNKNOWN,
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
enum class VisitStatus {
4+
BOOKED,
5+
CANCELLED,
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
enum class VisitType {
4+
SOCIAL,
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
data class Visitor(
4+
val nomisPersonId: Long,
5+
val visitContact: Boolean?,
6+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
import io.kotest.core.spec.style.DescribeSpec
4+
import io.kotest.matchers.shouldBe
5+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines
6+
import java.time.LocalDateTime
7+
8+
class CreateVisitRequestTest :
9+
DescribeSpec(
10+
{
11+
it("correctly creates visit queue event") {
12+
val consumerName = "client-name"
13+
val createVisitRequest =
14+
CreateVisitRequest(
15+
prisonerId = "A1234AB",
16+
prisonId = "MDI",
17+
clientVisitReference = "123456",
18+
visitRoom = "A1",
19+
visitType = VisitType.SOCIAL,
20+
visitStatus = VisitStatus.BOOKED,
21+
visitRestriction = VisitRestriction.OPEN,
22+
startTimestamp = LocalDateTime.parse("2020-12-04T10:42:43"),
23+
endTimestamp = LocalDateTime.parse("2020-12-04T10:42:43"),
24+
createDateTime = LocalDateTime.parse("2020-12-04T10:42:43"),
25+
visitors = setOf(Visitor(nomisPersonId = 3L, visitContact = true)),
26+
actionedBy = "test-consumer",
27+
)
28+
29+
val visitQueueEvent = createVisitRequest.toVisitQueueEvent(consumerName)
30+
visitQueueEvent.eventType.shouldBe(VisitQueueEventType.CREATE)
31+
visitQueueEvent.payload.shouldBe(
32+
"""
33+
{
34+
"prisonerId" : "A1234AB",
35+
"prisonId" : "MDI",
36+
"clientVisitReference" : "123456",
37+
"visitRoom" : "A1",
38+
"visitType" : "SOCIAL",
39+
"visitStatus" : "BOOKED",
40+
"visitRestriction" : "OPEN",
41+
"startTimestamp" : "2020-12-04T10:42:43",
42+
"endTimestamp" : "2020-12-04T10:42:43",
43+
"createDateTime" : "2020-12-04T10:42:43",
44+
"visitors" : [ {
45+
"nomisPersonId" : 3,
46+
"visitContact" : true
47+
} ],
48+
"actionedBy" : "test-consumer"
49+
}
50+
""".removeWhitespaceAndNewlines(),
51+
)
52+
visitQueueEvent.who.shouldBe(consumerName)
53+
}
54+
},
55+
)

0 commit comments

Comments
 (0)