public async Task Execute()

in src/ApiForFhirMigrationTool.Function/DeepCheck/DeepCheck.cs [36:207]


        public async Task<string> Execute(string query)
        {
            int resourceCount = _options.DeepCheckCount;
            var baseUri = _options.SourceUri;
            var desbaseUri = _options.DestinationUri;

            string sourceFhirEndpoint = _options.SourceHttpClient;
            string destinationFhirEndpoint = _options.DestinationHttpClient;

            var res = new JObject();
            var passResource = new JArray();
            var errorResource = new JArray();

            _logger?.LogInformation($"Deep Check Function start");
            try
            {
                _logger?.LogInformation($"Getting FHIR resource from Source Server");
                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Get,
                    RequestUri = new Uri(baseUri, string.Format("/{0}{1}", query, resourceCount)),
                };
                HttpResponseMessage srcTask = await _fhirClient.Send(request, baseUri, sourceFhirEndpoint);
                var objResponse = JObject.Parse(srcTask.Content.ReadAsStringAsync().Result);
                JToken? entry = objResponse["entry"];
                JObject? gen2Response = null;
                JObject? gen1Response = null;
                if (entry != null)
                {
                    foreach (JToken item in entry)
                    {
                        gen1Response = (JObject?)item["resource"];

                        if (gen1Response != null)
                        {
                            JToken? version = null;
                            var metaToken = gen1Response["meta"];
                            if (metaToken != null && metaToken is JObject metaObject)
                            {
                                metaObject.Remove("lastUpdated");
                                version = metaObject.GetValue("versionId");
                            }
                            if (_options.ExportWithHistory == true || _options.ExportWithDelete == true)
                            {
                                var requestObject = (JObject?)item["request"];
                                if (requestObject != null)
                                {
                                    var methodValue = requestObject.GetValue("method")?.ToString();
                                    if (string.Equals(methodValue, "DELETE", StringComparison.OrdinalIgnoreCase))
                                    {
                                        continue;
                                    }
                                }
                                // Getting resource from Gen2 server.
                                _logger?.LogInformation($"Getting FHIR resource from Destination Server");
                                var desrequest = new HttpRequestMessage
                                    {
                                        Method = HttpMethod.Get,
                                        RequestUri = new Uri(desbaseUri, string.Format("{0}/{1}/{2}/{3}", gen1Response.GetValue("resourceType"), gen1Response.GetValue("id"), "_history", version)),
                                    };

                                    HttpResponseMessage desTask = await _fhirClient.Send(desrequest, desbaseUri, destinationFhirEndpoint);

                                    gen2Response = JObject.Parse(desTask.Content.ReadAsStringAsync().Result);
                                    metaToken = gen2Response["meta"];
                                    if (metaToken != null && metaToken is JObject metaObject1)
                                    {
                                        metaObject1.Remove("lastUpdated");
                                    }
                            }
                            else
                            {
                                // Getting resource from Gen2 server.
                                _logger?.LogInformation($"Getting FHIR resource from Destination Server");
                                var desrequest = new HttpRequestMessage
                                {
                                    Method = HttpMethod.Get,
                                    RequestUri = new Uri(desbaseUri, string.Format("{0}/{1}", gen1Response.GetValue("resourceType"), gen1Response.GetValue("id"))),
                                };

                                HttpResponseMessage desTask = await _fhirClient.Send(desrequest, desbaseUri, destinationFhirEndpoint);

                                gen2Response = JObject.Parse(desTask.Content.ReadAsStringAsync().Result);
                                metaToken = gen2Response["meta"];
                                if (metaToken != null && metaToken is JObject metaObject1)
                                {
                                    metaObject1.Remove("lastUpdated");
                                }

                            }

                            // Comparing the resource from Gen1 and Gen2 server.
                            _logger?.LogInformation($"Comparing the FHIR resources");
                            if (JToken.DeepEquals(gen1Response, gen2Response))
                            {
                                var inputFormat = new JObject
                                {
                                    { "Resource", gen1Response.GetValue("resourceType") },
                                    { "id", gen1Response.GetValue("id") },
                                    { "Compared", true },
                                };

                                passResource.Add(inputFormat);
                            }
                            else
                            {
                                var errorFormat = new JObject
                                {
                                    { "Resource", gen1Response.GetValue("resourceType") },
                                    { "id", gen1Response.GetValue("id") },
                                    { "Compared", false },
                                };
                                errorResource.Add(errorFormat);
                            }

                            _logger?.LogInformation("Creating table clients");
                            TableClient chunktableClient = _azureTableClientFactory.Create(_options.ChunkTableName);
                            TableClient exportTableClient = _azureTableClientFactory.Create(_options.ExportTableName);
                            _logger?.LogInformation("Table clients created successfully.");


                            TableEntity qEntity = _azureTableMetadataStore.GetEntity(chunktableClient, _options.PartitionKey, _options.RowKey);
                            if (qEntity["DeepJobId"] != null)
                            {
                                int jobId = (int)qEntity["DeepJobId"];
                                string rowKey = _options.DeepRowKey + jobId++;

                                var tableEntity = new TableEntity(_options.PartitionKey, rowKey)
                                {
                                   { "Resource", gen1Response.GetValue("resourceType").ToString() },
                                   { "id", gen1Response.GetValue("id").ToString() },
                                   { "Result", JToken.DeepEquals(gen1Response, gen2Response) ? "Pass" : "Fail" },
                                };
                                _logger?.LogInformation("Starting update of the export table.");
                                _azureTableMetadataStore.AddEntity(exportTableClient, tableEntity);
                                _logger?.LogInformation("Completed update of the export table.");

                                TableEntity qEntitynew = _azureTableMetadataStore.GetEntity(chunktableClient, _options.PartitionKey, _options.RowKey);

                                qEntitynew["DeepJobId"] = jobId++;

                                _logger?.LogInformation("Starting update of the chunk table.");
                                _azureTableMetadataStore.UpdateEntity(chunktableClient, qEntitynew);
                                _logger?.LogInformation("Completed update of the chunk table.");

                                _logger?.LogInformation("Updating logs in Application Insights.");

                                _telemetryClient.TrackEvent(
                               "DeepCheck",
                               new Dictionary<string, string>()
                               {
                                   { "Resource", gen1Response.GetValue("resourceType").ToString() },
                                   { "id", gen1Response.GetValue("id").ToString() },
                                   { "Result", JToken.DeepEquals(gen1Response, gen2Response) ? "Pass" : "Fail" },
                               });
                            }

                        }
                    }
                }
            }
            catch
            {
                throw;
            }

            res.Add("ResourceMatched", passResource);
            res.Add("ResourceNotMatched", errorResource);
            var importRequestJson = res.ToString(Formatting.None);

            return importRequestJson;
        }