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 @@ -53,7 +53,7 @@ abstract class AuditEventDsl {
}

fun summaryText(st: String) {
summaryText = st
summaryText = st.trim()
}

fun eventSource(es: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitRe
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitorRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.PrisonVisitSlotRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.PrisonerVisitedRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.UserService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditingService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.auditVisitCreateEvent
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.events.outbound.Source
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.metrics.MetricsEvents
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.metrics.MetricsService
Expand All @@ -27,7 +30,8 @@ class SyncOfficialVisitService(
private val officialVisitorRepository: OfficialVisitorRepository,
private val prisonerVisitedRepository: PrisonerVisitedRepository,
private val prisonVisitSlotRepository: PrisonVisitSlotRepository,
val metricsService: MetricsService,
private val metricsService: MetricsService,
private val auditingService: AuditingService,
) {
@Transactional(readOnly = true)
fun getVisitById(officialVisitId: Long): SyncOfficialVisit {
Expand Down Expand Up @@ -81,7 +85,19 @@ class SyncOfficialVisitService(
),
)

return visit.toSyncModel(prisonerVisited)
return visit.toSyncModel(prisonerVisited).also {
auditingService.recordAuditEvent(
auditVisitCreateEvent {
officialVisitId(visit.officialVisitId)
summaryText("Official visit created")
eventSource("NOMIS")
user(UserService.getServiceAsUser())
prisonCode(visit.prisonCode)
prisonerNumber(visit.prisonerNumber)
detailsText("Official visit created for prisoner number ${it.prisonerNumber}")
},
)
}
}

fun updateVisit(officialVisitId: Long, request: SyncUpdateOfficialVisitRequest): SyncOfficialVisit {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitRe
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitorRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.VisitorEquipmentRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.ContactsService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.UserService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditingService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.auditVisitCreateEvent
import java.time.LocalDateTime
import kotlin.jvm.optionals.getOrNull

Expand All @@ -26,6 +29,7 @@ class SyncOfficialVisitorService(
private val officialVisitorRepository: OfficialVisitorRepository,
private val contactsService: ContactsService,
private val visitorEquipmentRepository: VisitorEquipmentRepository,
private val auditingService: AuditingService,
) {
companion object {
private val log = LoggerFactory.getLogger(this::class.java)
Expand Down Expand Up @@ -78,9 +82,25 @@ class SyncOfficialVisitorService(
prisonCode = visit.prisonCode,
prisonerNumber = visit.prisonerNumber,
visitor = visitorSaved.toSyncModel(),
)
).also {
auditingService.recordAuditEvent(
auditVisitCreateEvent {
officialVisitId(visit.officialVisitId)
summaryText("${visitorSaved.relationshipType()} visitor added")
eventSource("NOMIS")
user(UserService.getServiceAsUser())
prisonCode(visit.prisonCode)
prisonerNumber(visit.prisonerNumber)
detailsText("${visitorSaved.relationshipType()} visitor ${visitorSaved.name()} added to visit for prisoner number ${it.prisonerNumber}")
},
)
}
}

private fun OfficialVisitorEntity.name() = "${firstName?.replaceFirstChar { it.uppercase() }} ${lastName?.replaceFirstChar { it.uppercase() }}"

private fun OfficialVisitorEntity.relationshipType() = relationshipTypeCode?.name?.lowercase()?.replaceFirstChar { it.uppercase() }

fun deleteVisitor(officialVisitId: Long, officialVisitorId: Long): SyncRemoveVisitorResponse? {
val visit = officialVisitRepository.findById(officialVisitId).getOrNull() ?: return null
visit.officialVisitors().forEach { visitor ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.mockito.Mockito.mock
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.atLeastOnce
import org.mockito.kotlin.reset
import org.mockito.kotlin.verify
Expand All @@ -19,8 +20,12 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.exception.DuplicateOffende
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND
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.SERVICE_USER
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.createAPrisonerVisitedEntity
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.createAVisitEntity
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.now
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.tomorrow
import uk.gov.justice.digital.hmpps.officialvisitsapi.model.VisitStatusType
import uk.gov.justice.digital.hmpps.officialvisitsapi.model.request.sync.SyncCreateOfficialVisitRequest
Expand All @@ -30,6 +35,8 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitRe
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitorRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.PrisonVisitSlotRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.PrisonerVisitedRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditEventDto
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditingService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.events.outbound.Source
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.metrics.MetricsEvents
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.metrics.MetricsService
Expand All @@ -45,6 +52,7 @@ class SyncOfficialVisitServiceTest {
private val prisonerVisitedRepository: PrisonerVisitedRepository = mock()
private val prisonVisitSlotRepository: PrisonVisitSlotRepository = mock()
private val metricsService: MetricsService = mock()
private val auditingService: AuditingService = mock()

private val createdTime = LocalDateTime.now().minusDays(2)

Expand All @@ -54,6 +62,7 @@ class SyncOfficialVisitServiceTest {
prisonerVisitedRepository,
prisonVisitSlotRepository,
metricsService,
auditingService,
)

@AfterEach
Expand Down Expand Up @@ -147,6 +156,21 @@ class SyncOfficialVisitServiceTest {
locationType = null,
),
)

val auditEventCaptor = argumentCaptor<AuditEventDto>()
verify(auditingService).recordAuditEvent(auditEventCaptor.capture())

with(auditEventCaptor.firstValue) {
officialVisitId isEqualTo 0
prisonerNumber isEqualTo MOORLAND_PRISONER.number
prisonCode isEqualTo MOORLAND
eventSource isEqualTo "NOMIS"
username isEqualTo SERVICE_USER.username
userFullName isEqualTo SERVICE_USER.name
summaryText isEqualTo "Official visit created"
detailText isEqualTo "Official visit created for prisoner number ${MOORLAND_PRISONER.number}"
eventDateTime isCloseTo now()
}
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.exception.EntityInUseExcep
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.MOORLAND
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.SERVICE_USER
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.now
import uk.gov.justice.digital.hmpps.officialvisitsapi.helper.tomorrow
import uk.gov.justice.digital.hmpps.officialvisitsapi.model.AttendanceType
import uk.gov.justice.digital.hmpps.officialvisitsapi.model.RelationshipType
Expand All @@ -35,6 +38,8 @@ import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitRe
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.OfficialVisitorRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.repository.VisitorEquipmentRepository
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.ContactsService
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditEventDto
import uk.gov.justice.digital.hmpps.officialvisitsapi.service.auditing.AuditingService
import java.time.LocalDateTime
import java.time.LocalTime
import java.util.Optional
Expand All @@ -45,6 +50,7 @@ class SyncOfficialVisitorServiceTest {
private val officialVisitorRepository: OfficialVisitorRepository = mock()
private val contactsService: ContactsService = mock()
private val visitorEquipmentRepository: VisitorEquipmentRepository = mock()
private val auditingService: AuditingService = mock()

private val createdTime = LocalDateTime.now().minusDays(2)

Expand All @@ -53,6 +59,7 @@ class SyncOfficialVisitorServiceTest {
officialVisitorRepository,
contactsService,
visitorEquipmentRepository,
auditingService,
)

@AfterEach
Expand Down Expand Up @@ -102,6 +109,20 @@ class SyncOfficialVisitorServiceTest {
verify(officialVisitRepository).findById(visitId)
verify(contactsService).getPrisonerContactSummary(MOORLAND_PRISONER.number, contactId)
verify(officialVisitorRepository).saveAndFlush(any())
val auditEventCaptor = argumentCaptor<AuditEventDto>()
verify(auditingService).recordAuditEvent(auditEventCaptor.capture())

with(auditEventCaptor.firstValue) {
officialVisitId isEqualTo 0
prisonerNumber isEqualTo MOORLAND_PRISONER.number
prisonCode isEqualTo MOORLAND
eventSource isEqualTo "NOMIS"
username isEqualTo SERVICE_USER.username
userFullName isEqualTo SERVICE_USER.name
summaryText isEqualTo "Official visitor added"
detailText isEqualTo "Official visitor First Last added to visit for prisoner number ${MOORLAND_PRISONER.number}"
eventDateTime isCloseTo now()
}
}

@Test
Expand Down
Loading