Skip to content

Commit

Permalink
change to how dicomTag are stored
Browse files Browse the repository at this point in the history
Signed-off-by: Neil South <[email protected]>
  • Loading branch information
neildsouth committed Aug 9, 2023
1 parent 6efcc20 commit af896bc
Show file tree
Hide file tree
Showing 15 changed files with 134 additions and 17 deletions.
8 changes: 5 additions & 3 deletions src/Api/Storage/RemoteAppExecution.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,24 @@

using System;
using System.Collections.Generic;
using FellowOakDicom;
using System.Text.Json.Serialization;
using Monai.Deploy.Messaging.Events;

namespace Monai.Deploy.InformaticsGateway.Api.Storage
{
public class RemoteAppExecution
{
[JsonPropertyName("_id")]
public string Id { get; set; } = default!;
public DateTime RequestTime { get; set; } = DateTime.UtcNow;
public string ExportTaskId { get; set; } = string.Empty;
public string WorkflowInstanceId { get; set; } = string.Empty;
public string CorrelationId { get; set; } = string.Empty;
public string? StudyUid { get; set; }
public string? OutgoingUid { get; set; }
public string? OutgoingUid { get { return Id; } set { Id = value ?? ""; } }
public List<DestinationApplicationEntity> ExportDetails { get; set; } = new();
public List<string> Files { get; set; } = new();
public FileExportStatus Status { get; set; }
public Dictionary<DicomTag, string> OriginalValues { get; set; } = new();
public Dictionary<string, string> OriginalValues { get; set; } = new();
}
}
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Configurations/MongoDBOptions.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations
public class MongoDBOptions
{
[ConfigurationKeyName("DatabaseName")]
public string DaatabaseName { get; set; } = string.Empty;
public string DatabaseName { get; set; } = string.Empty;
}
}
4 changes: 2 additions & 2 deletions src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class MongoDatabaseFixture
public MongoDatabaseFixture()
{
Client = new MongoClient("mongodb://root:rootpassword@localhost:27017");
Options = Microsoft.Extensions.Options.Options.Create(new MongoDBOptions { DaatabaseName = $"IGTest" });
Database = Client.GetDatabase(Options.Value.DaatabaseName);
Options = Microsoft.Extensions.Options.Options.Create(new MongoDBOptions { DatabaseName = $"IGTest" });
Database = Client.GetDatabase(Options.Value.DatabaseName);

var migration = new MongoDatabaseMigrationManager();
migration.Migrate(null!);
Expand Down
106 changes: 106 additions & 0 deletions src/Database/MongoDB/Integration.Test/RemoteAppRepositoryTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright 2022 MONAI Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using FellowOakDicom;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.VisualBasic;
using Monai.Deploy.InformaticsGateway.Api.Storage;
using Monai.Deploy.InformaticsGateway.Configuration;
using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test;
using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories;
using MongoDB.Driver;
using Moq;
namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test
{
[Collection("MongoDatabase")]
public class RemoteAppRepositoryTest
{
private readonly MongoDatabaseFixture _databaseFixture;

private readonly Mock<IServiceScopeFactory> _serviceScopeFactory;
private readonly Mock<ILogger<RemoteAppExecutionRepository>> _logger;
private readonly IOptions<InformaticsGatewayConfiguration> _options;

private readonly Mock<IServiceScope> _serviceScope;
private readonly IServiceProvider _serviceProvider;

public RemoteAppRepositoryTest(MongoDatabaseFixture databaseFixture)
{
_databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture));

_serviceScopeFactory = new Mock<IServiceScopeFactory>();
_logger = new Mock<ILogger<RemoteAppExecutionRepository>>();
_options = Options.Create(new InformaticsGatewayConfiguration());

_serviceScope = new Mock<IServiceScope>();
var services = new ServiceCollection();
services.AddScoped(p => _logger.Object);
services.AddScoped(p => databaseFixture.Client);

_serviceProvider = services.BuildServiceProvider();
_serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object);
_serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider);

_options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 };
_logger.Setup(p => p.IsEnabled(It.IsAny<LogLevel>())).Returns(true);
}

[Fact]
public async Task GivenAexecution_WhenAddingToDatabase_ExpectItToBeSaved()
{
var outgoingUid = Guid.NewGuid().ToString();
var dataset = new DicomDataset();
var date = new DateTime(2023, 5, 21, 6, 7, 8).ToUniversalTime();

var execution = new RemoteAppExecution
{
CorrelationId = Guid.NewGuid().ToString(),
ExportTaskId = "ExportTaskId",
WorkflowInstanceId = "WorkflowInstanceId",
OutgoingUid = outgoingUid,
StudyUid = Guid.NewGuid().ToString(),
RequestTime = date,
OriginalValues = new Dictionary<string, string> {
{ DicomTag.StudyInstanceUID.ToString(), "StudyInstanceUID" },
{ DicomTag.SeriesInstanceUID.ToString(), "SeriesInstanceUID" }
}
};


var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options);
await store.AddAsync(execution).ConfigureAwait(false);

