public async Task <IActionResult> UpdateHearingDetails(Guid hearingId, [FromBody] UpdateHearingRequest request)
        {
            if (hearingId == Guid.Empty)
            {
                ModelState.AddModelError(nameof(hearingId), $"Please provide a valid {nameof(hearingId)}");
                return(BadRequest(ModelState));
            }

            var result = new UpdateHearingRequestValidation().Validate(request);

            if (!result.IsValid)
            {
                ModelState.AddFluentValidationErrors(result.Errors);
                return(BadRequest(ModelState));
            }

            var getHearingByIdQuery = new GetHearingByIdQuery(hearingId);
            var videoHearing        = await _queryHandler.Handle <GetHearingByIdQuery, VideoHearing>(getHearingByIdQuery);

            if (videoHearing == null)
            {
                return(NotFound());
            }

            var venue = await GetVenue(request.HearingVenueName);

            if (venue == null)
            {
                ModelState.AddModelError(nameof(request.HearingVenueName), "Hearing venue does not exist");
                return(BadRequest(ModelState));
            }

            var cases = MapCase(request.Cases);

            // use existing video hearing values here when request properties are null
            request.AudioRecordingRequired ??= videoHearing.AudioRecordingRequired;
            request.QuestionnaireNotRequired ??= videoHearing.QuestionnaireNotRequired;
            request.HearingRoomName ??= videoHearing.HearingRoomName;
            request.OtherInformation ??= videoHearing.OtherInformation;

            var command = new UpdateHearingCommand(hearingId, request.ScheduledDateTime,
                                                   request.ScheduledDuration, venue, request.HearingRoomName, request.OtherInformation,
                                                   request.UpdatedBy, cases, request.QuestionnaireNotRequired.Value, request.AudioRecordingRequired.Value);

            await _commandHandler.Handle(command);

            var hearingMapper  = new HearingToDetailsResponseMapper();
            var updatedHearing = await _queryHandler.Handle <GetHearingByIdQuery, VideoHearing>(getHearingByIdQuery);

            var response = hearingMapper.MapHearingToDetailedResponse(updatedHearing);

            if (videoHearing.Status == BookingStatus.Created)
            {
                // publish this event when Hearing is set for ready for video
                await _eventPublisher.PublishAsync(new HearingDetailsUpdatedIntegrationEvent(updatedHearing));
            }

            return(Ok(response));
        }
        public async Task should_send_message_to_bqs_with_updated_hearing()
        {
            var videoHearing = GetHearing("Original Hearing");

            videoHearing.UpdateStatus(BookingStatus.Created, "initial", null);
            var request = new UpdateHearingRequest
            {
                OtherInformation         = videoHearing.OtherInformation + " Updated",
                ScheduledDuration        = 999,
                UpdatedBy                = "updated by test",
                ScheduledDateTime        = DateTime.Today.AddDays(2),
                HearingRoomName          = "Updated room name",
                HearingVenueName         = "Updated venue name",
                QuestionnaireNotRequired = false,
                AudioRecordingRequired   = true,
                Cases = null
            };
            var hearingVenueOriginal = videoHearing.HearingVenue;
            var newVenue             = new HearingVenue(111, request.HearingVenueName);
            var updatedHearing       = GetHearing("Case Update Test");

            updatedHearing.SetProtected(nameof(updatedHearing.Id), videoHearing.Id);
            updatedHearing.UpdateHearingDetails(newVenue,
                                                request.ScheduledDateTime, request.ScheduledDuration, request.HearingRoomName, request.OtherInformation,
                                                request.UpdatedBy, new List <Case>(), request.QuestionnaireNotRequired.Value,
                                                request.AudioRecordingRequired.Value);

            QueryHandlerMock
            .SetupSequence(x => x.Handle <GetHearingByIdQuery, VideoHearing>(It.IsAny <GetHearingByIdQuery>()))
            .ReturnsAsync(videoHearing).ReturnsAsync(updatedHearing);

            QueryHandlerMock
            .Setup(x => x.Handle <GetHearingVenuesQuery, List <HearingVenue> >(It.IsAny <GetHearingVenuesQuery>()))
            .ReturnsAsync(new List <HearingVenue> {
                hearingVenueOriginal, newVenue
            });
            var expectedResult = new HearingToDetailsResponseMapper().MapHearingToDetailedResponse(updatedHearing);

            var result = await Controller.UpdateHearingDetails(videoHearing.Id, request);

            var ob = result.As <OkObjectResult>();

            ob.Should().NotBeNull();
            ob.Value.As <HearingDetailsResponse>().Should().BeEquivalentTo(expectedResult);

            var message = SbQueueClient.ReadMessageFromQueue();
            var payload = message.IntegrationEvent.As <HearingDetailsUpdatedIntegrationEvent>();

            payload.Hearing.HearingId.Should().Be(updatedHearing.Id);
            payload.Hearing.GroupId.Should().Be(updatedHearing.SourceId.GetValueOrDefault());
            payload.Hearing.RecordAudio.Should().Be(request.AudioRecordingRequired.Value);
            payload.Hearing.ScheduledDuration.Should().Be(request.ScheduledDuration);
            payload.Hearing.ScheduledDateTime.Should().Be(request.ScheduledDateTime);
            payload.Hearing.HearingVenueName.Should().Be(request.HearingVenueName);
        }
        public async Task Should_return_badrequest_with_an_invalid_hearingid()
        {
            var request   = new UpdateHearingRequest();
            var hearingId = Guid.Empty;

            var result = await Controller.UpdateHearingDetails(hearingId, request);

            result.Should().NotBeNull();
            var objectResult = (BadRequestObjectResult)result;

            objectResult.StatusCode.Should().Be((int)HttpStatusCode.BadRequest);
            ((SerializableError)objectResult.Value).ContainsKeyAndErrorMessage(nameof(hearingId), $"Please provide a valid {nameof(hearingId)}");
        }
        public async Task Should_update_hearing_with_status_created_and_send_event_to_video()
        {
            var request = new UpdateHearingRequest
            {
                ScheduledDateTime = DateTime.Now.AddDays(2),
                HearingRoomName   = "123",
                ScheduledDuration = 15,
                OtherInformation  = "note",
                HearingVenueName  = "venue1",
                Cases             = new List <CaseRequest> {
                    new CaseRequest {
                        Name = "123XX", Number = "123YY", IsLeadCase = true
                    }
                },
                UpdatedBy = "*****@*****.**"
            };

            var hearingId = Guid.NewGuid();
            var hearing   = GetHearing("123");

            hearing.UpdateStatus(BookingStatus.Created, "administrator", string.Empty);
            hearing.UpdateHearingDetails(new HearingVenue(1, "venue1"), DateTime.Now.AddDays(2),
                                         15, "123", "note", "administrator", new List <Case> {
                new Case("123", "name")
            }, true, true);
            QueryHandlerMock
            .Setup(x => x.Handle <GetHearingByIdQuery, VideoHearing>(It.IsAny <GetHearingByIdQuery>()))
            .ReturnsAsync(hearing);

            var venues = new List <HearingVenue> {
                new HearingVenue(1, "venue1"),
            };

            QueryHandlerMock
            .Setup(x => x.Handle <GetHearingVenuesQuery, List <HearingVenue> >(It.IsAny <GetHearingVenuesQuery>()))
            .ReturnsAsync(venues);

            var result = await Controller.UpdateHearingDetails(hearingId, request);

            result.Should().NotBeNull();
            var objectResult = (OkObjectResult)result;

            objectResult.StatusCode.Should().Be((int)HttpStatusCode.OK);

            var message      = SbQueueClient.ReadMessageFromQueue();
            var typedMessage = (HearingDetailsUpdatedIntegrationEvent)message.IntegrationEvent;

            typedMessage.Should().NotBeNull();
            typedMessage.Hearing.CaseName.Should().Be("name");
        }
        public async Task Should_return_notfound_when_no_matching_venue_found()
        {
            var request = new UpdateHearingRequest
            {
                ScheduledDateTime = DateTime.Now.AddDays(2),
                HearingRoomName   = "123",
                ScheduledDuration = 15,
                OtherInformation  = "note",
                HearingVenueName  = "venue2",
                Cases             = new List <CaseRequest> {
                    new CaseRequest {
                        Name = "123XX", Number = "123YY", IsLeadCase = true
                    }
                },
                UpdatedBy = "*****@*****.**"
            };

            var hearingId = Guid.NewGuid();
            var hearing   = GetHearing("123");

            hearing.UpdateStatus(BookingStatus.Created, "administrator", string.Empty);
            hearing.UpdateHearingDetails(new HearingVenue(1, "venue1"), DateTime.Now.AddDays(2),
                                         15, "123", "note", "administrator", new List <Case> {
                new Case("123", "name")
            }, true, true);
            QueryHandlerMock
            .Setup(x => x.Handle <GetHearingByIdQuery, VideoHearing>(It.IsAny <GetHearingByIdQuery>()))
            .ReturnsAsync(hearing);

            var venues = new List <HearingVenue> {
                new HearingVenue(1, "venue1"),
            };

            QueryHandlerMock
            .Setup(x => x.Handle <GetHearingVenuesQuery, List <HearingVenue> >(It.IsAny <GetHearingVenuesQuery>()))
            .ReturnsAsync(venues);

            var result = await Controller.UpdateHearingDetails(hearingId, request);

            result.Should().NotBeNull();
            var objectResult = (BadRequestObjectResult)result;

            objectResult.StatusCode.Should().Be((int)HttpStatusCode.BadRequest);
            ((SerializableError)objectResult.Value).ContainsKeyAndErrorMessage(nameof(request.HearingVenueName),
                                                                               "Hearing venue does not exist");
        }
        public static UpdateHearingRequest MapTo(EditHearingRequest editHearingRequest, string userName)
        {
            var updateHearingRequest = new UpdateHearingRequest
            {
                HearingRoomName   = editHearingRequest.HearingRoomName,
                HearingVenueName  = editHearingRequest.HearingVenueName,
                OtherInformation  = editHearingRequest.OtherInformation,
                ScheduledDateTime = editHearingRequest.ScheduledDateTime,
                ScheduledDuration = editHearingRequest.ScheduledDuration,
                UpdatedBy         = userName,
                Cases             = new List <CaseRequest>
                {
                    new CaseRequest
                    {
                        Name   = editHearingRequest.Case.Name,
                        Number = editHearingRequest.Case.Number
                    }
                },
                QuestionnaireNotRequired = false,
                AudioRecordingRequired   = editHearingRequest.AudioRecordingRequired
            };

            return(updateHearingRequest);
        }
