Skip to content

Commit 4f2b2e2

Browse files
MIA-1545 outside prison activity rd (#244)
1 parent dcfa304 commit 4f2b2e2

File tree

9 files changed

+113
-30
lines changed

9 files changed

+113
-30
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/domain/event/producer/DomainEventProducer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import uk.gov.justice.digital.hmpps.externalmovementsapi.events.DomainEvent
55
import java.util.UUID
66

77
interface DomainEventProducer : Identifiable {
8-
fun initialEvent(): DomainEventPublication?
8+
fun initialEvents(): Set<DomainEventPublication>
99

1010
fun domainEvents(): Set<DomainEventPublication> = setOf()
1111
}

src/main/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/domain/interceptor/EntityInterceptor.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ class EntityInterceptor : Interceptor {
4848
types: Array<out Type>,
4949
): Boolean {
5050
if (entity is DomainEventProducer && !ExternalMovementContext.get().migratingData) {
51-
entity.initialEvent()?.takeIf { registerDomainEvent(it.entityId, it.event.eventType) }?.let {
52-
em.persist(HmppsDomainEvent(it.event, it.entityId).apply { published = !it.publish })
51+
entity.initialEvents().forEach {
52+
if (registerDomainEvent(it.entityId, it.event.eventType)) {
53+
em.persist(HmppsDomainEvent(it.event, it.entityId).apply { published = !it.publish })
54+
}
5355
}
5456
}
5557
return super.onPersist(entity, id, state, propertyNames, types)

src/main/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/domain/tap/authorisation/TemporaryAbsenceAuthorisation.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,13 @@ class TemporaryAbsenceAuthorisation(
204204
appliedActions = listOf()
205205
}
206206

207-
override fun initialEvent(): DomainEventPublication = if (status.code == APPROVED.name) {
208-
TemporaryAbsenceAuthorisationApproved(person.identifier, id)
209-
} else {
210-
TemporaryAbsenceAuthorisationPending(person.identifier, id)
211-
}.publication(id)
207+
override fun initialEvents(): Set<DomainEventPublication> = setOf(
208+
if (status.code == APPROVED.name) {
209+
TemporaryAbsenceAuthorisationApproved(person.identifier, id)
210+
} else {
211+
TemporaryAbsenceAuthorisationPending(person.identifier, id)
212+
}.publication(id),
213+
)
212214

213215
override fun domainEvents(): Set<DomainEventPublication> = appliedActions.mapNotNull { it.domainEvent(this)?.publication(id) }.toSet()
214216

src/main/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/domain/tap/movement/TemporaryAbsenceMovement.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,12 @@ class TemporaryAbsenceMovement(
145145
appliedActions = listOf()
146146
}
147147

148-
override fun initialEvent(): DomainEventPublication = when (direction) {
149-
Direction.OUT -> TemporaryAbsenceStarted(person.identifier, id, occurrence?.id)
150-
Direction.IN -> TemporaryAbsenceCompleted(person.identifier, id, occurrence?.id)
151-
}.publication(id)
148+
override fun initialEvents(): Set<DomainEventPublication> = setOf(
149+
when (direction) {
150+
Direction.OUT -> TemporaryAbsenceStarted(person.identifier, id, occurrence?.id)
151+
Direction.IN -> TemporaryAbsenceCompleted(person.identifier, id, occurrence?.id)
152+
}.publication(id),
153+
)
152154

153155
override fun domainEvents(): Set<DomainEventPublication> = appliedActions.mapNotNull { action ->
154156
action.domainEvent(this)?.publication(id) { it.eventType !in EXCLUDE_FROM_PUBLISH }

src/main/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/domain/tap/occurrence/TemporaryAbsenceOccurrence.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,13 @@ class TemporaryAbsenceOccurrence(
235235
appliedActions = listOf()
236236
}
237237

238-
override fun initialEvent(): DomainEventPublication? = when (status.code) {
239-
SCHEDULED.name -> TemporaryAbsenceScheduled(person.identifier, id)
240-
else -> null
241-
}?.publication(id)
238+
override fun initialEvents(): Set<DomainEventPublication> = when (status.code) {
239+
SCHEDULED.name -> setOf(
240+
TemporaryAbsenceScheduled(person.identifier, id).publication(id),
241+
TemporaryAbsenceAuthorisationRelocated(person.identifier, authorisation.id).publication(authorisation.id),
242+
)
243+
else -> emptySet()
244+
}
242245

243246
override fun domainEvents(): Set<DomainEventPublication> = appliedActions.flatMap { action ->
244247
when (action) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
insert into tap.absence_reason_category(code, description, sequence_number, active, next_domain)
2+
values ('OPA', 'Outside prison activity', 1180, true, null)
3+
on conflict do nothing
4+
;
5+
6+
insert into tap.absence_categorisation_link(domain_1, id_1, domain_2, id_2, sequence_number)
7+
select 'ABSENCE_SUB_TYPE', st.id, 'ABSENCE_REASON_CATEGORY', rc.id, 80
8+
from tap.absence_sub_type st,
9+
tap.absence_reason_category rc
10+
where st.code = 'RDR'
11+
and rc.code = 'OPA'
12+
on conflict do nothing
13+
;
14+
15+
insert into tap.absence_categorisation_link(domain_1, id_1, domain_2, id_2, sequence_number)
16+
select 'ABSENCE_REASON_CATEGORY', rc.id, 'ABSENCE_REASON', r.id, 1
17+
from tap.absence_reason_category rc, tap.absence_reason r
18+
where rc.code = 'OPA' and r.code = 'OPA'
19+
on conflict do nothing
20+
;

src/test/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/integration/referencedata/AbsenceCategorisationIntegrationTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ class AbsenceCategorisationIntegrationTest : IntegrationTest() {
264264
null,
265265
null,
266266
),
267+
AbsenceCategorisation(code = "OPA", description = "Outside prison activity", null, null),
267268
),
268269
),
269270
),

src/test/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/integration/sync/SyncTapOccurrenceIntTest.kt

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import org.junit.jupiter.params.provider.EnumSource.Mode.EXCLUDE
1010
import org.springframework.beans.factory.annotation.Autowired
1111
import org.springframework.http.HttpStatus
1212
import org.springframework.test.web.reactive.server.expectBody
13-
import sun.security.util.resources.auth
1413
import uk.gov.justice.digital.hmpps.externalmovementsapi.access.Roles
1514
import uk.gov.justice.digital.hmpps.externalmovementsapi.context.DataSource
1615
import uk.gov.justice.digital.hmpps.externalmovementsapi.context.ExternalMovementContext
@@ -26,7 +25,6 @@ import uk.gov.justice.digital.hmpps.externalmovementsapi.domain.tap.referencedat
2625
import uk.gov.justice.digital.hmpps.externalmovementsapi.domain.tap.referencedata.OccurrenceStatus
2726
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.HmppsDomainEvent
2827
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TapMovementRelocated
29-
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceAuthorisationApproved.Companion.invoke
3028
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceAuthorisationRelocated
3129
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceCancelled
3230
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceCommentsChanged
@@ -38,13 +36,11 @@ import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.DataGenerat
3836
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.DataGenerator.word
3937
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.IntegrationTest
4038
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.LocationGenerator.location
41-
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.PersonSummaryOperations.Companion.verifyAgainst
4239
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.TempAbsenceAuthorisationOperations
4340
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.TempAbsenceAuthorisationOperations.Companion.temporaryAbsenceAuthorisation
4441
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.TempAbsenceMovementOperations.Companion.temporaryAbsenceMovement
4542
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.TempAbsenceOccurrenceOperations
4643
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.config.TempAbsenceOccurrenceOperations.Companion.temporaryAbsenceOccurrence
47-
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.sync.verifyAgainst
4844
import uk.gov.justice.digital.hmpps.externalmovementsapi.model.location.Location
4945
import uk.gov.justice.digital.hmpps.externalmovementsapi.sync.AtAndBy
5046
import uk.gov.justice.digital.hmpps.externalmovementsapi.sync.write.SyncResponse
@@ -110,7 +106,13 @@ class SyncTapOccurrenceIntTest(
110106
ExternalMovementContext.get().copy(username = DEFAULT_USERNAME, source = DataSource.NOMIS),
111107
)
112108

113-
verifyEvents(saved, setOf(TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS)))
109+
verifyEventPublications(
110+
saved,
111+
setOf(
112+
TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
113+
TemporaryAbsenceAuthorisationRelocated(authorisation.person.identifier, authorisation.id, DataSource.NOMIS).publication(authorisation.id),
114+
),
115+
)
114116
}
115117

