Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Change<*>>()

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<T : Any>(val descriptiveText: String, val old: T?, val new: T?) {
data class Change<T : Any>(val descriptiveText: String, val old: T?, val new: T?, val alternativeText: (old: Any?, new: Any?) -> String? = { _, _ -> null }) {
val hasChanged: Boolean = old != new
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading