Skip to content

Commit 0bd42fd

Browse files
OV-449 audit update of visit comments changes.
1 parent 5069a04 commit 0bd42fd

File tree

5 files changed

+89
-6
lines changed

5 files changed

+89
-6
lines changed

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ class OfficialVisitUpdateService(
9393
startTime = it.startTime,
9494
),
9595
)
96-
}.also {
97-
auditingService.recordAuditEvent(auditChangeEvent)
9896
}
9997

98+
auditingService.recordAuditEvent(auditChangeEvent)
99+
100100
return OfficialVisitUpdateSlotResponse(
101101
officialVisitId = updatedVisit.officialVisitId,
102102
prisonerNumber = updatedVisit.prisonerNumber,
@@ -116,6 +116,19 @@ class OfficialVisitUpdateService(
116116
val ove = officialVisitRepository.findByOfficialVisitIdAndPrisonCode(officialVisitId, prisonCode)
117117
?: throw EntityNotFoundException("Official visit with id $officialVisitId and prison code $prisonCode not found")
118118

119+
val auditChangeEvent = auditVisitChangeEvent {
120+
officialVisitId(ove.officialVisitId)
121+
summaryText("Update visit comments")
122+
eventSource("DPS")
123+
user(user)
124+
prisonCode(ove.prisonCode)
125+
prisonerNumber(ove.prisonerNumber)
126+
changes {
127+
change("Prisoner notes", ove.prisonerNotes, request.prisonerNotes)
128+
change("Staff notes", ove.staffNotes, request.staffNotes)
129+
}
130+
}
131+
119132
val updatedVisit = officialVisitRepository.saveAndFlush(
120133
ove.apply {
121134
staffNotes = request.staffNotes
@@ -137,6 +150,8 @@ class OfficialVisitUpdateService(
137150
)
138151
}
139152

153+
auditingService.recordAuditEvent(auditChangeEvent)
154+
140155
return OfficialVisitUpdateCommentsResponse(
141156
officialVisitId = updatedVisit.officialVisitId,
142157
prisonerNumber = updatedVisit.prisonerNumber,

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ abstract class AuditEventDsl {
8383
username = user.username,
8484
userFullName = user.name,
8585
summaryText = summaryText,
86-
detailText = detailsText(),
86+
detailText = detailsText().take(1000),
8787
)
8888
}
8989
}
@@ -108,10 +108,12 @@ class ChangeVisitDsl : AuditEventDsl() {
108108
}
109109

110110
override fun detailsText(): String = run {
111+
if (changes.changes().isEmpty()) return@run "No recorded changes."
112+
111113
changes.changes().joinToString(
112114
separator = "; ",
113115
postfix = ".",
114-
) { "${it.descriptiveText} changed from ${it.old} to ${it.new}" }
116+
) { "${it.descriptiveText} changed from ${it.old ?: "''"} to ${it.new ?: "''"}" }
115117
}
116118

117119
@AuditEventDslMarker
@@ -126,9 +128,11 @@ class ChangeVisitDsl : AuditEventDsl() {
126128
changes.add(Change(descriptiveText, old?.toMediumFormatStyle(), new?.toMediumFormatStyle()))
127129
}
128130

129-
fun changes() = changes.filter { it.old != it.new }
131+
fun changes() = changes.filter { it.hasChanged }
130132

131-
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?) {
134+
val hasChanged: Boolean = old != new
135+
}
132136
}
133137
}
134138

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
alter table audited_event alter column detail_text type varchar(1000);

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,21 @@ class OfficialVisitUpdateServiceTest {
181181
assertThat(visit.updatedBy).isEqualTo(MOORLAND_PRISON_USER.username)
182182
assertThat(visit.updatedTime).isNotNull
183183
verify(officialVisitRepository, times(1)).saveAndFlush(visit)
184+
185+
val auditEventCaptor = argumentCaptor<AuditEventDto>()
186+
verify(auditingService).recordAuditEvent(auditEventCaptor.capture())
187+
188+
with(auditEventCaptor.firstValue) {
189+
officialVisitId isEqualTo 7
190+
prisonerNumber isEqualTo MOORLAND_PRISONER.number
191+
prisonCode isEqualTo MOORLAND
192+
eventSource isEqualTo "DPS"
193+
username isEqualTo MOORLAND_PRISON_USER.username
194+
userFullName isEqualTo MOORLAND_PRISON_USER.name
195+
summaryText isEqualTo "Update visit comments"
196+
detailText isEqualTo "Prisoner notes changed from '' to prisoner updated; Staff notes changed from '' to staff updated."
197+
eventDateTime isCloseTo now()
198+
}
184199
}
185200

186201
@Test

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,54 @@ class AuditEventServiceTest {
5959
}
6060
}
6161

62+
@Test
63+
fun `should be audit change event with no recorded changes`() {
64+
val auditEvent = auditVisitChangeEvent {
65+
officialVisitId(1)
66+
summaryText("Test summary change text")
67+
eventSource("DPS")
68+
user(MOORLAND_PRISON_USER)
69+
prisonCode(MOORLAND)
70+
prisonerNumber("A1234AA")
71+
changes { change("FIELD_1", 1, 1) }
72+
}
73+
74+
with(auditEvent) {
75+
officialVisitId isEqualTo 1
76+
summaryText isEqualTo "Test summary change text"
77+
eventSource isEqualTo "DPS"
78+
eventDateTime isCloseTo now()
79+
username isEqualTo MOORLAND_PRISON_USER.username
80+
userFullName isEqualTo MOORLAND_PRISON_USER.name
81+
prisonerNumber isEqualTo "A1234AA"
82+
detailText isEqualTo "No recorded changes."
83+
}
84+
}
85+
86+
@Test
87+
fun `should be audit change event with truncated details`() {
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", "a".repeat(1), "b".repeat(1001)) }
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 changed from a to ".plus("b".repeat(1001)).take(1000)
107+
}
108+
}
109+
62110
@Test
63111
fun `should be audit cancellation event when recorded changes`() {
64112
val auditEvent = auditVisitCancellationEvent {

0 commit comments

Comments
 (0)