diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/OfficialVisitUpdateService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/OfficialVisitUpdateService.kt index 3ee6ed23..26ad893a 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/OfficialVisitUpdateService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/OfficialVisitUpdateService.kt @@ -194,7 +194,23 @@ class OfficialVisitUpdateService( visitorsAdded = addNewVisitors(ove, newVisitors.values, matchingContacts, user), visitorsDeleted = deleteExistingVisitors(ove, removedVisitors), visitorsUpdated = updateExistingVisitors(updatedVisitors, matchingContacts, user), - ) + ).also { + auditingService.recordAuditEvent( + auditVisitChangeEvent { + officialVisitId(ove.officialVisitId) + summaryText("Update visit visitors") + eventSource("DPS") + user(user) + prisonCode(ove.prisonCode) + prisonerNumber(ove.prisonerNumber) + changes { + change("_", 0, newVisitors.size, { _, new -> "Visitors added $new" }) + change("_", 0, updatedVisitors.size, { _, new -> "Visitors updated $new" }) + change("_", 0, removedVisitors.size, { _, new -> "Visitors removed $new" }) + } + }, + ) + } } private fun OfficialVisitor.isNewVisitor() = officialVisitorId == 0L diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditingService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditingService.kt index 970f24e5..0f09d204 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditingService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditingService.kt @@ -113,24 +113,24 @@ class ChangeVisitDsl : AuditEventDsl() { changes.changes().joinToString( separator = "; ", postfix = ".", - ) { "${it.descriptiveText} changed from ${it.old ?: "''"} to ${it.new ?: "''"}" } + ) { it.alternativeText(it.old, it.new) ?: "${it.descriptiveText} changed from ${it.old ?: "''"} to ${it.new ?: "''"}" } } @AuditEventDslMarker class Changes { private val changes = mutableListOf>() - fun change(descriptiveText: String, old: Any?, new: Any?) { - changes.add(Change(descriptiveText, old, new)) + fun change(descriptiveText: String, old: Any?, new: Any?, alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) { + changes.add(Change(descriptiveText, old, new, alternativeText)) } - fun change(descriptiveText: String, old: LocalDate?, new: LocalDate?) { - changes.add(Change(descriptiveText, old?.toMediumFormatStyle(), new?.toMediumFormatStyle())) + fun change(descriptiveText: String, old: LocalDate?, new: LocalDate?, alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) { + changes.add(Change(descriptiveText, old?.toMediumFormatStyle(), new?.toMediumFormatStyle(), alternativeText)) } fun changes() = changes.filter { it.hasChanged } - data class Change(val descriptiveText: String, val old: T?, val new: T?) { + data class Change(val descriptiveText: String, val old: T?, val new: T?, val alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) { val hasChanged: Boolean = old != new } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/integration/resource/OfficialVisitUpdateIntegrationTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/integration/resource/OfficialVisitUpdateIntegrationTest.kt index dbba8d08..6518df0d 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/integration/resource/OfficialVisitUpdateIntegrationTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/integration/resource/OfficialVisitUpdateIntegrationTest.kt @@ -13,8 +13,11 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND_PRISONER import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND_PRISON_USER import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.Moorland import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.createOfficialVisitRequest +import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.hasSize +import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.isCloseTo import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.isEqualTo import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.moorlandLocation +import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.now import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.prisonerContact import uk.gov.justice.digital.hmpps.officialvisitsapi.integration.IntegrationTestBase import uk.gov.justice.digital.hmpps.officialvisitsapi.model.VisitType @@ -308,6 +311,24 @@ class OfficialVisitUpdateIntegrationTest : IntegrationTestBase() { visitorNotes isEqualTo "visitor notes updated" visitorEquipment isEqualTo null } + + val auditEvents = auditedEventRepository.findAll() + + auditEvents hasSize 2 + + auditEvents.single { it.summaryText == "Official visit created" } + + with(auditEvents.single { it.summaryText == "Update visit visitors" }) { + officialVisitId isEqualTo result.officialVisitId + prisonCode isEqualTo MOORLAND + prisonerNumber isEqualTo MOORLAND_PRISONER.number + summaryText isEqualTo "Update visit visitors" + detailText isEqualTo "Visitors added 1; Visitors updated 1; Visitors removed 1." + userName isEqualTo MOORLAND_PRISON_USER.username + userFullName isEqualTo MOORLAND_PRISON_USER.name + eventSource isEqualTo Source.DPS.name + eventDateTime isCloseTo now() + } } @Test diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditEventServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditEventServiceTest.kt index 6a7a163d..c148deac 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditEventServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/officialvisitsapi/service/auditing/AuditEventServiceTest.kt @@ -83,6 +83,30 @@ class AuditEventServiceTest { } } + @Test + fun `should be audit change event with alternative text`() { + val auditEvent = auditVisitChangeEvent { + officialVisitId(1) + summaryText("Test summary change text") + eventSource("DPS") + user(MOORLAND_PRISON_USER) + prisonCode(MOORLAND) + prisonerNumber("A1234AA") + changes { change("FIELD_1", 1, 2, { old, new -> "Field 1 was $old now $new" }) } + } + + with(auditEvent) { + officialVisitId isEqualTo 1 + summaryText isEqualTo "Test summary change text" + eventSource isEqualTo "DPS" + eventDateTime isCloseTo now() + username isEqualTo MOORLAND_PRISON_USER.username + userFullName isEqualTo MOORLAND_PRISON_USER.name + prisonerNumber isEqualTo "A1234AA" + detailText isEqualTo "Field 1 was 1 now 2." + } + } + @Test fun `should be audit change event with truncated details`() { val auditEvent = auditVisitChangeEvent {