public static Bundle.RequestComponent GenerateUpdateRequest(ImagingStudy imagingStudy) { return(new Bundle.RequestComponent() { Method = Bundle.HTTPVerb.PUT, IfMatch = ImagingStudyPipelineHelper.GenerateEtag(imagingStudy.Meta.VersionId), Url = $"{ResourceType.ImagingStudy.GetLiteral()}/{imagingStudy.Id}", }); }
// Add modality to series private void AddModalityToSeries(ImagingStudy.SeriesComponent series, DicomDataset dataset) { string modalityInString = ImagingStudyPipelineHelper.GetModalityInString(dataset); if (modalityInString != null && !string.Equals(series.Modality?.Code, modalityInString, StringComparison.Ordinal)) { series.Modality = ImagingStudyPipelineHelper.GetModality(modalityInString); } }
/// <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)); }
private void AddModality(ImagingStudy imagingStudy, DicomDataset dataset) { string modalityInString = ImagingStudyPipelineHelper.GetModalityInString(dataset); if (modalityInString != null) { Coding modality = ImagingStudyPipelineHelper.GetModality(modalityInString); List <Coding> existingModalities = imagingStudy.Modality; if (dataset.TryGetValues(DicomTag.ModalitiesInStudy, out string[] modalitiesInStudy) &&
/// <inheritdoc/> public async Task <FhirTransactionRequestEntry> BuildAsync(FhirTransactionContext context, CancellationToken cancellationToken) { EnsureArg.IsNotNull(context, nameof(context)); EnsureArg.IsNotNull(context.ChangeFeedEntry, nameof(context.ChangeFeedEntry)); ChangeFeedEntry changeFeedEntry = context.ChangeFeedEntry; Identifier imagingStudyIdentifier = ImagingStudyIdentifierUtility.CreateIdentifier(changeFeedEntry.StudyInstanceUid); ImagingStudy imagingStudy = await _fhirService.RetrieveImagingStudyAsync(imagingStudyIdentifier, cancellationToken); // Returns null if imagingStudy does not exists for given studyInstanceUid if (imagingStudy == null) { return(null); } string imagingStudySource = imagingStudy.Meta.Source; ImagingStudy.SeriesComponent series = ImagingStudyPipelineHelper.GetSeriesWithinAStudy(changeFeedEntry.SeriesInstanceUid, imagingStudy.Series); ImagingStudy.InstanceComponent instance = ImagingStudyPipelineHelper.GetInstanceWithinASeries(changeFeedEntry.SopInstanceUid, series); // Return null if the given instance is not present in ImagingStudy if (instance == null) { return(null); } // Removes instance from series collection series.Instance.Remove(instance); // Removes series from ImagingStudy if its instance collection is empty if (series.Instance.Count == 0) { imagingStudy.Series.Remove(series); } if (imagingStudy.Series.Count == 0 && _dicomWebEndpoint.Equals(imagingStudySource, System.StringComparison.Ordinal)) { return(new FhirTransactionRequestEntry( FhirTransactionRequestMode.Delete, ImagingStudyPipelineHelper.GenerateDeleteRequest(imagingStudy), imagingStudy.ToServerResourceId(), imagingStudy)); } return(new FhirTransactionRequestEntry( FhirTransactionRequestMode.Update, ImagingStudyPipelineHelper.GenerateUpdateRequest(imagingStudy), imagingStudy.ToServerResourceId(), imagingStudy)); }
private async Task AddSeriesToImagingStudyAsync(FhirTransactionContext context, ImagingStudy imagingStudy, CancellationToken cancellationToken) { ChangeFeedEntry changeFeedEntry = context.ChangeFeedEntry; List <ImagingStudy.SeriesComponent> existingSeriesCollection = imagingStudy.Series; ImagingStudy.InstanceComponent instance = new ImagingStudy.InstanceComponent() { Uid = changeFeedEntry.SopInstanceUid, }; // Checks if the given series already exists within a study ImagingStudy.SeriesComponent series = ImagingStudyPipelineHelper.GetSeriesWithinAStudy(changeFeedEntry.SeriesInstanceUid, existingSeriesCollection); if (series == null) { series = new ImagingStudy.SeriesComponent() { Uid = changeFeedEntry.SeriesInstanceUid, }; series.Instance.Add(instance); imagingStudy.Series.Add(series); } else { ImagingStudy.InstanceComponent existingInstance = ImagingStudyPipelineHelper.GetInstanceWithinASeries(changeFeedEntry.SopInstanceUid, series); if (existingInstance == null) { series.Instance.Add(instance); } else { instance = existingInstance; } } await _imagingStudySynchronizer.SynchronizeSeriesPropertiesAsync(context, series, cancellationToken); await _imagingStudySynchronizer.SynchronizeInstancePropertiesAsync(context, instance, cancellationToken); }
/// <inheritdoc/> public void Synchronize(FhirTransactionContext context, ImagingStudy imagingStudy) { EnsureArg.IsNotNull(context, nameof(context)); EnsureArg.IsNotNull(imagingStudy, nameof(imagingStudy)); EnsureArg.IsNotNull(context.Request.Endpoint, nameof(context.Request.Endpoint)); EnsureArg.IsNotNull(context.ChangeFeedEntry, nameof(context.ChangeFeedEntry)); DicomDataset dataset = context.ChangeFeedEntry.Metadata; if (dataset == null) { return; } ImagingStudyPipelineHelper.SetDateTimeOffSet(context); AddStartedElement(imagingStudy, dataset, context.UtcDateTimeOffset); AddImagingStudyEndpoint(imagingStudy, context); AddModality(imagingStudy, dataset); AddNote(imagingStudy, dataset); }