Exemple #7
0
        public async Task Should_update_conference_when_hearing_updated()
        {
            await CreateAndConfirmHearing();

            var caseRequests = new List <CaseRequest>
            {
                new CaseRequest
                {
                    IsLeadCase = Hearing.Cases.First().IsLeadCase,
                    Name       = $"{Hearing.Cases.First().Name} {HearingData.UPDATED_TEXT}",
                    Number     = $"{Hearing.Cases.First().Number} {HearingData.UPDATED_TEXT}"
                }
            };

            var request = new UpdateHearingRequest
            {
                AudioRecordingRequired = !Hearing.AudioRecordingRequired,
                Cases                    = caseRequests,
                HearingRoomName          = $"{Hearing.HearingRoomName} {HearingData.UPDATED_TEXT}",
                HearingVenueName         = Hearing.HearingVenueName.Equals(HearingData.VENUE_NAME) ? HearingData.VENUE_NAME_ALTERNATIVE : HearingData.VENUE_NAME,
                OtherInformation         = $"{Hearing.OtherInformation} {HearingData.UPDATED_TEXT}",
                QuestionnaireNotRequired = !Hearing.QuestionnaireNotRequired,
                ScheduledDateTime        = Hearing.ScheduledDateTime.AddMinutes(10),
                ScheduledDuration        = Hearing.ScheduledDuration / 2,
                UpdatedBy                = EmailData.NON_EXISTENT_USERNAME
            };

            var hearingDetails = await BookingApiClient.UpdateHearingDetailsAsync(Hearing.Id, request);

            Verify.UpdatedHearing(hearingDetails, request);

            var response = await GetUpdatedConferenceDetailsPollingAsync(Hearing.Id);

            response.Should().NotBeNull();
            Verify.UpdatedConference(response, request);
        }
Exemple #8
0
        public static void UpdatedConference(ConferenceDetailsResponse conferenceDetails, UpdateHearingRequest request)
        {
            conferenceDetails.Should().BeEquivalentTo(request, options => options
                                                      .Excluding(x => x.Cases)
                                                      .Excluding(x => x.HearingRoomName)
                                                      .Excluding(x => x.OtherInformation)
                                                      .Excluding(x => x.QuestionnaireNotRequired)
                                                      .Excluding(x => x.UpdatedBy)
                                                      );

            conferenceDetails.CaseName.Should().Be(request.Cases.First().Name);
            conferenceDetails.CaseNumber.Should().Be(request.Cases.First().Number);
        }
Exemple #9
0
 public static void UpdatedHearing(HearingDetailsResponse hearingDetails, UpdateHearingRequest request)
 {
     hearingDetails.Should().BeEquivalentTo(request);
 }