Skip to content
Open
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 @@ -67,8 +67,7 @@ public class MigrationTrackerService {
);

protected static final List<String> CASE_CLOSURE_HEADERS = List.of(
"Case Reference", "Case ID", "Outcome", "Recordings Found",
"Recordings Deleted", "Failure Reason"
"Case Reference", "Case ID", "Outcome", "Failure Reason"
);

protected static final List<String> SHARE_INVITE_FAILURE_HEADERS = List.of(
Expand Down Expand Up @@ -464,8 +463,6 @@ public List<List<String>> buildCaseClosureRows() {
getValueOrEmpty(entry.caseReference()),
getValueOrEmpty(entry.caseId()),
getValueOrEmpty(entry.outcome()),
String.valueOf(entry.recordingsFound()),
String.valueOf(entry.recordingsDeleted()),
getValueOrEmpty(entry.failureReason())
));
}
Expand Down Expand Up @@ -601,8 +598,6 @@ public record CaseClosureReportEntry(
String caseId,
String caseReference,
String outcome,
int recordingsFound,
int recordingsDeleted,
String failureReason
) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,9 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.PlatformTransactionManager;
import uk.gov.hmcts.reform.preapi.batch.application.processor.PostMigrationItemProcessor;
import uk.gov.hmcts.reform.preapi.batch.application.reader.PostMigrationItemReader;
import uk.gov.hmcts.reform.preapi.batch.application.services.MigrationRecordService;
import uk.gov.hmcts.reform.preapi.batch.application.services.migration.EntityCreationService;
import uk.gov.hmcts.reform.preapi.batch.application.services.migration.MigrationTrackerService;
import uk.gov.hmcts.reform.preapi.batch.application.services.migration.MigrationTrackerService.CaseClosureReportEntry;
import uk.gov.hmcts.reform.preapi.batch.application.services.persistence.InMemoryCacheService;
Expand All @@ -30,7 +27,6 @@
import uk.gov.hmcts.reform.preapi.batch.config.BatchConfiguration;
import uk.gov.hmcts.reform.preapi.batch.config.steps.CoreStepsConfig;
import uk.gov.hmcts.reform.preapi.batch.entities.PostMigratedItemGroup;
import uk.gov.hmcts.reform.preapi.controllers.params.SearchRecordings;
import uk.gov.hmcts.reform.preapi.dto.CaseDTO;
import uk.gov.hmcts.reform.preapi.dto.CreateCaseDTO;
import uk.gov.hmcts.reform.preapi.dto.CreateInviteDTO;
Expand All @@ -39,9 +35,7 @@
import uk.gov.hmcts.reform.preapi.dto.ParticipantDTO;
import uk.gov.hmcts.reform.preapi.enums.CaseState;
import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin;
import uk.gov.hmcts.reform.preapi.services.BookingService;
import uk.gov.hmcts.reform.preapi.services.CaseService;
import uk.gov.hmcts.reform.preapi.services.RecordingService;
import uk.gov.hmcts.reform.preapi.services.UserService;

import java.sql.Timestamp;
Expand All @@ -53,19 +47,16 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;


