From 0fa83db319624900a6e91a7404ef910a9815622e Mon Sep 17 00:00:00 2001 From: benedwards Date: Wed, 26 Feb 2025 14:21:08 +0000 Subject: [PATCH 1/2] Updated audio linking event buffer time --- .../audio/config/AudioConfigurationProperties.java | 4 ++-- .../audio/service/impl/AudioAsyncServiceImpl.java | 4 ++-- .../task/runner/impl/AudioLinkingAutomatedTask.java | 12 ++++++++---- src/main/resources/application.yaml | 7 ++++--- .../runner/impl/AudioLinkingAutomatedTaskTest.java | 12 ++++++++---- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/darts/audio/config/AudioConfigurationProperties.java b/src/main/java/uk/gov/hmcts/darts/audio/config/AudioConfigurationProperties.java index b4999b6da0..e9486ac6dd 100644 --- a/src/main/java/uk/gov/hmcts/darts/audio/config/AudioConfigurationProperties.java +++ b/src/main/java/uk/gov/hmcts/darts/audio/config/AudioConfigurationProperties.java @@ -31,7 +31,7 @@ public class AudioConfigurationProperties { private String tempBlobWorkspace; private Duration allowableAudioGapDuration; - private Integer preAmbleDuration; - private Integer postAmbleDuration; + private Duration preAmbleDuration; + private Duration postAmbleDuration; private List handheldAudioCourtroomNumbers; } diff --git a/src/main/java/uk/gov/hmcts/darts/audio/service/impl/AudioAsyncServiceImpl.java b/src/main/java/uk/gov/hmcts/darts/audio/service/impl/AudioAsyncServiceImpl.java index 41df135331..47772d96a0 100644 --- a/src/main/java/uk/gov/hmcts/darts/audio/service/impl/AudioAsyncServiceImpl.java +++ b/src/main/java/uk/gov/hmcts/darts/audio/service/impl/AudioAsyncServiceImpl.java @@ -41,8 +41,8 @@ public void linkAudioToHearingByEvent(AddAudioMetadataRequest addAudioMetadataRe String courthouse = addAudioMetadataRequest.getCourthouse(); String courtroom = addAudioMetadataRequest.getCourtroom(); - OffsetDateTime start = addAudioMetadataRequest.getStartedAt().minusMinutes(audioConfigurationProperties.getPreAmbleDuration()); - OffsetDateTime end = addAudioMetadataRequest.getEndedAt().plusMinutes(audioConfigurationProperties.getPostAmbleDuration()); + OffsetDateTime start = addAudioMetadataRequest.getStartedAt().minus(audioConfigurationProperties.getPreAmbleDuration()); + OffsetDateTime end = addAudioMetadataRequest.getEndedAt().plus(audioConfigurationProperties.getPostAmbleDuration()); List courtLogs = courtLogEventRepository.findByCourthouseAndCourtroomBetweenStartAndEnd( courthouse, courtroom, diff --git a/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java b/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java index 759876aecb..36f51d2ad1 100644 --- a/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java +++ b/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java @@ -69,9 +69,13 @@ public static class EventProcessor { private final EventService eventService; private final MediaLinkedCaseHelper mediaLinkedCaseHelper; + + @Getter + @Value("${darts.automated-tasks.pre-amble-duration:0s}") + private final Duration preAmbleDuration; @Getter - @Value("${darts.automated-tasks.audio-linking.audio-buffer:0s}") - private final Duration audioBuffer; + @Value("${darts.automated-tasks.post-amble-duration:0s}") + private final Duration postAmbleDuration; private final UserIdentity userIdentity; @@ -84,8 +88,8 @@ public void processEvent(Integer eveId) { EventEntity event = eventService.getEventByEveId(eveId); List mediaEntities = mediaRepository.findAllByMediaTimeContains( event.getCourtroom().getId(), - event.getTimestamp().plus(getAudioBuffer()), - event.getTimestamp().minus(getAudioBuffer())); + event.getTimestamp().minus(getPreAmbleDuration()), + event.getTimestamp().plus(getPostAmbleDuration())); mediaEntities.forEach(mediaEntity -> { mediaLinkedCaseHelper.linkMediaByEvent(event, mediaEntity, MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); }); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 20e9bc43dc..f7608a5756 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -128,12 +128,12 @@ darts: merge-workspace: ${user.home}/audiotransform/merge outbounddeleter: last-accessed-deletion-day: 2 - pre-amble-duration: 30 + pre-amble-duration: 30m preview: redis-ttl-mins: ${AUDIO_PREVIEW_REDIS_TTL:10} redis-failed-ttl-mins: ${AUDIO_PREVIEW_REDIS_FAILED_TTL:2} redis-folder: audio-previews - post-amble-duration: 30 + post-amble-duration: 30m re-encode-workspace: ${user.home}/audiotransform/encode temp-blob-workspace: ${user.home}/audiotransform/tempworkspace audio-transformation-service: @@ -357,7 +357,8 @@ darts: at-most-for: PT90M audio-linking: system-user-email: system_AudioLinking@hmcts.net - audio-buffer: 0s + pre-amble-duration: ${darts.audio.pre-amble-duration} + post-amble-duration: ${darts.audio.post-amble-duration} lock: at-least-for: PT1M at-most-for: PT90M diff --git a/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java b/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java index a329346afb..27d4bf19f3 100644 --- a/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java +++ b/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java @@ -111,7 +111,8 @@ void beforeEach() { new AudioLinkingAutomatedTask.EventProcessor( mediaRepository, eventService, mediaLinkedCaseHelper, - Duration.ofSeconds(0), + Duration.ofSeconds(1), + Duration.ofSeconds(2), userIdentity) ); lenient().when(userIdentity.getUserAccount()).thenReturn(userAccount); @@ -144,7 +145,9 @@ void processEvent_shouldLinkAudio_whenUsingNoBufferTime() { verify(mediaLinkedCaseHelper, times(1)) .linkMediaByEvent(event, mediaEntities.get(2), MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); verify(mediaRepository, times(1)) - .findAllByMediaTimeContains(123, timestamp, timestamp); + .findAllByMediaTimeContains(123, + timestamp.minus(Duration.ofSeconds(1)), + timestamp.plus(Duration.ofSeconds(2))); verify(event, times(1)) .setEventStatus(3); @@ -158,7 +161,8 @@ void processEvent_shouldLinkAudio_whenUsingNoBufferTime() { void processEvent_shouldLinkAudio_accountingForBufferTime() { doNothing().when(mediaLinkedCaseHelper) .linkMediaByEvent(any(), any(), any(), any()); - doReturn(Duration.ofSeconds(10)).when(eventProcessor).getAudioBuffer(); + doReturn(Duration.ofSeconds(10)).when(eventProcessor).getPreAmbleDuration(); + doReturn(Duration.ofSeconds(20)).when(eventProcessor).getPostAmbleDuration(); EventEntity event = mock(EventEntity.class); when(eventService.getEventByEveId(2)).thenReturn(event); OffsetDateTime timestamp = OffsetDateTime.now(); @@ -181,7 +185,7 @@ void processEvent_shouldLinkAudio_accountingForBufferTime() { verify(mediaLinkedCaseHelper, times(1)) .linkMediaByEvent(event, mediaEntities.get(2), MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); verify(mediaRepository, times(1)) - .findAllByMediaTimeContains(123, timestamp.plusSeconds(10), timestamp.minusSeconds(10)); + .findAllByMediaTimeContains(123, timestamp.minus(Duration.ofSeconds(10)), timestamp.plus(Duration.ofSeconds(20))); verify(event, times(1)) .setEventStatus(3); verify(eventService, times(1)) From e492cd5e1ec5e1b077748ea515c9715677b5cb23 Mon Sep 17 00:00:00 2001 From: benedwards Date: Fri, 28 Feb 2025 16:29:19 +0000 Subject: [PATCH 2/2] Fixed some event timestamp logic. Added additional tests to ensure the logic works how we want it too --- .../repository/MediaRepositoryIntTest.java | 54 +++++++++++++++++++ .../impl/AudioLinkingAutomatedTaskITest.java | 1 - .../impl/AudioLinkingAutomatedTask.java | 4 +- .../impl/AudioLinkingAutomatedTaskTest.java | 9 ++-- 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/integrationTest/java/uk/gov/hmcts/darts/audio/repository/MediaRepositoryIntTest.java b/src/integrationTest/java/uk/gov/hmcts/darts/audio/repository/MediaRepositoryIntTest.java index b4ebab0f96..50bbcd6a30 100644 --- a/src/integrationTest/java/uk/gov/hmcts/darts/audio/repository/MediaRepositoryIntTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/darts/audio/repository/MediaRepositoryIntTest.java @@ -2,8 +2,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import uk.gov.hmcts.darts.common.entity.CourtCaseEntity; +import uk.gov.hmcts.darts.common.entity.CourtroomEntity; import uk.gov.hmcts.darts.common.entity.MediaEntity; import uk.gov.hmcts.darts.common.entity.MediaLinkedCaseEntity; import uk.gov.hmcts.darts.common.repository.HearingRepository; @@ -14,8 +18,10 @@ import uk.gov.hmcts.darts.testutils.stubs.CourtCaseStub; import uk.gov.hmcts.darts.testutils.stubs.MediaStub; +import java.time.Duration; import java.time.OffsetDateTime; import java.util.List; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -255,6 +261,54 @@ void mediaRepositoryIntTest_shouldReutrnTheCountOfMatchingChronicleIds() { assertThat(mediaRepository.getVersionCount("someIdMultiple")).isEqualTo(2); } + static Stream findAllByMediaTimeContainsTestSource() { + OffsetDateTime startTime = OffsetDateTime.now(); + OffsetDateTime endTime = startTime.plusHours(2); + + return Stream.of( + Arguments.of("Event time 30 mins before media start time should be returned when buffer is 30 min", + startTime, endTime, startTime.minusMinutes(30), true), + Arguments.of("Event time 30 mins after media end time should be returned when buffer is 30 min", + startTime, endTime, endTime.plusMinutes(30), true), + Arguments.of("Event time is within media time should be returned", + startTime, endTime, startTime.plusMinutes(30), true), + Arguments.of("Event time 31 mins before media start time should not be returned when buffer is 30 min", + startTime, endTime, startTime.minusMinutes(31), false), + Arguments.of("Event time 31 mins after media end time should not be returned when buffer is 30 min", + startTime, endTime, endTime.plusMinutes(31), false) + ); + } + + @ParameterizedTest(name = "{0} (StartTime: {1}. EndTime: {2}. EventTime: {3}. ExpectDataToReturn: {4})") + @MethodSource("findAllByMediaTimeContainsTestSource") + void findAllByMediaTimeContains_tests(String testName, OffsetDateTime startTime, OffsetDateTime endTime, OffsetDateTime eventTime, + boolean expectDataToReturn) { + CourtroomEntity courtroomEntity = PersistableFactory.getCourtroomTestData() + .someMinimal(); + dartsPersistence.save(courtroomEntity); + + MediaEntity media = PersistableFactory.getMediaTestData().someMinimalBuilder() + .start(startTime) + .end(endTime) + .courtroom(courtroomEntity) + .build() + .getEntity(); + dartsPersistence.save(media); + + Duration buffer = Duration.ofMinutes(30); + List medias = dartsDatabase.getMediaRepository().findAllByMediaTimeContains( + courtroomEntity.getId(), + eventTime.plus(buffer), + eventTime.minus(buffer)); + + if (expectDataToReturn) { + assertEquals(1, medias.size()); + assertThat(medias.getFirst().getId()).isEqualTo(media.getId()); + } else { + assertEquals(0, medias.size()); + } + } + private MediaLinkedCaseEntity createMediaLinkedCase(MediaEntity media, CourtCaseEntity courtCase) { MediaLinkedCaseEntity mediaLinkedCase = new MediaLinkedCaseEntity(); mediaLinkedCase.setMedia(media); diff --git a/src/integrationTest/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskITest.java b/src/integrationTest/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskITest.java index ebd0c6f3ea..da2e64ce7e 100644 --- a/src/integrationTest/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskITest.java +++ b/src/integrationTest/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskITest.java @@ -106,7 +106,6 @@ private void assertMediaLinked(HearingEntity hearingEntity, MediaEntity mediaEnt .allMatch(mediaLinkedCaseEntity -> mediaLinkedCaseEntity.getCreatedBy().getId() == AUTOMATION_USER_ID); } - private EventEntity createEvent(EventStatus eventStatus, CourtroomEntity courtroomEntity, HearingEntity hearing, OffsetDateTime timestamp) { EventEntity event = dartsDatabase.createEvent(hearing); event.setCourtroom(courtroomEntity); diff --git a/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java b/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java index 36f51d2ad1..82b6f293f5 100644 --- a/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java +++ b/src/main/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTask.java @@ -88,8 +88,8 @@ public void processEvent(Integer eveId) { EventEntity event = eventService.getEventByEveId(eveId); List mediaEntities = mediaRepository.findAllByMediaTimeContains( event.getCourtroom().getId(), - event.getTimestamp().minus(getPreAmbleDuration()), - event.getTimestamp().plus(getPostAmbleDuration())); + event.getTimestamp().plus(getPreAmbleDuration()), + event.getTimestamp().minus(getPostAmbleDuration())); mediaEntities.forEach(mediaEntity -> { mediaLinkedCaseHelper.linkMediaByEvent(event, mediaEntity, MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); }); diff --git a/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java b/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java index 27d4bf19f3..443caf6912 100644 --- a/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java +++ b/src/test/java/uk/gov/hmcts/darts/task/runner/impl/AudioLinkingAutomatedTaskTest.java @@ -122,7 +122,8 @@ void beforeEach() { void processEvent_shouldLinkAudio_whenUsingNoBufferTime() { doNothing().when(mediaLinkedCaseHelper) .linkMediaByEvent(any(), any(), any(), any()); - + doReturn(Duration.ofSeconds(0)).when(eventProcessor).getPreAmbleDuration(); + doReturn(Duration.ofSeconds(0)).when(eventProcessor).getPostAmbleDuration(); EventEntity event = mock(EventEntity.class); when(eventService.getEventByEveId(1)).thenReturn(event); OffsetDateTime timestamp = OffsetDateTime.now(); @@ -145,9 +146,7 @@ void processEvent_shouldLinkAudio_whenUsingNoBufferTime() { verify(mediaLinkedCaseHelper, times(1)) .linkMediaByEvent(event, mediaEntities.get(2), MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); verify(mediaRepository, times(1)) - .findAllByMediaTimeContains(123, - timestamp.minus(Duration.ofSeconds(1)), - timestamp.plus(Duration.ofSeconds(2))); + .findAllByMediaTimeContains(123, timestamp, timestamp); verify(event, times(1)) .setEventStatus(3); @@ -185,7 +184,7 @@ void processEvent_shouldLinkAudio_accountingForBufferTime() { verify(mediaLinkedCaseHelper, times(1)) .linkMediaByEvent(event, mediaEntities.get(2), MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount); verify(mediaRepository, times(1)) - .findAllByMediaTimeContains(123, timestamp.minus(Duration.ofSeconds(10)), timestamp.plus(Duration.ofSeconds(20))); + .findAllByMediaTimeContains(123, timestamp.plus(Duration.ofSeconds(10)), timestamp.minus(Duration.ofSeconds(20))); verify(event, times(1)) .setEventStatus(3); verify(eventService, times(1))