Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
40b714c
Proposed JSON schema and samples for edit requests
lydiaralphgov Mar 5, 2026
e619747
Add source and output recording IDs to edit request
lydiaralphgov Mar 5, 2026
c992304
Remove ffmpeg instructions from JSON as the user doesn't need to see …
lydiaralphgov Mar 5, 2026
c657736
Basic Edit Request rejig of domain objects
lydiaralphgov Mar 9, 2026
94d456a
Added new edit request classes with tests
lydiaralphgov Mar 11, 2026
6c72534
Recording object test
lydiaralphgov Mar 11, 2026
604fc12
Tweaks to recording object
lydiaralphgov Mar 11, 2026
9fda2c5
Update imports and entities
lydiaralphgov Mar 19, 2026
c7f1405
Split EditRequestService into multiple sub-services
lydiaralphgov Mar 25, 2026
542be54
Separate out email service from core edit processing
lydiaralphgov Mar 25, 2026
53c0626
Consolidate edit email service
lydiaralphgov Mar 25, 2026
a708398
Fix case closure checker
lydiaralphgov Mar 25, 2026
debc817
Tidy up, and CrudService unit test
lydiaralphgov Mar 26, 2026
fdcdbdd
More splitting out, and more unit tests
lydiaralphgov Mar 27, 2026
4de2f13
Constructor for CSV input
lydiaralphgov Mar 27, 2026
b40895f
Sorted out email tests
lydiaralphgov Mar 27, 2026
d5bbf93
Fixed more unit tests
lydiaralphgov Mar 27, 2026
03f9d85
Chipping away at unit tests
lydiaralphgov Mar 27, 2026
2c42e7f
Merge branch 'master' into S28-4780/edit-request-schema
lydiaralphgov Apr 7, 2026
339dcf6
Moved lots of things around and fixed more tests
lydiaralphgov Apr 8, 2026
52abb3e
Fixed unit test
lydiaralphgov Apr 15, 2026
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 @@ -8,8 +8,8 @@
import org.junit.jupiter.params.provider.NullSource;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import uk.gov.hmcts.reform.preapi.controllers.params.TestingSupportRoles;
import uk.gov.hmcts.reform.preapi.dto.EditCutInstructionDTO;
import uk.gov.hmcts.reform.preapi.dto.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.edit.EditCutInstructionsDTO;
import uk.gov.hmcts.reform.preapi.dto.edit.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.FfmpegEditInstructionDTO;
import uk.gov.hmcts.reform.preapi.dto.RecordingDTO;
import uk.gov.hmcts.reform.preapi.enums.EditRequestStatus;
Expand Down Expand Up @@ -47,13 +47,13 @@ void editFromCsvSuccess() throws JsonProcessingException {
).as(EditRequestDTO.class);

assertThat(postResponse.getId()).isNotNull();
assertThat(postResponse.getSourceRecording().getId()).isEqualTo(recordingDetails.recordingId());
assertThat(postResponse.getSourceRecordingId()).isEqualTo(recordingDetails.recordingId());
assertThat(postResponse.getStatus()).isEqualTo(EditRequestStatus.PENDING);

var instructions = postResponse.getEditInstruction();
assertThat(postResponse.getEditInstruction()).isNotNull();
List<EditCutInstructionsDTO> instructions = postResponse.getEditCutInstructions();
assertThat(postResponse.getEditCutInstructions()).isNotNull();

List<EditCutInstructionDTO> requestedInstructions = instructions.getRequestedInstructions();
List<EditCutInstructionsDTO> requestedInstructions = instructions.getRequestedInstructions();
assertThat(requestedInstructions).isNotEmpty();
assertThat(requestedInstructions.size()).isEqualTo(2);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,13 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import uk.gov.hmcts.reform.preapi.email.govnotify.GovNotify;
import uk.gov.hmcts.reform.preapi.entities.Booking;
import uk.gov.hmcts.reform.preapi.entities.CaptureSession;
import uk.gov.hmcts.reform.preapi.email.govnotify.templates.EditEmailParameters;
import uk.gov.hmcts.reform.preapi.entities.Case;
import uk.gov.hmcts.reform.preapi.entities.Court;
import uk.gov.hmcts.reform.preapi.entities.EditRequest;
import uk.gov.hmcts.reform.preapi.entities.Participant;
import uk.gov.hmcts.reform.preapi.entities.Recording;
import uk.gov.hmcts.reform.preapi.entities.User;
import uk.gov.hmcts.reform.preapi.enums.ParticipantType;
import uk.gov.hmcts.reform.preapi.enums.EditRequestStatus;

