public async Task AppendQueryToFileWorker(string query) { long records = 0; using (var client = new HttpClient()) { client.BaseAddress = new Uri(ServerUrl); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + FhirAuth.GetAuthenticationResult().AccessToken); HttpResponseMessage getResult = getResult = await client.GetAsync(query); JObject bundle = JObject.Parse(await getResult.Content.ReadAsStringAsync()); JArray entries = (JArray)bundle["entry"]; JArray links = (JArray)bundle["link"]; string nextQuery = ""; for (int i = 0; i < links.Count; i++) { string link_type = (string)(bundle["link"][i]["relation"]); string link_url = (string)(bundle["link"][i]["url"]); if (link_type == "next") { Uri nextUri = new Uri(link_url); nextQuery = nextUri.PathAndQuery; break; } } if (!String.IsNullOrEmpty(nextQuery)) { QueryQueue.Post(nextQuery); } if (entries != null) { for (int i = 0; i < entries.Count; i++) { string entry_json = (((JObject)entries[i])["resource"]).ToString(Formatting.None); if (Anom != null) { entry_json = await Anom.AnonymizeDataAsync(entry_json); } AppendToFile(FileName, entry_json); records++; } } if (String.IsNullOrEmpty(nextQuery)) { QueryQueue.Complete(); } } }
public async Task AppendQueryWorker(string query) { var randomGenerator = new Random(); using (var client = new HttpClient()) { client.BaseAddress = new Uri(ServerUrl); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + FhirAuth.GetAuthenticationResult().AccessToken); HttpResponseMessage getResult = getResult = await client.GetAsync(query); JObject bundle = JObject.Parse(await getResult.Content.ReadAsStringAsync()); JArray entries = (JArray)bundle["entry"]; JArray links = (JArray)bundle["link"]; string nextQuery = ""; for (int i = 0; i < links.Count; i++) { string link_type = (string)(bundle["link"][i]["relation"]); string link_url = (string)(bundle["link"][i]["url"]); if (link_type == "next") { Uri nextUri = new Uri(link_url); nextQuery = nextUri.PathAndQuery; break; } } if (!String.IsNullOrEmpty(nextQuery)) { QueryQueue.Post(nextQuery); } if (entries != null) { for (int i = 0; i < entries.Count; i++) { JObject resource = (JObject)entries[i]["resource"]; string resourceType = resource["resourceType"].ToString(); string resourceId = resource["id"].ToString(); string deleteQuery = $"/{resourceType}/{resourceId}?hardDelete=true"; var pollyDelays = new[] { TimeSpan.FromMilliseconds(2000 + randomGenerator.Next(50)), TimeSpan.FromMilliseconds(3000 + randomGenerator.Next(50)), TimeSpan.FromMilliseconds(5000 + randomGenerator.Next(50)), TimeSpan.FromMilliseconds(8000 + randomGenerator.Next(50)) }; HttpResponseMessage deleteResult = await Policy .HandleResult <HttpResponseMessage>(response => !response.IsSuccessStatusCode) .WaitAndRetryAsync(pollyDelays, (result, timeSpan, retryCount, context) => { Console.WriteLine($"Request failed with {result.Result.StatusCode}. Waiting {timeSpan} before next retry. Retry attempt {retryCount}"); }) .ExecuteAsync(() => { return(client.DeleteAsync(deleteQuery)); }); if (!deleteResult.IsSuccessStatusCode) { Console.WriteLine("Delete failed: " + deleteQuery); throw new Exception("Failed to delete resource"); } else { Console.WriteLine("DELETE " + deleteQuery); } } } if (String.IsNullOrEmpty(nextQuery)) { QueryQueue.Complete(); } } }