/// <summary> /// Create patients from CSV list /// </summary> /// <param name="patientsCsv">List of patients</param> /// <returns>Number of created patients</returns> public async Task <int> CreatePatientsAsync(IEnumerable <PatientCsv> patientsCsv) { var patientCsvs = patientsCsv.ToList(); if (!patientCsvs.Any()) { return(0); } var builder = new TransactionBuilder(_fhirClient.Endpoint, Bundle.BundleType.Transaction); foreach (var patientCsv in patientCsvs.Where(p => !string.IsNullOrWhiteSpace(p.Identifier))) { var patient = _patientCsvToPatientConverter.Convert(patientCsv); builder.Create(patient); } var response = await _fhirClient.TransactionAsync(builder.ToBundle()).ConfigureAwait(false); return(response.Entry.Count); }
private static async System.Threading.Tasks.Task <Resource> UploadResourceAsync(Resource resource, FhirClient client, bool retry = true) { await semaphore.WaitAsync(); try { if (resource is Bundle bundle) { return(await client.TransactionAsync(bundle)); } else { return(await client.UpdateAsync(resource)); } } catch (FhirOperationException fhirEx) { if (fhirEx.Status == System.Net.HttpStatusCode.TooManyRequests && retry == true) { // Take a break and try again Console.WriteLine($"Adding a 300ms delay: {fhirEx.Message}"); Thread.Sleep(300); return(await UploadResourceAsync(resource, client, false)); } else { Console.WriteLine($"Error uploading resource to FHIR server: {fhirEx.Message}"); return(null); } } catch (Exception ex) { Console.WriteLine($"Error uploading resource to FHIR server: {ex.Message}"); return(null); } finally { semaphore.Release(); } }