コード例 #1
0
        public async Task <ActionResult <HearingDetailsResponse> > EditHearing(Guid hearingId,
                                                                               [FromBody] EditHearingRequest request)
        {
            var usernameAdIdDict = new Dictionary <string, User>();

            if (hearingId == Guid.Empty)
            {
                _logger.LogWarning("No hearing id found to edit");
                ModelState.AddModelError(nameof(hearingId), $"Please provide a valid {nameof(hearingId)}");
                return(BadRequest(ModelState));
            }

            _logger.LogDebug("Attempting to edit hearing {Hearing}", hearingId);

            var result = _editHearingRequestValidator.Validate(request);

            if (!result.IsValid)
            {
                _logger.LogWarning("Failed edit hearing validation");
                ModelState.AddFluentValidationErrors(result.Errors);
                return(BadRequest(ModelState));
            }

            HearingDetailsResponse originalHearing;

            try
            {
                originalHearing = await _bookingsApiClient.GetHearingDetailsByIdAsync(hearingId);
            }
            catch (BookingsApiException e)
            {
                _logger.LogError(e,
                                 "Failed to get hearing {Hearing}. Status Code {StatusCode} - Message {Message}",
                                 hearingId, e.StatusCode, e.Response);
                if (e.StatusCode != (int)HttpStatusCode.NotFound)
                {
                    throw;
                }

                return(NotFound($"No hearing with id found [{hearingId}]"));
            }

            try
            {
                //Save hearing details
                var updateHearingRequest =
                    HearingUpdateRequestMapper.MapTo(request, _userIdentity.GetUserIdentityName());
                await _bookingsApiClient.UpdateHearingDetailsAsync(hearingId, updateHearingRequest);

                var newParticipantList = new List <ParticipantRequest>();

                foreach (var participant in request.Participants)
                {
                    if (!participant.Id.HasValue)
                    {
                        await _hearingsService.ProcessNewParticipants(hearingId, participant, originalHearing,
                                                                      usernameAdIdDict, newParticipantList);
                    }
                    else
                    {
                        await _hearingsService.ProcessExistingParticipants(hearingId, originalHearing, participant);
                    }
                }

                // Delete existing participants if the request doesn't contain any update information
                originalHearing.Participants ??= new List <ParticipantResponse>();
                await RemoveParticipantsFromHearing(hearingId, request, originalHearing);

                // Add new participants
                await _hearingsService.SaveNewParticipants(hearingId, newParticipantList);

                var addedParticipantToHearing = await _bookingsApiClient.GetHearingDetailsByIdAsync(hearingId);

                await _hearingsService.UpdateParticipantLinks(hearingId, request, addedParticipantToHearing);

                // endpoints
                await _hearingsService.ProcessEndpoints(hearingId, request, originalHearing, newParticipantList);

                var updatedHearing = await _bookingsApiClient.GetHearingDetailsByIdAsync(hearingId);

                await _hearingsService.AddParticipantLinks(hearingId, request, updatedHearing);

                _logger.LogDebug("Attempting assign participants to the correct group");
                await _hearingsService.AssignParticipantToCorrectGroups(updatedHearing, usernameAdIdDict);

                _logger.LogDebug("Successfully assigned participants to the correct group");

                // Send a notification email to newly created participants
                var newParticipantEmails = newParticipantList.Select(p => p.ContactEmail).ToList();
                await SendEmailsToParticipantsAddedToHearing(newParticipantList, updatedHearing, usernameAdIdDict, newParticipantEmails);

                await SendJudgeEmailIfNeeded(updatedHearing, originalHearing);

                if (!updatedHearing.HasScheduleAmended(originalHearing))
                {
                    return(Ok(updatedHearing));
                }


                var participantsForAmendment = updatedHearing.Participants
                                               .Where(p => !newParticipantEmails.Contains(p.ContactEmail)).ToList();
                await _hearingsService.SendHearingUpdateEmail(originalHearing, updatedHearing,
                                                              participantsForAmendment);


                return(Ok(updatedHearing));
            }
            catch (BookingsApiException e)
            {
                _logger.LogError(e,
                                 "Failed to edit hearing {Hearing}. Status Code {StatusCode} - Message {Message}",
                                 hearingId, e.StatusCode, e.Response);
                if (e.StatusCode == (int)HttpStatusCode.BadRequest)
                {
                    return(BadRequest(e.Response));
                }

                throw;
            }
        }