Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DMP-3392: Include pre-amble/post-amble in job that links cases to audio through events #2647

Merged
merged 9 commits into from
Mar 3, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -255,6 +261,54 @@ void mediaRepositoryIntTest_shouldReutrnTheCountOfMatchingChronicleIds() {
assertThat(mediaRepository.getVersionCount("someIdMultiple")).isEqualTo(2);
}

static Stream<Arguments> 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<MediaEntity> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> handheldAudioCourtroomNumbers;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<EventEntity> courtLogs = courtLogEventRepository.findByCourthouseAndCourtroomBetweenStartAndEnd(
courthouse,
courtroom,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;


Expand All @@ -84,8 +88,8 @@ public void processEvent(Integer eveId) {
EventEntity event = eventService.getEventByEveId(eveId);
List<MediaEntity> mediaEntities = mediaRepository.findAllByMediaTimeContains(
event.getCourtroom().getId(),
event.getTimestamp().plus(getAudioBuffer()),
event.getTimestamp().minus(getAudioBuffer()));
event.getTimestamp().plus(getPreAmbleDuration()),
event.getTimestamp().minus(getPostAmbleDuration()));
mediaEntities.forEach(mediaEntity -> {
mediaLinkedCaseHelper.linkMediaByEvent(event, mediaEntity, MediaLinkedCaseSourceType.AUDIO_LINKING_TASK, userAccount);
});
Expand Down
7 changes: 4 additions & 3 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -121,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();
Expand Down Expand Up @@ -158,7 +160,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();
Expand All @@ -181,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.plusSeconds(10), timestamp.minusSeconds(10));
.findAllByMediaTimeContains(123, timestamp.plus(Duration.ofSeconds(10)), timestamp.minus(Duration.ofSeconds(20)));
verify(event, times(1))
.setEventStatus(3);
verify(eventService, times(1))
Expand Down