public IActionResult UpdateSubmission(string submissionId, [FromBody] UpdateCaseSubmissionRequest request) { var validator = new UpdateCaseSubmissionRequestValidator(); var validationResults = validator.Validate(request); if (!validationResults.IsValid) { return(BadRequest(validationResults.ToString())); } try { return(Ok(_formSubmissionsUseCase.ExecuteUpdateSubmission(submissionId, request))); } catch (WorkerNotFoundException e) { return(UnprocessableEntity(e.Message)); } catch (PersonNotFoundException e) { return(UnprocessableEntity(e.Message)); } catch (GetSubmissionException e) { return(UnprocessableEntity(e.Message)); } catch (UpdateSubmissionException e) { return(UnprocessableEntity(e.Message)); } }
public CaseSubmissionResponse ExecuteUpdateSubmission(string submissionId, UpdateCaseSubmissionRequest request) { var worker = GetSanitisedWorker(request.EditedBy); var updatedSubmission = _mongoGateway.LoadRecordById <CaseSubmission?>(_collectionName, ObjectId.Parse(submissionId)); if (updatedSubmission == null) { throw new GetSubmissionException($"Submission with ID {submissionId} not found"); } UpdateSubmissionState(updatedSubmission, request, worker); UpdateResidents(updatedSubmission, request); updatedSubmission.EditHistory.Add(new EditHistory <Worker> { Worker = worker, EditTime = DateTime.Now }); _mongoGateway.UpsertRecord(_collectionName, ObjectId.Parse(submissionId), updatedSubmission); return(updatedSubmission.ToDomain().ToResponse()); }
private void UpdateResidents(CaseSubmission caseSubmission, UpdateCaseSubmissionRequest request) { if (request.Residents == null) { return; } if (request.Residents.Count == 0) { throw new UpdateSubmissionException("A submission must be against at least one resident"); } if (caseSubmission.SubmissionState != SubmissionState.InProgress) { throw new UpdateSubmissionException("Cannot update residents for submission, submission state not 'in progress'"); } var residentsWithoutDuplicates = new HashSet <long>(request.Residents); var newResident = residentsWithoutDuplicates.Select(GetSanitisedResident).ToList(); caseSubmission.Residents = newResident; }
private static void UpdateSubmissionState(CaseSubmission submission, UpdateCaseSubmissionRequest request, Worker worker) { if (request.SubmissionState == null) { return; } var mapSubmissionStateToResponseString = new Dictionary <SubmissionState, string> { { SubmissionState.InProgress, "In progress" }, { SubmissionState.Submitted, "Submitted" }, { SubmissionState.Approved, "Approved" }, { SubmissionState.Discarded, "Discarded" }, { SubmissionState.PanelApproved, "Panel Approved" } }; if (!_stringToSubmissionState.ContainsKey(request.SubmissionState.ToLower())) { throw new UpdateSubmissionException($"Invalid submission state supplied {request.SubmissionState}"); } var newSubmissionState = _stringToSubmissionState[request.SubmissionState.ToLower()]; // We should never hit the default but C# compiler complains if we don't provide a default case // https://stackoverflow.com/questions/1098644/switch-statement-without-default-when-dealing-with-enumerations switch (newSubmissionState) { case SubmissionState.Discarded: if (submission.SubmissionState != SubmissionState.InProgress) { throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}"); } break; case SubmissionState.InProgress: if (submission.SubmissionState != SubmissionState.Submitted && submission.SubmissionState != SubmissionState.Approved) { throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}"); } submission.RejectionReason = request.RejectionReason; break; case SubmissionState.Submitted: if (submission.SubmissionState != SubmissionState.InProgress) { throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}"); } submission.SubmittedAt = DateTime.Now; submission.SubmittedBy = worker; break; case SubmissionState.Approved: if (submission.SubmissionState != SubmissionState.Submitted) { throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}"); } if (submission.CreatedBy.Email.Equals(request.EditedBy, StringComparison.OrdinalIgnoreCase)) { throw new UpdateSubmissionException($"Worker with email {request.EditedBy} cannot approve the submission as they created the submission"); } submission.ApprovedAt = DateTime.Now; submission.ApprovedBy = worker; break; case SubmissionState.PanelApproved: if (submission.SubmissionState != SubmissionState.Approved) { throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}"); } if (submission.CreatedBy.Email.Equals(request.EditedBy, StringComparison.OrdinalIgnoreCase)) { throw new UpdateSubmissionException($"Worker with email {request.EditedBy} cannot panel approve the submission as they created the submission"); } submission.PanelApprovedAt = DateTime.Now; submission.PanelApprovedBy = worker; break; default: throw new ArgumentOutOfRangeException(nameof(request)); } submission.SubmissionState = newSubmissionState; }