import java.sql.Timestamp;
import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;

Expand Down Expand Up @@ -49,32 +44,25 @@ private Case createCase() {
return forCase;
}

private Participant createParticipant(ParticipantType type) {
var participant = new Participant();
participant.setFirstName("First");
participant.setLastName("Last");
participant.setParticipantType(type);
return participant;
}

private EditRequest createEditRequest() {
var aCase = createCase();
var booking = new Booking();
booking.setCaseId(aCase);
booking.setParticipants(Set.of(
createParticipant(ParticipantType.WITNESS),
createParticipant(ParticipantType.DEFENDANT)));
var captureSession = new CaptureSession();
captureSession.setBooking(booking);
var recording = new Recording();
recording.setCaptureSession(captureSession);
var request = new EditRequest();
request.setSourceRecording(recording);
request.setEditInstruction(
"{\"requestedInstructions\":"
+ "[{\"start_of_cut\":\"00:00:00\",\"end_of_cut\":\"00:00:30\",\"reason\":\"\",\"start\":0,\"end\":0}],"
+ "\"ffmpegInstructions\":[]}");
return request;
private EditEmailParameters createEditEmailParameters() {
return EditEmailParameters.builder()
.toEmailAddress(FROM_EMAIL_ADDRESS)
.caseReference("123456")
.witnessName("First")
.defendantName("First Last")
.courtName("Court Name")
.editSummary("""
Edit 1:\s
Start time: 00:00:00
End time: 00:00:30
Time Removed: 00:00:00
Reason:\s""")
.editRequestStatus(EditRequestStatus.DRAFT)
.numberOfRequestedEditInstructions(1)
.jointlyAgreed(true)
.rejectionReason(null)
.build();
}

private void compareBody(String expected, EmailResponse emailResponse) {
Expand Down Expand Up @@ -276,10 +264,8 @@ void verifyEmail() {
@DisplayName("Should send editing jointly agreed email")
@SuppressWarnings("LineLength")
void editingJointlyAgreed() {
var user = createUser();
var forEditRequest = createEditRequest();
EmailResponse response = client.sendEmailAboutEditingRequest(createEditEmailParameters());

var response = client.editingJointlyAgreed(user.getEmail(), forEditRequest);
assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail());
assertEquals(
"[Do Not Reply] Pre-recorded Evidence: Edit request for case reference 123456",
Expand Down Expand Up @@ -310,10 +296,10 @@ Defendant name(s): First Last
@DisplayName("Should send editing not jointly agreed email")
@SuppressWarnings("LineLength")
void editingNotJointlyAgreed() {
var user = createUser();
var forEditRequest = createEditRequest();
EditEmailParameters editEmailParameters = createEditEmailParameters();
editEmailParameters.setJointlyAgreed(false);

var response = client.editingNotJointlyAgreed(user.getEmail(), forEditRequest);
var response = client.sendEmailAboutEditingRequest(editEmailParameters);
assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail());
assertEquals(
"[Do Not Reply] Pre-recorded Evidence: Edit request for case reference 123456 (NOT JOINTLY AGREED)",
Expand Down Expand Up @@ -344,12 +330,11 @@ Defendant name(s): First Last
@DisplayName("Should send editing rejection email")
@SuppressWarnings("LineLength")
void editingRejectionEmail() {
var user = createUser();
var forEditRequest = createEditRequest();
forEditRequest.setRejectionReason("REJECTION REASON");
forEditRequest.setJointlyAgreed(true);
EditEmailParameters editEmailParameters = createEditEmailParameters();
editEmailParameters.setRejectionReason("REJECTION REASON");
editEmailParameters.setJointlyAgreed(true);

var response = client.editingRejected(user.getEmail(), forEditRequest);
var response = client.sendEmailAboutEditingRequest(editEmailParameters);
assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail());
assertEquals(
"[Do Not Reply] Pre-recorded Evidence: Edit request REJECTION for case reference 123456",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
import org.springframework.web.multipart.MultipartFile;
import uk.gov.hmcts.reform.preapi.controllers.base.PreApiController;
import uk.gov.hmcts.reform.preapi.controllers.params.SearchEditRequests;
import uk.gov.hmcts.reform.preapi.dto.CreateEditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.edit.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.exception.BadRequestException;
import uk.gov.hmcts.reform.preapi.exception.PathPayloadMismatchException;
import uk.gov.hmcts.reform.preapi.exception.RequestedPageOutOfRangeException;
Expand Down Expand Up @@ -114,22 +113,22 @@ public HttpEntity<PagedModel<EntityModel<EditRequestDTO>>> searchEdits(

@PutMapping("/{id}")
@PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_3')")
public ResponseEntity<Void> upsertEditRequest(
public ResponseEntity<EditRequestDTO> upsertEditRequest(
@PathVariable("id") UUID id,
@Valid @RequestBody CreateEditRequestDTO createEditRequestDTO
@Valid @RequestBody EditRequestDTO createEditRequestDTO
) {
if (!id.equals(createEditRequestDTO.getId())) {
throw new PathPayloadMismatchException("editRequestId", "createEditRequestDTO.id");
}

return getUpsertResponse(editRequestService.upsert(createEditRequestDTO), id);
return ResponseEntity.ok(editRequestService.upsert(createEditRequestDTO));
}

@DeleteMapping("/{id}")
@PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_3')")
public ResponseEntity<Void> delete(
@PathVariable("id") UUID id,
@Valid @RequestBody CreateEditRequestDTO deleteEditRequestDTO
@Valid @RequestBody EditRequestDTO deleteEditRequestDTO
) {
if (!id.equals(deleteEditRequestDTO.getId())) {
throw new PathPayloadMismatchException("editRequestId", "deleteEditRequestDTO.id");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import uk.gov.hmcts.reform.preapi.batch.repositories.MigrationRecordRepository;
import uk.gov.hmcts.reform.preapi.controllers.params.TestingSupportRoles;
import uk.gov.hmcts.reform.preapi.dto.BookingDTO;
import uk.gov.hmcts.reform.preapi.dto.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.edit.EditRequestDTO;
import uk.gov.hmcts.reform.preapi.dto.RecordingDTO;
import uk.gov.hmcts.reform.preapi.dto.migration.VfMigrationRecordDTO;
import uk.gov.hmcts.reform.preapi.entities.AppAccess;
Expand Down Expand Up @@ -438,7 +438,7 @@ public ResponseEntity<Map<String, Object>> triggerEditRequestProcessing(@PathVar
appAccess,
List.of(new SimpleGrantedAuthority("ROLE_SUPER_USER"))));

EditRequest editRequest = new EditRequest();
EditRequestDTO editRequest = new EditRequestDTO();
editRequest.setId(editId);
editRequest.setStatus(EditRequestStatus.PROCESSING);
RecordingDTO recording = editRequestService.performEdit(editRequest);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.reform.preapi.dto.base.BaseRecordingDTO;
import uk.gov.hmcts.reform.preapi.entities.Recording;

import java.util.UUID;

Expand All @@ -24,19 +23,6 @@ public class CreateRecordingDTO extends BaseRecordingDTO {
@NotNull(message = "capture_session_id is required")
protected UUID captureSessionId;

public CreateRecordingDTO(Recording recording) {
super();
id = recording.getId();
captureSessionId = recording.getCaptureSession().getId();
if (recording.getParentRecording() != null) {
parentRecordingId = recording.getParentRecording().getId();
}
version = recording.getVersion();
filename = recording.getFilename();
duration = recording.getDuration();
editInstructions = recording.getEditInstruction();
}

public CreateRecordingDTO(RecordingDTO recordingDTO) {
super();
id = recordingDTO.getId();
Expand All @@ -45,6 +31,27 @@ public CreateRecordingDTO(RecordingDTO recordingDTO) {
version = recordingDTO.getVersion();
filename = recordingDTO.getFilename();
duration = recordingDTO.getDuration();
editRequest = recordingDTO.getEditRequest();
editStatus = recordingDTO.getEditStatus();
editInstructions = recordingDTO.getEditInstructions();
}

public CreateRecordingDTO(UUID newRecordingId,
String providedFileName,
Integer providedVersionNumber,
RecordingDTO recordingDTO) {
super();
id = newRecordingId;
version = providedVersionNumber;
filename = providedFileName;

parentRecordingId = recordingDTO.getParentRecordingId() == null
? recordingDTO.getId()
: recordingDTO.getParentRecordingId();
captureSessionId = recordingDTO.getCaptureSession().getId();
duration = recordingDTO.getDuration();
editRequest = recordingDTO.getEditRequest();
editStatus = recordingDTO.getEditStatus();
editInstructions = recordingDTO.getEditInstructions();
}
}
Loading