// Check export status and return output once we get 200 private async Task <IList <Uri> > CheckExportStatus(Uri contentLocation) { HttpStatusCode resultCode = HttpStatusCode.Accepted; HttpResponseMessage response = null; while (resultCode == HttpStatusCode.Accepted) { await Task.Delay(5000); response = await _fhirClient.CheckExportAsync(contentLocation); resultCode = response.StatusCode; } if (resultCode != HttpStatusCode.OK) { throw new Exception($"Export request failed with status code {resultCode}"); } // we have got the result. Deserialize into output response. var contentString = await response.Content.ReadAsStringAsync(); ExportJobResult exportJobResult = JsonConvert.DeserializeObject <ExportJobResult>(contentString); return(exportJobResult.Output.Select(x => x.FileUri).ToList()); }
public async Task <GetExportResponse> Handle(GetExportRequest request, CancellationToken cancellationToken) { EnsureArg.IsNotNull(request, nameof(request)); ExportJobOutcome outcome = await _fhirOperationDataStore.GetExportJobByIdAsync(request.JobId, cancellationToken); // We have an existing job. We will determine the response based on the status of the export operation. GetExportResponse exportResponse; if (outcome.JobRecord.Status.IsFinished()) { var jobResult = new ExportJobResult( outcome.JobRecord.QueuedTime, outcome.JobRecord.RequestUri, requiresAccessToken: false, outcome.JobRecord.Output.Values.OrderBy(x => x.Type, StringComparer.Ordinal).ToList(), outcome.JobRecord.Error); exportResponse = new GetExportResponse(HttpStatusCode.OK, jobResult); } else { exportResponse = new GetExportResponse(HttpStatusCode.Accepted); } return(exportResponse); }
// Check export status and return output once we get 200 internal static async Task <IList <Uri> > CheckExportStatus(TestFhirClient testFhirClient, Uri contentLocation, int timeToWaitInMinutes = 5) { HttpStatusCode resultCode = HttpStatusCode.Accepted; HttpResponseMessage response = null; int retryCount = 0; // Wait until status change or timeout while ((resultCode == HttpStatusCode.Accepted || resultCode == HttpStatusCode.ServiceUnavailable) && retryCount < 60) { await Task.Delay(timeToWaitInMinutes * 1000); response = await testFhirClient.CheckExportAsync(contentLocation); resultCode = response.StatusCode; retryCount++; } if (retryCount >= 60) { throw new Exception($"Export request timed out"); } if (resultCode != HttpStatusCode.OK) { throw new Exception($"Export request failed with status code {resultCode}"); } // we have got the result. Deserialize into output response. var contentString = await response.Content.ReadAsStringAsync(); ExportJobResult exportJobResult = JsonConvert.DeserializeObject <ExportJobResult>(contentString); return(exportJobResult.Output.Select(x => x.FileUri).ToList()); }
public async Task <GetExportResponse> Handle(GetExportRequest request, CancellationToken cancellationToken) { EnsureArg.IsNotNull(request, nameof(request)); ExportJobOutcome outcome = await _fhirDataStore.GetExportJobAsync(request.JobId, cancellationToken); // We have an existing job. We will determine the response based on the status of the export operation. GetExportResponse exportResponse; if (outcome.JobRecord.Status == OperationStatus.Completed) { var jobResult = new ExportJobResult( outcome.JobRecord.QueuedTime, outcome.JobRecord.RequestUri, requiresAccessToken: false, outcome.JobRecord.Output, outcome.JobRecord.Errors); exportResponse = new GetExportResponse(HttpStatusCode.OK, jobResult); } else { exportResponse = new GetExportResponse(HttpStatusCode.Accepted); } return(exportResponse); }
public async Task <GetExportResponse> Handle(GetExportRequest request, CancellationToken cancellationToken) { EnsureArg.IsNotNull(request, nameof(request)); ExportJobOutcome outcome = await _fhirOperationDataStore.GetExportJobByIdAsync(request.JobId, cancellationToken); // We have an existing job. We will determine the response based on the status of the export operation. GetExportResponse exportResponse; if (outcome.JobRecord.Status == OperationStatus.Completed) { var jobResult = new ExportJobResult( outcome.JobRecord.QueuedTime, outcome.JobRecord.RequestUri, requiresAccessToken: false, outcome.JobRecord.Output.Values.OrderBy(x => x.Type, StringComparer.Ordinal).ToList(), outcome.JobRecord.Error); exportResponse = new GetExportResponse(HttpStatusCode.OK, jobResult); } else if (outcome.JobRecord.Status == OperationStatus.Failed || outcome.JobRecord.Status == OperationStatus.Canceled) { throw new OperationFailedException( string.Format(Resources.OperationFailed, OperationsConstants.Export, outcome.JobRecord.FailureDetails.FailureReason), outcome.JobRecord.FailureDetails.FailureStatusCode); } else { exportResponse = new GetExportResponse(HttpStatusCode.Accepted); } return(exportResponse); }
private async Task <IList <Uri> > CheckExportStatus(HttpResponseMessage response) { if (response.StatusCode != HttpStatusCode.OK) { throw new Exception($"Export request failed with status code {response.StatusCode}"); } // we have got the result. Deserialize into output response. var contentString = await response.Content.ReadAsStringAsync(); ExportJobResult exportJobResult = JsonConvert.DeserializeObject <ExportJobResult>(contentString); return(exportJobResult.Output.Select(x => x.FileUri).ToList()); }
public async Task <GetExportResponse> Handle(GetExportRequest request, CancellationToken cancellationToken) { EnsureArg.IsNotNull(request, nameof(request)); if (await _authorizationService.CheckAccess(DataActions.Export) != DataActions.Export) { throw new UnauthorizedFhirActionException(); } ExportJobOutcome outcome = await _fhirOperationDataStore.GetExportJobByIdAsync(request.JobId, cancellationToken); // We have an existing job. We will determine the response based on the status of the export operation. GetExportResponse exportResponse; if (outcome.JobRecord.Status == OperationStatus.Completed) { List <ExportFileInfo> allFiles = new List <ExportFileInfo>(); foreach (List <ExportFileInfo> fileList in outcome.JobRecord.Output.Values) { allFiles.AddRange(fileList); } var jobResult = new ExportJobResult( outcome.JobRecord.QueuedTime, outcome.JobRecord.RequestUri, requiresAccessToken: false, allFiles.Select(x => x.ToExportOutputResponse()).OrderBy(x => x.Type, StringComparer.Ordinal).ToList(), outcome.JobRecord.Error.Select(x => x.ToExportOutputResponse()).ToList(), outcome.JobRecord.Issues); exportResponse = new GetExportResponse(HttpStatusCode.OK, jobResult); } else if (outcome.JobRecord.Status == OperationStatus.Failed || outcome.JobRecord.Status == OperationStatus.Canceled) { string failureReason = outcome.JobRecord.FailureDetails != null ? outcome.JobRecord.FailureDetails.FailureReason : Resources.UnknownError; HttpStatusCode failureStatusCode = outcome.JobRecord.FailureDetails != null ? outcome.JobRecord.FailureDetails.FailureStatusCode : HttpStatusCode.InternalServerError; throw new OperationFailedException( string.Format(Resources.OperationFailed, OperationsConstants.Export, failureReason), failureStatusCode); } else { exportResponse = new GetExportResponse(HttpStatusCode.Accepted); } return(exportResponse); }
public GetExportResponse(HttpStatusCode statusCode, ExportJobResult jobResult) { StatusCode = statusCode; JobResult = jobResult; }