public async Task <IEnumerable <FhirTransactionRequestEntry> > BuildAsync(FhirTransactionContext context, CancellationToken cancellationToken) { EnsureArg.IsNotNull(context?.ChangeFeedEntry, nameof(context.ChangeFeedEntry)); EnsureArg.IsNotNull(context.Request, nameof(context.Request)); IResourceId patientId = context.Request.Patient.ResourceId; IResourceId imagingStudyId = context.Request.ImagingStudy.ResourceId; ChangeFeedEntry changeFeedEntry = context.ChangeFeedEntry; Identifier identifier = IdentifierUtility.CreateIdentifier(changeFeedEntry.StudyInstanceUid); IReadOnlyCollection <Observation> observations = _observationParser.Parse(changeFeedEntry.Metadata, patientId.ToResourceReference(), imagingStudyId.ToResourceReference(), identifier); if (observations.Count == 0) { return(Enumerable.Empty <FhirTransactionRequestEntry>()); } Identifier imagingStudyIdentifier = imagingStudyId.ToResourceReference().Identifier; IEnumerable <Observation> existingDoseSummariesAsync = imagingStudyIdentifier != null ? await _fhirService .RetrieveObservationsAsync( imagingStudyId.ToResourceReference().Identifier, cancellationToken) : new List <Observation>(); // TODO: Figure out a way to match existing observations with newly created ones. List <FhirTransactionRequestEntry> fhirRequests = new List <FhirTransactionRequestEntry>(); foreach (var observation in observations) { fhirRequests.Add(new FhirTransactionRequestEntry( FhirTransactionRequestMode.Create, new Bundle.RequestComponent() { Method = Bundle.HTTPVerb.POST, Url = ResourceType.Observation.GetLiteral() }, new ClientResourceId(), observation)); } return(fhirRequests); }
/// <inheritdoc/> public async Task <FhirTransactionRequestEntry> BuildAsync(FhirTransactionContext context, CancellationToken cancellationToken) { EnsureArg.IsNotNull(context, nameof(context)); EnsureArg.IsNotNull(context.ChangeFeedEntry, nameof(context.ChangeFeedEntry)); EnsureArg.IsNotNull(context.Request, nameof(context.Request)); IResourceId patientId = context.Request.Patient.ResourceId; ChangeFeedEntry changeFeedEntry = context.ChangeFeedEntry; Identifier imagingStudyIdentifier = ImagingStudyIdentifierUtility.CreateIdentifier(changeFeedEntry.StudyInstanceUid); ImagingStudy existingImagingStudy = await _fhirService.RetrieveImagingStudyAsync(imagingStudyIdentifier, cancellationToken); ImagingStudy imagingStudy = (ImagingStudy)existingImagingStudy?.DeepCopy(); FhirTransactionRequestMode requestMode = FhirTransactionRequestMode.None; if (existingImagingStudy == null) { imagingStudy = new ImagingStudy() { Status = ImagingStudy.ImagingStudyStatus.Available, Subject = patientId.ToResourceReference(), }; imagingStudy.Identifier.Add(imagingStudyIdentifier); requestMode = FhirTransactionRequestMode.Create; } SynchronizeImagingStudyProperties(context, imagingStudy); if (requestMode != FhirTransactionRequestMode.Create && !existingImagingStudy.IsExactly(imagingStudy)) { requestMode = FhirTransactionRequestMode.Update; } Bundle.RequestComponent request = requestMode switch { FhirTransactionRequestMode.Create => ImagingStudyPipelineHelper.GenerateCreateRequest(imagingStudyIdentifier), FhirTransactionRequestMode.Update => ImagingStudyPipelineHelper.GenerateUpdateRequest(imagingStudy), _ => null, }; IResourceId resourceId = requestMode switch { FhirTransactionRequestMode.Create => new ClientResourceId(), _ => existingImagingStudy.ToServerResourceId(), }; return(new FhirTransactionRequestEntry( requestMode, request, resourceId, imagingStudy)); }