private static SlotEntrySummaryCount PopulateSlotEntrySummaryCount(RequestParametersList requestParameter, DTO.Response.Logging.SpineMessage spineMessage, Bundle results)
 {
     if (results.Issue?.Count > 0)
     {
         return(new SlotEntrySummaryCount
         {
             ErrorCode = ErrorCode.GenericSlotSearchError,
             ErrorDetail = results.Issue,
             FreeSlotCount = null,
             OdsCode = requestParameter.OdsCode,
             SpineMessageId = spineMessage.SpineMessageId
         });
     }
     else
     {
         return(new SlotEntrySummaryCount
         {
             ErrorCode = ErrorCode.None,
             ErrorDetail = null,
             FreeSlotCount = results.entry?.Count(x => x.resource.resourceType == ResourceTypes.Slot),
             OdsCode = requestParameter.OdsCode,
             SpineMessageId = spineMessage.SpineMessageId
         });
     }
 }
        private async Task <CapabilityStatementList> PopulateCapabilityStatementResults(RequestParametersList requestParameter, SemaphoreSlim semaphore, HttpClient client, CancellationToken cancellationToken)
        {
            try
            {
                var spineMessageType = (_configurationService.GetSpineMessageTypes()).FirstOrDefault(x =>
                                                                                                     x.SpineMessageTypeId == (int)SpineMessageTypes.GpConnectReadMetaData);
                requestParameter.RequestParameters.SpineMessageTypeId =
                    (int)SpineMessageTypes.GpConnectReadMetaData;
                requestParameter.RequestParameters.InteractionId = spineMessageType?.InteractionId;

                var stopWatch = new Stopwatch();
                stopWatch.Start();

                _spineMessage.SpineMessageTypeId = requestParameter.RequestParameters.SpineMessageTypeId;

                AddRequiredRequestHeaders(requestParameter.RequestParameters, client);
                _spineMessage.RequestHeaders = client.DefaultRequestHeaders.ToString();

                await semaphore.WaitAsync();

                var request = new HttpRequestMessage
                {
                    Method     = HttpMethod.Get,
                    RequestUri = new Uri($"{requestParameter.RequestParameters.EndpointAddressWithSpineSecureProxy}/metadata")
                };

                var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

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

                _spineMessage.ResponsePayload = contents;
                _spineMessage.ResponseStatus  = response.StatusCode.ToString();
                _spineMessage.RequestPayload  = request.ToString();
                _spineMessage.ResponseHeaders = response.Headers.ToString();
                stopWatch.Stop();
                _spineMessage.RoundTripTimeMs = stopWatch.ElapsedMilliseconds;
                _logService.AddSpineMessageLog(_spineMessage);

                var capabilityStatement = JsonConvert.DeserializeObject <CapabilityStatement>(contents);
                return(new CapabilityStatementList
                {
                    OdsCode = requestParameter.OdsCode,
                    CapabilityStatement = capabilityStatement,
                    ErrorCode = (capabilityStatement.Issue?.Count > 0 ? ErrorCode.CapabilityStatementHasErrors : ErrorCode.None)
                });
            }
            finally
            {
                semaphore.Release();
            }
        }
        private async Task <SlotEntrySummaryCount> PopulateResults(DateTime startDate, DateTime endDate, RequestParametersList requestParameter, SemaphoreSlim semaphore, HttpClient client, CancellationToken cancellationToken)
        {
            try
            {
                var spineMessageType = _configurationService.GetSpineMessageTypes().FirstOrDefault(x =>
                                                                                                   x.SpineMessageTypeId == (int)SpineMessageTypes.GpConnectSearchFreeSlots);
                requestParameter.RequestParameters.SpineMessageTypeId = (int)SpineMessageTypes.GpConnectSearchFreeSlots;
                requestParameter.RequestParameters.InteractionId      = spineMessageType?.InteractionId;

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

                AddRequiredRequestHeaders(requestParameter.RequestParameters, client);

                _spineMessage.RequestHeaders = client.DefaultRequestHeaders.ToString();
                var requestUri = new Uri($"{requestParameter.RequestParameters.EndpointAddressWithSpineSecureProxy}/Slot");
                var uriBuilder = AddQueryParameters(requestParameter.RequestParameters, startDate, endDate, requestUri);

                await semaphore.WaitAsync();

                var request = new HttpRequestMessage
                {
                    Method     = HttpMethod.Get,
                    RequestUri = uriBuilder.Uri
                };

                var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

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

                _spineMessage.ResponsePayload = contents;
                _spineMessage.ResponseStatus  = response.StatusCode.ToString();
                _spineMessage.RequestPayload  = request.ToString();
                _spineMessage.ResponseHeaders = response.Headers.ToString();
                stopWatch.Stop();
                _spineMessage.RoundTripTimeMs = stopWatch.ElapsedMilliseconds;
                var spineMessage = _logService.AddSpineMessageLog(_spineMessage);

                var results = JsonConvert.DeserializeObject <Bundle>(contents);
                return(PopulateSlotEntrySummaryCount(requestParameter, spineMessage, results));
            }
            finally
            {
                semaphore.Release();
            }
        }
        private Task <SlotEntrySummaryCount> ProcessResults(List <OrganisationErrorCodeOrDetail> organisationErrorCodeOrDetails, SearchType searchType, DateTime startDate, DateTime endDate, RequestParametersList requestParameter, SemaphoreSlim semaphore, HttpClient client, CancellationToken cancellationToken)
        {
            switch (searchType)
            {
            case SearchType.Provider:
                if (organisationErrorCodeOrDetails.Where(x => x.providerOrganisation?.OdsCode == requestParameter?.OdsCode)?.FirstOrDefault()?.errorSource == ErrorCode.None)
                {
                    return(PopulateResults(startDate, endDate, requestParameter, semaphore, client, cancellationToken));
                }
                break;

            case SearchType.Consumer:
                if (organisationErrorCodeOrDetails.Where(x => x.consumerOrganisation?.OdsCode == requestParameter?.OdsCode)?.FirstOrDefault()?.errorSource == ErrorCode.None)
                {
                    return(PopulateResults(startDate, endDate, requestParameter, semaphore, client, cancellationToken));
                }
                break;
            }
            return(null);
        }