@Configuration
public class PostMigrationJobConfig {
public final PlatformTransactionManager transactionManager;
private final JobRepository jobRepository;
private final CoreStepsConfig coreSteps;
private final LoggingService loggingService;
private final InMemoryCacheService cacheService;
private final EntityCreationService entityCreationService;
private final MigrationTrackerService migrationTrackerService;
private final MigrationRecordService migrationRecordService;
private final CaseService caseService;
private final BookingService bookingService;
private final RecordingService recordingService;
private final PostMigrationItemReader postMigrationItemReader;
private final PostMigrationItemProcessor postMigrationItemProcessor;
private final UserService userService;
Expand All @@ -78,12 +69,8 @@ public PostMigrationJobConfig(final JobRepository jobRepository,
final CoreStepsConfig coreSteps,
final LoggingService loggingService,
final InMemoryCacheService cacheService,
final EntityCreationService entityCreationService,
final MigrationTrackerService migrationTrackerService,
final MigrationRecordService migrationRecordService,
final CaseService caseService,
final BookingService bookingService,
final RecordingService recordingService,
final PostMigrationItemReader postMigrationItemReader,
final PostMigrationItemProcessor postMigrationItemProcessor,
final UserService userService) {
Expand All @@ -92,12 +79,8 @@ public PostMigrationJobConfig(final JobRepository jobRepository,
this.coreSteps = coreSteps;
this.loggingService = loggingService;
this.cacheService = cacheService;
this.entityCreationService = entityCreationService;
this.migrationTrackerService = migrationTrackerService;
this.migrationRecordService = migrationRecordService;
this.caseService = caseService;
this.bookingService = bookingService;
this.recordingService = recordingService;
this.postMigrationItemReader = postMigrationItemReader;
this.postMigrationItemProcessor = postMigrationItemProcessor;
this.userService = userService;
Expand Down Expand Up @@ -147,19 +130,14 @@ public Step createMarkCasesClosedStep() {

AtomicInteger closed = new AtomicInteger();
AtomicInteger skipped = new AtomicInteger();
AtomicInteger recordingsFound = new AtomicInteger();
AtomicInteger recordingsDeleted = new AtomicInteger();

vodafoneCases.forEach(caseDTO ->
processCase(caseDTO, channelUsersMap, closed, skipped, dryRun, recordingsFound, recordingsDeleted)
processCase(caseDTO, channelUsersMap, closed, skipped, dryRun)
);

loggingService.logInfo("Case closure summary — Total: %d, Closed: %d, Skipped: %d",
vodafoneCases.size(), closed.get(), skipped.get());

loggingService.logInfo("Recording cleanup summary — Found: %d, Removed: %d",
recordingsFound.get(), recordingsDeleted.get());

migrationTrackerService.writeCaseClosureReport();

return RepeatStatus.FINISHED;
Expand Down Expand Up @@ -215,8 +193,7 @@ private List<CaseDTO> fetchVodafoneCases() {
}

private void processCase(CaseDTO caseDTO, Map<String, List<String[]>> channelUsersMap,
AtomicInteger closed, AtomicInteger skipped, boolean dryRun,
AtomicInteger recordingsFound, AtomicInteger recordingsDeleted) {
AtomicInteger closed, AtomicInteger skipped, boolean dryRun) {
String reference = caseDTO.getReference();

if (caseDTO.getState() == CaseState.CLOSED) {
Expand All @@ -226,8 +203,6 @@ private void processCase(CaseDTO caseDTO, Map<String, List<String[]>> channelUse
caseDTO.getId() != null ? caseDTO.getId().toString() : "",
reference,
"ALREADY_CLOSED",
0,
0,
"Case already in CLOSED state"
));
return;
Expand All @@ -238,27 +213,18 @@ private void processCase(CaseDTO caseDTO, Map<String, List<String[]>> channelUse
"Case %s does not have matching channel user entry — attempting to close.",
reference);
try {
CleanupStats cleanupStats = deleteActiveRecordings(caseDTO, dryRun);
recordingsFound.addAndGet(cleanupStats.found());
recordingsDeleted.addAndGet(cleanupStats.deleted());

if (!dryRun) {
caseService.upsert(buildClosedCaseDTO(caseDTO));
loggingService.logInfo(
"Closed Vodafone case: %s (%s). Removed %d recording(s).",
reference, caseDTO.getId(), cleanupStats.deleted());
} else {
loggingService.logInfo(
"[DRY RUN] Would close Vodafone case: %s (%s). Would remove %d recording(s).",
reference, caseDTO.getId(), cleanupStats.found());
"[DRY RUN] Would close Vodafone case: %s (%s).",
reference, caseDTO.getId());
}

migrationTrackerService.addCaseClosureEntry(new CaseClosureReportEntry(
caseDTO.getId() != null ? caseDTO.getId().toString() : "",
reference,
dryRun ? "DRY_RUN_CLOSE" : "CLOSED",
cleanupStats.found(),
cleanupStats.deleted(),
""
));

Expand All @@ -268,13 +234,12 @@ private void processCase(CaseDTO caseDTO, Map<String, List<String[]>> channelUse
"Failed to close case %s (%s): %s — %s",
reference, caseDTO.getId(), e.getClass().getSimpleName(), e.getMessage()
);

skipped.incrementAndGet();
migrationTrackerService.addCaseClosureEntry(new CaseClosureReportEntry(
caseDTO.getId() != null ? caseDTO.getId().toString() : "",
reference,
"FAILED",
0,
0,
e.getMessage()
));
}
Expand All @@ -285,8 +250,6 @@ private void processCase(CaseDTO caseDTO, Map<String, List<String[]>> channelUse
caseDTO.getId() != null ? caseDTO.getId().toString() : "",
reference,
"SKIPPED",
0,
0,
"Matching channel user data found"
));
}
Expand All @@ -297,54 +260,6 @@ private boolean hasMatchingChannelUser(String reference, Map<String, List<String
.anyMatch(k -> k.toLowerCase().contains(reference.toLowerCase()));
}

private CleanupStats deleteActiveRecordings(CaseDTO caseDTO, boolean dryRun) {
AtomicInteger discoveredCount = new AtomicInteger();
AtomicInteger deletedCount = new AtomicInteger();

bookingService.findAllByCaseId(caseDTO.getId(), Pageable.unpaged()).forEach(booking -> {
if (booking.getCaptureSessions() == null) {
return;
}

booking.getCaptureSessions().forEach(captureSession -> {
SearchRecordings params = new SearchRecordings();
params.setCaptureSessionId(captureSession.getId());

var recordings = recordingService.findAll(params, false, Pageable.unpaged());
if (recordings.isEmpty()) {
return;
}

recordings.forEach(recording -> {
discoveredCount.incrementAndGet();

if (dryRun) {
loggingService.logDebug(
"[DRY RUN] Would delete recording %s for case %s (capture session %s)",
recording.getId(), caseDTO.getReference(), captureSession.getId()
);
} else {
try {
recordingService.deleteById(recording.getId());
deletedCount.incrementAndGet();
loggingService.logDebug(
"Deleted recording %s for case %s (capture session %s)",
recording.getId(), caseDTO.getReference(), captureSession.getId()
);
} catch (Exception ex) {
loggingService.logError(
"Failed to delete recording %s for case %s: %s",
recording.getId(), caseDTO.getReference(), ex.getMessage()
);
}
}
});
});
});

return new CleanupStats(discoveredCount.get(), deletedCount.get());
}

private CreateCaseDTO buildClosedCaseDTO(CaseDTO caseDTO) {
CreateCaseDTO dto = new CreateCaseDTO();
dto.setId(caseDTO.getId());
Expand Down Expand Up @@ -374,9 +289,6 @@ private CreateParticipantDTO mapParticipant(ParticipantDTO p) {
return dto;
}

private record CleanupStats(int found, int deleted) {
}

private String resolveEmailForShare(PostMigratedItemGroup item, CreateShareBookingDTO share) {
if (item.getInvites() != null) {
String email = item.getInvites().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -838,8 +838,6 @@ void writeCaseClosureReport_returnsFileWhenEntriesExist() {
"case-id",
"REF123",
"CLOSED",
5,
4,
""
)
);
Expand Down
Loading