Skip to content

Commit

Permalink
DMP-596 - Mark Audio files for deletion in the inbound datastore if t… (
Browse files Browse the repository at this point in the history
  • Loading branch information
cmagowan-hmcts authored Nov 16, 2023
1 parent 4af8077 commit 07098c8
Show file tree
Hide file tree
Showing 26 changed files with 576 additions and 65 deletions.
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
max_line_length = 160

[*.java]
indent_size = 4
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ bin/generated-sources/
.springBeans

### IntelliJ IDEA ###
.idea
.idea/*
!.idea/codeStyles/
/out
*.iws
*.iml
Expand Down
5 changes: 5 additions & 0 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,12 @@ dependencyManagement {
entry 'netty-transport-native-kqueue'
entry 'netty-transport-native-unix-common'
}
//temporary fix for vulnerability https://spring.io/security/cve-2023-34062
dependencySet(group: 'io.projectreactor.netty', version: '1.1.13') {
entry 'reactor-netty-http'
entry 'reactor-netty-core'
}

}
}

Expand Down
5 changes: 0 additions & 5 deletions config/pmd/test-ruleset.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,6 @@
<exclude name="ExcessiveImports"/>
<exclude name="LawOfDemeter"/>
</rule>
<rule ref="category/java/design.xml/ExcessiveImports">
<properties>
<property name="minimum" value="35"/><!-- should be reduced -->
</properties>
</rule>
<rule ref="category/java/design.xml/SignatureDeclareThrowsException">
<properties>
<property name="IgnoreJUnitCompletely" value="true"/>
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package uk.gov.hmcts.darts.task.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.ActiveProfiles;
import uk.gov.hmcts.darts.audio.service.InboundAudioDeleterProcessor;
import uk.gov.hmcts.darts.common.entity.ExternalObjectDirectoryEntity;
import uk.gov.hmcts.darts.common.entity.HearingEntity;
import uk.gov.hmcts.darts.common.entity.MediaEntity;
import uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum;
import uk.gov.hmcts.darts.common.helper.CurrentTimeHelper;
import uk.gov.hmcts.darts.testutils.IntegrationBase;
import uk.gov.hmcts.darts.testutils.data.MediaTestData;

import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import static uk.gov.hmcts.darts.common.enums.ObjectDirectoryStatusEnum.MARKED_FOR_DELETION;
import static uk.gov.hmcts.darts.common.enums.ObjectDirectoryStatusEnum.STORED;

@SuppressWarnings("PMD.ExcessiveImports")
@SpringBootTest
@ActiveProfiles({"intTest", "h2db"})
class InboundAudioDeleterProcessorTest extends IntegrationBase {

public static final LocalDate HEARING_DATE = LocalDate.of(2023, 6, 10);

@Autowired
private InboundAudioDeleterProcessor inboundAudioDeleterProcessor;

@MockBean
private CurrentTimeHelper currentTimeHelper;

@Test
void updatedMoreThan24HrsAgo() {
when(currentTimeHelper.currentOffsetDateTime())
.thenReturn(OffsetDateTime.now().plusHours(500));
HearingEntity hearing = dartsDatabase.createHearing(
"NEWCASTLE",
"Int Test Courtroom 2",
"2",
HEARING_DATE
);

MediaEntity savedMedia = dartsDatabase.save(
MediaTestData.createMediaWith(
hearing.getCourtroom(),
OffsetDateTime.parse("2023-09-26T13:00:00Z"),
OffsetDateTime.parse("2023-09-26T13:45:00Z"),
1
));

UUID uuid = UUID.fromString("075987ea-b34d-49c7-b8db-439bfbe2496c");

ExternalObjectDirectoryEntity inboundEod = dartsDatabase.getExternalObjectDirectoryStub().createExternalObjectDirectory(
savedMedia,
dartsDatabase.getObjectDirectoryStatusEntity(STORED),
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.INBOUND),
uuid
);
dartsDatabase.save(inboundEod);

ExternalObjectDirectoryEntity armEod = dartsDatabase.getExternalObjectDirectoryStub().createExternalObjectDirectory(
savedMedia,
dartsDatabase.getObjectDirectoryStatusEntity(STORED),
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.ARM),
uuid
);
dartsDatabase.save(armEod);

inboundAudioDeleterProcessor.markForDeletion();

List<ExternalObjectDirectoryEntity> foundMediaList = dartsDatabase.getExternalObjectDirectoryRepository().findByMediaAndExternalLocationType(
savedMedia,
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.INBOUND)
);

assertEquals(1, foundMediaList.size());
ExternalObjectDirectoryEntity foundMedia = foundMediaList.get(0);
assertEquals(MARKED_FOR_DELETION.getId(), foundMedia.getStatus().getId());
}


@Test
void updatedLessThan24HrsAgo() {
when(currentTimeHelper.currentOffsetDateTime())
.thenReturn(OffsetDateTime.now().plusHours(1));
HearingEntity hearing = dartsDatabase.createHearing(
"NEWCASTLE",
"Int Test Courtroom 2",
"2",
HEARING_DATE
);

MediaEntity savedMedia = dartsDatabase.save(
MediaTestData.createMediaWith(
hearing.getCourtroom(),
OffsetDateTime.parse("2023-09-26T13:00:00Z"),
OffsetDateTime.parse("2023-09-26T13:45:00Z"),
1
));

UUID uuid = UUID.fromString("075987ea-b34d-49c7-b8db-439bfbe2496c");

ExternalObjectDirectoryEntity inboundEod = dartsDatabase.getExternalObjectDirectoryStub().createExternalObjectDirectory(
savedMedia,
dartsDatabase.getObjectDirectoryStatusEntity(STORED),
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.INBOUND),
uuid
);
dartsDatabase.save(inboundEod);

ExternalObjectDirectoryEntity armEod = dartsDatabase.getExternalObjectDirectoryStub().createExternalObjectDirectory(
savedMedia,
dartsDatabase.getObjectDirectoryStatusEntity(STORED),
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.ARM),
uuid
);
dartsDatabase.save(armEod);

inboundAudioDeleterProcessor.markForDeletion();

List<ExternalObjectDirectoryEntity> foundMediaList = dartsDatabase.getExternalObjectDirectoryRepository().findByMediaAndExternalLocationType(
savedMedia,
dartsDatabase.getExternalLocationTypeEntity(ExternalLocationTypeEnum.INBOUND)
);


assertEquals(1, foundMediaList.size());
ExternalObjectDirectoryEntity foundMedia = foundMediaList.get(0);
assertEquals(STORED.getId(), foundMedia.getStatus().getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
import jakarta.transaction.Transactional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import uk.gov.hmcts.darts.audio.entity.MediaRequestEntity;
import uk.gov.hmcts.darts.audio.enums.AudioRequestStatus;
Expand All @@ -14,6 +15,8 @@
import uk.gov.hmcts.darts.common.entity.HearingEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.common.enums.SystemUsersEnum;
import uk.gov.hmcts.darts.common.helper.SystemUserHelper;
import uk.gov.hmcts.darts.common.repository.UserAccountRepository;
import uk.gov.hmcts.darts.common.service.bankholidays.BankHolidaysService;
import uk.gov.hmcts.darts.common.service.bankholidays.Event;
import uk.gov.hmcts.darts.testutils.IntegrationBase;
Expand All @@ -35,6 +38,8 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static uk.gov.hmcts.darts.audio.enums.AudioRequestStatus.COMPLETED;
import static uk.gov.hmcts.darts.audio.enums.AudioRequestStatus.OPEN;
import static uk.gov.hmcts.darts.audio.enums.AudioRequestStatus.PROCESSING;
Expand All @@ -44,6 +49,7 @@
//Requires transactional as the object is being created manually rather than being autowired.
// We are doing this, so we can mock out different dates to test the service.
@Transactional
@ExtendWith(MockitoExtension.class)
@SuppressWarnings("PMD.ExcessiveImports")
class OutboundAudioDeleterProcessorTest extends IntegrationBase {

Expand All @@ -60,12 +66,22 @@ class OutboundAudioDeleterProcessorTest extends IntegrationBase {
@Mock
private BankHolidaysService bankHolidaysService;

@Mock
private SystemUserHelper systemUserHelper;

@Mock
private UserAccountRepository userAccountRepository;

@BeforeEach
void setUp() {
requestor = dartsDatabase.getUserAccountStub().getIntegrationTestUserAccountEntity();
//setting clock to 2023-10-27 13:56:17 with local offset on a friday
clock = Clock.fixed(Instant.ofEpochSecond(1_698_414_977L), ZoneId.of("Europe/London"));
outboundAudioDeleterProcessorImpl = createOutboundDeleterService(clock, 2);
when(systemUserHelper.findSystemUserGuid(anyString())).thenReturn("value");
UserAccountEntity systemUser = new UserAccountEntity();
systemUser.setId(0);
when(userAccountRepository.findSystemUser(anyString())).thenReturn(systemUser);
}

private OutboundAudioDeleterProcessorImpl createOutboundDeleterService(Clock clock, int lastAccessedDeletionDays) {
Expand All @@ -77,8 +93,9 @@ private OutboundAudioDeleterProcessorImpl createOutboundDeleterService(Clock clo
return new OutboundAudioDeleterProcessorImpl(
dartsDatabase.getMediaRequestRepository(),
dartsDatabase.getTransientObjectDirectoryRepository(),
dartsDatabase.getUserAccountRepository(),
dartsDatabase.getObjectDirectoryStatusRepository(), lastAccessedDeletionDayCalculator
userAccountRepository,
dartsDatabase.getObjectDirectoryStatusRepository(), lastAccessedDeletionDayCalculator,
systemUserHelper
);
}

Expand Down Expand Up @@ -220,7 +237,7 @@ void shouldNotDeleteIfLastAccessWas10DaysAgoWith3BankHoliday() {
Event bankHoliday3 = new Event();
bankHoliday3.setDate(DATE_27TH_OCTOBER.minusDays(10));

Mockito.when(bankHolidaysService.getBankHolidaysFor(anyInt())).thenReturn(List.of(
when(bankHolidaysService.getBankHolidaysFor(anyInt())).thenReturn(List.of(
bankHoliday1,
bankHoliday2,
bankHoliday3
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package uk.gov.hmcts.darts.audio.service;

public interface InboundAudioDeleterProcessor {

void markForDeletion();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package uk.gov.hmcts.darts.audio.service.impl;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.audio.service.InboundAudioDeleterProcessor;
import uk.gov.hmcts.darts.common.entity.ExternalLocationTypeEntity;
import uk.gov.hmcts.darts.common.entity.ObjectDirectoryStatusEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum;
import uk.gov.hmcts.darts.common.enums.ObjectDirectoryStatusEnum;
import uk.gov.hmcts.darts.common.helper.CurrentTimeHelper;
import uk.gov.hmcts.darts.common.helper.SystemUserHelper;
import uk.gov.hmcts.darts.common.repository.ExternalLocationTypeRepository;
import uk.gov.hmcts.darts.common.repository.ExternalObjectDirectoryRepository;
import uk.gov.hmcts.darts.common.repository.ObjectDirectoryStatusRepository;
import uk.gov.hmcts.darts.common.repository.UserAccountRepository;

import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;

import static uk.gov.hmcts.darts.common.enums.ObjectDirectoryStatusEnum.MARKED_FOR_DELETION;

@Service
@Slf4j
@RequiredArgsConstructor
public class InboundAudioDeleterProcessorImpl implements InboundAudioDeleterProcessor {
private final UserAccountRepository userAccountRepository;
private final ObjectDirectoryStatusRepository objectDirectoryStatusRepository;
private final ExternalObjectDirectoryRepository externalObjectDirectoryRepository;
private final ExternalLocationTypeRepository externalLocationTypeRepository;
private final CurrentTimeHelper currentTimeHelper;
private final SystemUserHelper systemUserHelper;

@Value("${darts.data-management.retention-period.inbound.arm-minimum}")
int hoursInArm;

@Transactional
public void markForDeletion() {
ObjectDirectoryStatusEntity storedStatus = objectDirectoryStatusRepository.getReferenceById(
ObjectDirectoryStatusEnum.STORED.getId());
ExternalLocationTypeEntity inboundLocation = externalLocationTypeRepository.getReferenceById(
ExternalLocationTypeEnum.INBOUND.getId());
ExternalLocationTypeEntity armLocation = externalLocationTypeRepository.getReferenceById(
ExternalLocationTypeEnum.ARM.getId());
OffsetDateTime lastModifiedBefore = currentTimeHelper.currentOffsetDateTime().minus(
hoursInArm,
ChronoUnit.HOURS
);
List<Integer> audioFileIdsToBeMarked = externalObjectDirectoryRepository.findMediaFileIdsIn2StorageLocationsBeforeTime(
storedStatus,
storedStatus,
inboundLocation,
armLocation,
lastModifiedBefore
);

if (audioFileIdsToBeMarked.isEmpty()) {
log.debug("No Inbound Audio files found that need to be marked for deletion.");
return;
}
log.debug("Marking the following ExternalObjectDirectory.Id's for deletion:- {}", audioFileIdsToBeMarked);

ObjectDirectoryStatusEntity deletionStatus = objectDirectoryStatusRepository.getReferenceById(
MARKED_FOR_DELETION.getId());

UserAccountEntity user = userAccountRepository.findSystemUser(systemUserHelper.findSystemUserGuid("housekeeping"));
externalObjectDirectoryRepository.updateStatus(
deletionStatus,
user,
audioFileIdsToBeMarked,
OffsetDateTime.now()
);
}
}
Loading

0 comments on commit 07098c8

Please sign in to comment.