116118
@Test
@@ -204,10 +206,24 @@ class SyncTapOccurrenceIntTest(
204206
verifyEventPublications(
205207
saved,
206208
setOf(
207-
TemporaryAbsenceRescheduled(saved.authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
208-
TemporaryAbsenceRelocated(saved.authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
209-
TemporaryAbsenceCommentsChanged(saved.authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
210-
TemporaryAbsenceAuthorisationRelocated(saved.authorisation.person.identifier, authorisation.id, DataSource.NOMIS).publication(authorisation.id),
209+
TemporaryAbsenceRescheduled(
210+
saved.authorisation.person.identifier,
211+
saved.id,
212+
DataSource.NOMIS,
213+
).publication(saved.id),
214+
TemporaryAbsenceRelocated(
215+
saved.authorisation.person.identifier,
216+
saved.id,
217+
DataSource.NOMIS,
218+
).publication(saved.id),
219+
TemporaryAbsenceCommentsChanged(saved.authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(
220+
saved.id,
221+
),
222+
TemporaryAbsenceAuthorisationRelocated(
223+
saved.authorisation.person.identifier,
224+
authorisation.id,
225+
DataSource.NOMIS,
226+
).publication(authorisation.id),
211227
) + saved.movements().map {
212228
TapMovementRelocated(saved.person.identifier, it.id, DataSource.NOMIS).publication(it.id)
213229
},
@@ -303,7 +319,13 @@ class SyncTapOccurrenceIntTest(
303319
ExternalMovementContext.get().copy(username = DEFAULT_USERNAME, source = DataSource.NOMIS),
304320
)
305321

306-
verifyEvents(saved, setOf(TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS)))
322+
verifyEventPublications(
323+
saved,
324+
setOf(
325+
TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
326+
TemporaryAbsenceAuthorisationRelocated(authorisation.person.identifier, authorisation.id, DataSource.NOMIS).publication(authorisation.id),
327+
),
328+
)
307329
}
308330

309331
@Test
@@ -328,12 +350,23 @@ class SyncTapOccurrenceIntTest(
328350
ExternalMovementContext.get().copy(username = DEFAULT_USERNAME, source = DataSource.NOMIS),
329351
)
330352

331-
verifyEvents(saved, setOf(TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS)))
353+
verifyEventPublications(
354+
saved,
355+
setOf(
356+
TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
357+
TemporaryAbsenceAuthorisationRelocated(
358+
authorisation.person.identifier,
359+
authorisation.id,
360+
DataSource.NOMIS,
361+
).publication(authorisation.id),
362+
),
363+
)
332364
}
333365

334366
@Test
335367
fun `200 ok remove duplicate if created pending in dps and approved in nomis`() {
336-
val authorisation = givenTemporaryAbsenceAuthorisation(temporaryAbsenceAuthorisation(repeat = false, legacyId = newId()))
368+
val authorisation =
369+
givenTemporaryAbsenceAuthorisation(temporaryAbsenceAuthorisation(repeat = false, legacyId = newId()))
337370
val dpsOccurrence = givenTemporaryAbsenceOccurrence(temporaryAbsenceOccurrence(authorisation))
338371
val request = tapOccurrence()
339372
val res = syncTapOccurrence(authorisation.id, request)
@@ -357,7 +390,17 @@ class SyncTapOccurrenceIntTest(
357390
ExternalMovementContext.get().copy(username = DEFAULT_USERNAME, source = DataSource.NOMIS),
358391
)
359392

360-
verifyEvents(saved, setOf(TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS)))
393+
verifyEventPublications(
394+
saved,
395+
setOf(
396+
TemporaryAbsenceScheduled(authorisation.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
397+
TemporaryAbsenceAuthorisationRelocated(
398+
authorisation.person.identifier,
399+
authorisation.id,
400+
DataSource.NOMIS,
401+
).publication(authorisation.id),
402+
),
403+
)
361404
}
362405

363406
@Test
@@ -386,7 +429,13 @@ class SyncTapOccurrenceIntTest(
386429
ExternalMovementContext.get().copy(username = DEFAULT_USERNAME, source = DataSource.NOMIS),
387430
)
388431

389-
verifyEvents(saved, setOf(TemporaryAbsenceScheduled(auth.person.identifier, saved.id, DataSource.NOMIS)))
432+
verifyEventPublications(
433+
saved,
434+
setOf(
435+
TemporaryAbsenceScheduled(auth.person.identifier, saved.id, DataSource.NOMIS).publication(saved.id),
436+
TemporaryAbsenceAuthorisationRelocated(auth.person.identifier, auth.id, DataSource.NOMIS).publication(auth.id),
437+
),
438+
)
390439
}
391440

392441
@Test

src/test/kotlin/uk/gov/justice/digital/hmpps/externalmovementsapi/integration/tap/authorisation/CreateTapAuthorisationIntTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import uk.gov.justice.digital.hmpps.externalmovementsapi.domain.tap.referencedat
2424
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.HmppsDomainEvent
2525
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceAuthorisationApproved
2626
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceAuthorisationPending
27+
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceAuthorisationRelocated
2728
import uk.gov.justice.digital.hmpps.externalmovementsapi.events.TemporaryAbsenceScheduled
2829
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.DataGenerator.personIdentifier
2930
import uk.gov.justice.digital.hmpps.externalmovementsapi.integration.DataGenerator.postcode
@@ -182,6 +183,7 @@ class CreateTapAuthorisationIntTest(
182183
setOf(
183184
TemporaryAbsenceScheduled(pi, occurrence.id).publication(occurrence.id),
184185
TemporaryAbsenceAuthorisationApproved(pi, saved.id).publication(saved.id),
186+
TemporaryAbsenceAuthorisationRelocated(pi, saved.id).publication(saved.id),
185187
),
186188
)
187189
}
@@ -231,6 +233,7 @@ class CreateTapAuthorisationIntTest(
231233
setOf(
232234
TemporaryAbsenceScheduled(pi, occurrence.id).publication(occurrence.id),
233235
TemporaryAbsenceAuthorisationApproved(pi, saved.id).publication(saved.id),
236+
TemporaryAbsenceAuthorisationRelocated(pi, saved.id).publication(saved.id),
234237
),
235238
)
236239
}
@@ -282,6 +285,7 @@ class CreateTapAuthorisationIntTest(
282285
setOf(
283286
TemporaryAbsenceScheduled(pi, occurrence.id).publication(occurrence.id),
284287
TemporaryAbsenceAuthorisationApproved(pi, saved.id).publication(saved.id),
288+
TemporaryAbsenceAuthorisationRelocated(pi, saved.id).publication(saved.id),
285289
),
286290
)
287291
}

0 commit comments

Comments
 (0)