var collection = _databaseFixture.Database.GetCollection<RemoteAppExecution>(nameof(RemoteAppExecution));
var actual = await collection.Find(p => p.OutgoingUid == execution.OutgoingUid).FirstOrDefaultAsync().ConfigureAwait(false);

Task.Delay(1000).Wait();
Assert.NotNull(actual);
Assert.Equal(execution.CorrelationId, actual!.CorrelationId);
Assert.Equal(execution.ExportTaskId, actual!.ExportTaskId);
Assert.Equal(execution.WorkflowInstanceId, actual!.WorkflowInstanceId);
Assert.Equal(execution.OutgoingUid, actual!.OutgoingUid);
Assert.Equal(execution.CorrelationId, actual!.CorrelationId);
Assert.Equal(execution.WorkflowInstanceId, actual!.WorkflowInstanceId);
Assert.Equal(execution.StudyUid, actual!.StudyUid);
Assert.Equal(execution.RequestTime, actual!.RequestTime);
Assert.Equal(execution.OriginalValues, actual!.OriginalValues);
Assert.Equal(2, actual!.OriginalValues.Count);
}
}
}
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public DestinationApplicationEntityRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<DestinationApplicationEntity>(nameof(DestinationApplicationEntity));
CreateIndexes();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public DicomAssociationInfoRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<DicomAssociationInfo>(nameof(DicomAssociationInfo));
}

Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/InferenceRequestRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public InferenceRequestRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<InferenceRequest>(nameof(InferenceRequest));
CreateIndexes();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public MonaiApplicationEntityRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<MonaiApplicationEntity>(nameof(MonaiApplicationEntity));
CreateIndexes();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/PayloadRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public PayloadRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<Payload>(nameof(Payload));
CreateIndexes();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public RemoteAppExecutionRepository(IServiceScopeFactory serviceScopeFactory,
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<RemoteAppExecution>(nameof(RemoteAppExecution));
CreateIndexes();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public SourceApplicationEntityRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<SourceApplicationEntity>(nameof(SourceApplicationEntity));
CreateIndexes();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public StorageMetadataWrapperRepository(
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));

var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
_collection = mongoDatabase.GetCollection<StorageMetadataWrapper>(nameof(StorageMetadataWrapper));
CreateIndexes();
}
Expand Down
10 changes: 9 additions & 1 deletion src/InformaticsGateway/ExecutionPlugins/ExternalAppIncoming.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ public ExternalAppIncoming(
}
foreach (var key in remoteAppExecution.OriginalValues.Keys)
{
dicomFile.Dataset.AddOrUpdate(key, remoteAppExecution.OriginalValues[key]);
var (group, element) = Parse(key);
dicomFile.Dataset.AddOrUpdate(new DicomTag(group, element), remoteAppExecution.OriginalValues[key]);
}

fileMetadata.WorkflowInstanceId = remoteAppExecution.WorkflowInstanceId;
Expand All @@ -71,6 +72,13 @@ public ExternalAppIncoming(
return (dicomFile, fileMetadata);
}

private (ushort group, ushort element) Parse(string input)
{
var trim = input.Substring(1, input.Length - 2);
var array = trim.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
return (Convert.ToUInt16(array[0], 16), Convert.ToUInt16(array[1], 16));
}

private static DicomTag[] GetTags(string values)
{
var names = values.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/

using System;
using System.Data;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -61,7 +62,7 @@ public ExternalAppOutgoing(
{
if (dicomFile.Dataset.TryGetString(tag, out var value))
{
remoteAppExecution.OriginalValues.Add(tag, value);
remoteAppExecution.OriginalValues.Add(tag.ToString(), value);
SetTag(dicomFile, tag);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public async Task ExternalAppPlugin_Should_Repare_StudyUid()
{
OutgoingUid = outboundStudyUid,
StudyUid = originalStudyUid,
OriginalValues = { { DicomTag.StudyInstanceUID, originalStudyUid } }
OriginalValues = { { DicomTag.StudyInstanceUID.ToString(), originalStudyUid } }
};

_repository.Setup(r => r.GetAsync(It.IsAny<string>(), It.IsAny<CancellationToken>()))
Expand Down

0 comments on commit af896bc

Please sign in to comment.