public void Should_map_properties_for_update_hearing_request() { var username = "******"; var scheduledDateTime = new DateTime(2020, 12, 12); var caseRequest = new CaseRequest { Name = "casename", Number = "casenumber" }; var source = new EditHearingRequest { HearingRoomName = "roomname", HearingVenueName = "venuename", OtherInformation = "other information", ScheduledDateTime = scheduledDateTime, ScheduledDuration = 45, Case = new EditCaseRequest { Name = caseRequest.Name, Number = caseRequest.Number }, QuestionnaireNotRequired = false, AudioRecordingRequired = false }; var result = HearingUpdateRequestMapper.MapTo(source, username); result.HearingRoomName.Should().Be(source.HearingRoomName); result.HearingVenueName.Should().Be(source.HearingVenueName); result.ScheduledDateTime.Should().Be(scheduledDateTime); result.ScheduledDuration.Should().Be(source.ScheduledDuration); result.OtherInformation.Should().Be(source.OtherInformation); result.Cases.Should().BeEquivalentTo(caseRequest); result.QuestionnaireNotRequired.Should().BeFalse(); result.AudioRecordingRequired.Should().BeFalse(); }
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; } }