예제 #1
0
        private SlotSimple GetFreeSlotsFromDatabase(string responseStream)
        {
            var slotSimple = new SlotSimple()
            {
                CurrentSlotEntrySimple = new List <SlotEntrySimple>(),
                PastSlotEntrySimple    = new List <SlotEntrySimple>(),
                Issue = new List <Issue>()
            };

            var results = JsonConvert.DeserializeObject <Bundle>(responseStream);

            var slotResources = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Slot).ToList();

            if (slotResources == null || slotResources?.Count == 0)
            {
                return(slotSimple);
            }

            var practitionerResources = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Practitioner).ToList();
            var locationResources     = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Location).ToList();
            var scheduleResources     = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Schedule).ToList();

            var slotList = (from slot in slotResources?.Where(s => s.resource != null)
                            let practitioner = GetPractitionerDetails(slot.resource.schedule.reference, scheduleResources, practitionerResources)
                                               let location = GetLocation(slot.resource.schedule.reference, scheduleResources, locationResources)
                                                              let schedule = GetSchedule(slot.resource.schedule.reference, scheduleResources)
                                                                             select new SlotEntrySimple
            {
                AppointmentDate = slot.resource.start.GetValueOrDefault().DateTime,
                SessionName = schedule.resource.serviceCategory?.text,
                StartTime = slot.resource.start.GetValueOrDefault().DateTime,
                Duration = slot.resource.start.DurationBetweenTwoDates(slot.resource.end),
                SlotType = slot.resource.serviceType.FirstOrDefault()?.text,
                DeliveryChannel = slot.resource.extension?.FirstOrDefault()?.valueCode,
                PractitionerGivenName = practitioner?.name?.FirstOrDefault()?.given?.FirstOrDefault(),
                PractitionerFamilyName = practitioner?.name?.FirstOrDefault()?.family,
                PractitionerPrefix = practitioner?.name?.FirstOrDefault()?.prefix?.FirstOrDefault(),
                PractitionerRole = schedule.resource.extension?.FirstOrDefault()?.valueCodeableConcept?.coding?.FirstOrDefault()?.display,
                PractitionerGender = practitioner?.gender,
                LocationName = location?.name,
                LocationAddressLines = location?.address?.line,
                LocationAddressLinesAsString = AddressBuilder.GetFullAddress(location?.address?.line, location?.address?.district, location?.address?.city, location?.address?.postalCode, location?.address?.country),
                LocationCity = location?.address?.city,
                LocationCountry = location?.address?.country,
                LocationDistrict = location?.address?.district,
                LocationPostalCode = location?.address?.postalCode,
                SlotInPast = slot.resource.start.GetValueOrDefault().DateTime <= _currentDateTime
            }).OrderBy(z => z.LocationName)
                           .ThenBy(s => s.AppointmentDate)
                           .ThenBy(s => s.StartTime);

            slotSimple.CurrentSlotEntrySimple.AddRange(slotList.Where(x => !x.SlotInPast));
            slotSimple.PastSlotEntrySimple.AddRange(slotList.Where(x => x.SlotInPast));

            return(slotSimple);
        }
        private async Task <SlotSimple> GetFreeSlots(RequestParameters requestParameters, DateTime startDate, DateTime endDate, string baseAddress)
        {
            var getRequest = new HttpRequestMessage();

            try
            {
                var spineMessageType = (_configurationService.GetSpineMessageTypes()).FirstOrDefault(x =>
                                                                                                     x.SpineMessageTypeId == (int)SpineMessageTypes.GpConnectSearchFreeSlots);
                requestParameters.SpineMessageTypeId = (int)SpineMessageTypes.GpConnectSearchFreeSlots;
                requestParameters.InteractionId      = spineMessageType?.InteractionId;

                var stopWatch = new Stopwatch();
                stopWatch.Start();
                _spineMessage.SpineMessageTypeId = requestParameters.SpineMessageTypeId;

                var client = _httpClientFactory.CreateClient("GpConnectClient");

                client.Timeout = new TimeSpan(0, 0, 30);
                AddRequiredRequestHeaders(requestParameters, client);
                _spineMessage.RequestHeaders = client.DefaultRequestHeaders.ToString();
                var requestUri = new Uri($"{requestParameters.EndpointAddressWithSpineSecureProxy}/Slot");
                var uriBuilder = AddQueryParameters(requestParameters, startDate, endDate, requestUri);

                getRequest.Method     = HttpMethod.Get;
                getRequest.RequestUri = uriBuilder.Uri;

                var response = await client.SendAsync(getRequest);

                var responseStream = await response.Content.ReadAsStringAsync();

                _spineMessage.ResponsePayload = responseStream;
                _spineMessage.ResponseStatus  = response.StatusCode.ToString();
                _spineMessage.RequestPayload  = getRequest.ToString();
                _spineMessage.ResponseHeaders = response.Headers.ToString();

                stopWatch.Stop();
                _spineMessage.RoundTripTimeMs = stopWatch.ElapsedMilliseconds;
                _logService.AddSpineMessageLog(_spineMessage);

                var slotSimple = new SlotSimple()
                {
                    CurrentSlotEntrySimple = new List <SlotEntrySimple>(),
                    PastSlotEntrySimple    = new List <SlotEntrySimple>(),
                    Issue = new List <Issue>()
                };

                var results = JsonConvert.DeserializeObject <Bundle>(responseStream);

                if (results.Issue?.Count > 0)
                {
                    slotSimple.Issue = results.Issue;
                    return(slotSimple);
                }

                var slotResources = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Slot).ToList();
                if (slotResources == null || slotResources?.Count == 0)
                {
                    return(slotSimple);
                }

                var practitionerResources = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Practitioner).ToList();
                var locationResources     = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Location).ToList();
                var scheduleResources     = results.entry?.Where(x => x.resource.resourceType == ResourceTypes.Schedule).ToList();

                var slotList = (from slot in slotResources?.Where(s => s.resource != null)
                                let practitioner = GetPractitionerDetails(slot.resource.schedule.reference, scheduleResources, practitionerResources)
                                                   let location = GetLocation(slot.resource.schedule.reference, scheduleResources, locationResources)
                                                                  let schedule = GetSchedule(slot.resource.schedule.reference, scheduleResources)
                                                                                 select new SlotEntrySimple
                {
                    AppointmentDate = slot.resource.start.GetValueOrDefault().DateTime,
                    SessionName = schedule.resource.serviceCategory?.text,
                    StartTime = slot.resource.start.GetValueOrDefault().DateTime,
                    Duration = slot.resource.start.DurationBetweenTwoDates(slot.resource.end),
                    SlotType = slot.resource.serviceType.FirstOrDefault()?.text,
                    DeliveryChannel = slot.resource.extension?.FirstOrDefault()?.valueCode,
                    PractitionerGivenName = practitioner?.name?.FirstOrDefault()?.given?.FirstOrDefault(),
                    PractitionerFamilyName = practitioner?.name?.FirstOrDefault()?.family,
                    PractitionerPrefix = practitioner?.name?.FirstOrDefault()?.prefix?.FirstOrDefault(),
                    PractitionerRole = schedule.resource.extension?.FirstOrDefault()?.valueCodeableConcept?.coding?.FirstOrDefault()?.display,
                    PractitionerGender = practitioner?.gender,
                    LocationName = location?.name,
                    LocationAddressLines = location?.address?.line,
                    LocationAddressLinesAsString = AddressBuilder.GetFullAddress(location?.address?.line, location?.address?.district, location?.address?.city, location?.address?.postalCode, location?.address?.country),
                    LocationCity = location?.address?.city,
                    LocationCountry = location?.address?.country,
                    LocationDistrict = location?.address?.district,
                    LocationPostalCode = location?.address?.postalCode,
                    SlotInPast = slot.resource.start.GetValueOrDefault().DateTime <= _currentDateTime
                }).OrderBy(z => z.LocationName)
                               .ThenBy(s => s.AppointmentDate)
                               .ThenBy(s => s.StartTime);

                slotSimple.CurrentSlotEntrySimple.AddRange(slotList.Where(x => !x.SlotInPast));
                slotSimple.PastSlotEntrySimple.AddRange(slotList.Where(x => x.SlotInPast));

                return(slotSimple);
            }
            catch (TimeoutException timeoutException)
            {
                _logger.LogError(timeoutException, "A timeout error has occurred");
                throw;
            }
            catch (Exception exc)
            {
                _logger.LogError(exc, $"An error occurred in trying to execute a GET request - {getRequest}");
                throw;
            }
        }