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));
            }
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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;
        }