Skip to content

Commit 24fb8e4

Browse files
OV-449 auditing visit visitor changes. (#147)
1 parent 4e8b8cc commit 24fb8e4

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/OfficialVisitUpdateService.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,23 @@ class OfficialVisitUpdateService(
194194
visitorsAdded = addNewVisitors(ove, newVisitors.values, matchingContacts, user),
195195
visitorsDeleted = deleteExistingVisitors(ove, removedVisitors),
196196
visitorsUpdated = updateExistingVisitors(updatedVisitors, matchingContacts, user),
197-
)
197+
).also {
198+
auditingService.recordAuditEvent(
199+
auditVisitChangeEvent {
200+
officialVisitId(ove.officialVisitId)
201+
summaryText("Update visit visitors")
202+
eventSource("DPS")
203+
user(user)
204+
prisonCode(ove.prisonCode)
205+
prisonerNumber(ove.prisonerNumber)
206+
changes {
207+
change("_", 0, newVisitors.size, { _, new -> "Visitors added $new" })
208+
change("_", 0, updatedVisitors.size, { _, new -> "Visitors updated $new" })
209+
change("_", 0, removedVisitors.size, { _, new -> "Visitors removed $new" })
210+
}
211+
},
212+
)
213+
}
198214
}
199215

200216
private fun OfficialVisitor.isNewVisitor() = officialVisitorId == 0L

src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditingService.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,24 +113,24 @@ class ChangeVisitDsl : AuditEventDsl() {
113113
changes.changes().joinToString(
114114
separator = "; ",
115115
postfix = ".",
116-
) { "${it.descriptiveText} changed from ${it.old ?: "''"} to ${it.new ?: "''"}" }
116+
) { it.alternativeText(it.old, it.new) ?: "${it.descriptiveText} changed from ${it.old ?: "''"} to ${it.new ?: "''"}" }
117117
}
118118

119119
@AuditEventDslMarker
120120
class Changes {
121121
private val changes = mutableListOf<Change<*>>()
122122

123-
fun change(descriptiveText: String, old: Any?, new: Any?) {
124-
changes.add(Change(descriptiveText, old, new))
123+
fun change(descriptiveText: String, old: Any?, new: Any?, alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) {
124+
changes.add(Change(descriptiveText, old, new, alternativeText))
125125
}
126126

127-
fun change(descriptiveText: String, old: LocalDate?, new: LocalDate?) {
128-
changes.add(Change(descriptiveText, old?.toMediumFormatStyle(), new?.toMediumFormatStyle()))
127+
fun change(descriptiveText: String, old: LocalDate?, new: LocalDate?, alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) {
128+
changes.add(Change(descriptiveText, old?.toMediumFormatStyle(), new?.toMediumFormatStyle(), alternativeText))
129129
}
130130

131131
fun changes() = changes.filter { it.hasChanged }
132132

133-
data class Change<T : Any>(val descriptiveText: String, val old: T?, val new: T?) {
133+
data class Change<T : Any>(val descriptiveText: String, val old: T?, val new: T?, val alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) {
134134
val hasChanged: Boolean = old != new
135135
}
136136
}

src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/integration/resource/OfficialVisitUpdateIntegrationTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND_PRISONER
1313
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND_PRISON_USER
1414
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.Moorland
1515
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.createOfficialVisitRequest
16+
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.hasSize
17+
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.isCloseTo
1618
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.isEqualTo
1719
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.moorlandLocation
20+
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.now
1821
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.prisonerContact
1922
import uk.gov.justice.digital.hmpps.officialvisitsapi.integration.IntegrationTestBase
2023
import uk.gov.justice.digital.hmpps.officialvisitsapi.model.VisitType
@@ -308,6 +311,24 @@ class OfficialVisitUpdateIntegrationTest : IntegrationTestBase() {
308311
visitorNotes isEqualTo "visitor notes updated"
309312
visitorEquipment isEqualTo null
310313
}
314+
315+
val auditEvents = auditedEventRepository.findAll()
316+
317+
auditEvents hasSize 2
318+
319+
auditEvents.single { it.summaryText == "Official visit created" }
320+
321+
with(auditEvents.single { it.summaryText == "Update visit visitors" }) {
322+
officialVisitId isEqualTo result.officialVisitId
323+
prisonCode isEqualTo MOORLAND
324+
prisonerNumber isEqualTo MOORLAND_PRISONER.number
325+
summaryText isEqualTo "Update visit visitors"
326+
detailText isEqualTo "Visitors added 1; Visitors updated 1; Visitors removed 1."
327+
userName isEqualTo MOORLAND_PRISON_USER.username
328+
userFullName isEqualTo MOORLAND_PRISON_USER.name
329+
eventSource isEqualTo Source.DPS.name
330+
eventDateTime isCloseTo now()
331+
}
311332
}
312333

313334
@Test

src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditEventServiceTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,30 @@ class AuditEventServiceTest {
8383
}
8484
}
8585

86+
@Test
87+
fun `should be audit change event with alternative text`() {
88+
val auditEvent = auditVisitChangeEvent {
89+
officialVisitId(1)
90+
summaryText("Test summary change text")
91+
eventSource("DPS")
92+
user(MOORLAND_PRISON_USER)
93+
prisonCode(MOORLAND)
94+
prisonerNumber("A1234AA")
95+
changes { change("FIELD_1", 1, 2, { old, new -> "Field 1 was $old now $new" }) }
96+
}
97+
98+
with(auditEvent) {
99+
officialVisitId isEqualTo 1
100+
summaryText isEqualTo "Test summary change text"
101+
eventSource isEqualTo "DPS"
102+
eventDateTime isCloseTo now()
103+
username isEqualTo MOORLAND_PRISON_USER.username
104+
userFullName isEqualTo MOORLAND_PRISON_USER.name
105+
prisonerNumber isEqualTo "A1234AA"
106+
detailText isEqualTo "Field 1 was 1 now 2."
107+
}
108+
}
109+
86110
@Test
87111
fun `should be audit change event with truncated details`() {
88112
val auditEvent = auditVisitChangeEvent {

0 commit comments

Comments
 (0)