Skip to content

Commit 64feb58

Browse files
neildsouthmocsharp
authored andcommitted
change to how dicomTag are stored
Signed-off-by: Neil South <[email protected]>
1 parent 932d718 commit 64feb58

15 files changed

+134
-17
lines changed

src/Api/Storage/RemoteAppExecution.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,24 @@
1616

1717
using System;
1818
using System.Collections.Generic;
19-
using FellowOakDicom;
19+
using System.Text.Json.Serialization;
2020
using Monai.Deploy.Messaging.Events;
2121

2222
namespace Monai.Deploy.InformaticsGateway.Api.Storage
2323
{
2424
public class RemoteAppExecution
2525
{
26+
[JsonPropertyName("_id")]
27+
public string Id { get; set; } = default!;
2628
public DateTime RequestTime { get; set; } = DateTime.UtcNow;
2729
public string ExportTaskId { get; set; } = string.Empty;
2830
public string WorkflowInstanceId { get; set; } = string.Empty;
2931
public string CorrelationId { get; set; } = string.Empty;
3032
public string? StudyUid { get; set; }
31-
public string? OutgoingUid { get; set; }
33+
public string? OutgoingUid { get { return Id; } set { Id = value ?? ""; } }
3234
public List<DestinationApplicationEntity> ExportDetails { get; set; } = new();
3335
public List<string> Files { get; set; } = new();
3436
public FileExportStatus Status { get; set; }
35-
public Dictionary<DicomTag, string> OriginalValues { get; set; } = new();
37+
public Dictionary<string, string> OriginalValues { get; set; } = new();
3638
}
3739
}

src/Database/MongoDB/Configurations/MongoDBOptions.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations
2121
public class MongoDBOptions
2222
{
2323
[ConfigurationKeyName("DatabaseName")]
24-
public string DaatabaseName { get; set; } = string.Empty;
24+
public string DatabaseName { get; set; } = string.Empty;
2525
}
2626
}

src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public class MongoDatabaseFixture
4040
public MongoDatabaseFixture()
4141
{
4242
Client = new MongoClient("mongodb://root:rootpassword@localhost:27017");
43-
Options = Microsoft.Extensions.Options.Options.Create(new MongoDBOptions { DaatabaseName = $"IGTest" });
44-
Database = Client.GetDatabase(Options.Value.DaatabaseName);
43+
Options = Microsoft.Extensions.Options.Options.Create(new MongoDBOptions { DatabaseName = $"IGTest" });
44+
Database = Client.GetDatabase(Options.Value.DatabaseName);
4545

4646
var migration = new MongoDatabaseMigrationManager();
4747
migration.Migrate(null!);
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright 2022 MONAI Consortium
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
using FellowOakDicom;
18+
using Microsoft.EntityFrameworkCore;
19+
using Microsoft.Extensions.DependencyInjection;
20+
using Microsoft.Extensions.Logging;
21+
using Microsoft.Extensions.Options;
22+
using Microsoft.VisualBasic;
23+
using Monai.Deploy.InformaticsGateway.Api.Storage;
24+
using Monai.Deploy.InformaticsGateway.Configuration;
25+
using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test;
26+
using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories;
27+
using MongoDB.Driver;
28+
using Moq;
29+
namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test
30+
{
31+
[Collection("MongoDatabase")]
32+
public class RemoteAppRepositoryTest
33+
{
34+
private readonly MongoDatabaseFixture _databaseFixture;
35+
36+
private readonly Mock<IServiceScopeFactory> _serviceScopeFactory;
37+
private readonly Mock<ILogger<RemoteAppExecutionRepository>> _logger;
38+
private readonly IOptions<InformaticsGatewayConfiguration> _options;
39+
40+
private readonly Mock<IServiceScope> _serviceScope;
41+
private readonly IServiceProvider _serviceProvider;
42+
43+
public RemoteAppRepositoryTest(MongoDatabaseFixture databaseFixture)
44+
{
45+
_databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture));
46+
47+
_serviceScopeFactory = new Mock<IServiceScopeFactory>();
48+
_logger = new Mock<ILogger<RemoteAppExecutionRepository>>();
49+
_options = Options.Create(new InformaticsGatewayConfiguration());
50+
51+
_serviceScope = new Mock<IServiceScope>();
52+
var services = new ServiceCollection();
53+
services.AddScoped(p => _logger.Object);
54+
services.AddScoped(p => databaseFixture.Client);
55+
56+
_serviceProvider = services.BuildServiceProvider();
57+
_serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object);
58+
_serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider);
59+
60+
_options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 };
61+
_logger.Setup(p => p.IsEnabled(It.IsAny<LogLevel>())).Returns(true);
62+
}
63+
64+
[Fact]
65+
public async Task GivenAexecution_WhenAddingToDatabase_ExpectItToBeSaved()
66+
{
67+
var outgoingUid = Guid.NewGuid().ToString();
68+
var dataset = new DicomDataset();
69+
var date = new DateTime(2023, 5, 21, 6, 7, 8).ToUniversalTime();
70+
71+
var execution = new RemoteAppExecution
72+
{
73+
CorrelationId = Guid.NewGuid().ToString(),
74+
ExportTaskId = "ExportTaskId",
75+
WorkflowInstanceId = "WorkflowInstanceId",
76+
OutgoingUid = outgoingUid,
77+
StudyUid = Guid.NewGuid().ToString(),
78+
RequestTime = date,
79+
OriginalValues = new Dictionary<string, string> {
80+
{ DicomTag.StudyInstanceUID.ToString(), "StudyInstanceUID" },
81+
{ DicomTag.SeriesInstanceUID.ToString(), "SeriesInstanceUID" }
82+
}
83+
};
84+
85+
86+
var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options);
87+
await store.AddAsync(execution).ConfigureAwait(false);
88+
89+
var collection = _databaseFixture.Database.GetCollection<RemoteAppExecution>(nameof(RemoteAppExecution));
90+
var actual = await collection.Find(p => p.OutgoingUid == execution.OutgoingUid).FirstOrDefaultAsync().ConfigureAwait(false);
91+
92+
Task.Delay(1000).Wait();
93+
Assert.NotNull(actual);
94+
Assert.Equal(execution.CorrelationId, actual!.CorrelationId);
95+
Assert.Equal(execution.ExportTaskId, actual!.ExportTaskId);
96+
Assert.Equal(execution.WorkflowInstanceId, actual!.WorkflowInstanceId);
97+
Assert.Equal(execution.OutgoingUid, actual!.OutgoingUid);
98+
Assert.Equal(execution.CorrelationId, actual!.CorrelationId);
99+
Assert.Equal(execution.WorkflowInstanceId, actual!.WorkflowInstanceId);
100+
Assert.Equal(execution.StudyUid, actual!.StudyUid);
101+
Assert.Equal(execution.RequestTime, actual!.RequestTime);
102+
Assert.Equal(execution.OriginalValues, actual!.OriginalValues);
103+
Assert.Equal(2, actual!.OriginalValues.Count);
104+
}
105+
}
106+
}

src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public DestinationApplicationEntityRepository(
5757
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5858

5959
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
60-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
60+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6161
_collection = mongoDatabase.GetCollection<DestinationApplicationEntity>(nameof(DestinationApplicationEntity));
6262
CreateIndexes();
6363
}

src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public DicomAssociationInfoRepository(
5555
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5656

5757
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
58-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
58+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
5959
_collection = mongoDatabase.GetCollection<DicomAssociationInfo>(nameof(DicomAssociationInfo));
6060
}
6161

src/Database/MongoDB/Repositories/InferenceRequestRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public InferenceRequestRepository(
5959
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
6060

6161
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
62-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
62+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6363
_collection = mongoDatabase.GetCollection<InferenceRequest>(nameof(InferenceRequest));
6464
CreateIndexes();
6565
}

src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public MonaiApplicationEntityRepository(
5757
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5858

5959
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
60-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
60+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6161
_collection = mongoDatabase.GetCollection<MonaiApplicationEntity>(nameof(MonaiApplicationEntity));
6262
CreateIndexes();
6363
}

src/Database/MongoDB/Repositories/PayloadRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public PayloadRepository(
5757
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5858

5959
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
60-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
60+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6161
_collection = mongoDatabase.GetCollection<Payload>(nameof(Payload));
6262
CreateIndexes();
6363
}

src/Database/MongoDB/Repositories/RemoteAppExecutionRepository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public RemoteAppExecutionRepository(IServiceScopeFactory serviceScopeFactory,
5454
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5555

5656
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
57-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
57+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
5858
_collection = mongoDatabase.GetCollection<RemoteAppExecution>(nameof(RemoteAppExecution));
5959
CreateIndexes();
6060
}

src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public SourceApplicationEntityRepository(
5757
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5858

5959
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
60-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
60+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6161
_collection = mongoDatabase.GetCollection<SourceApplicationEntity>(nameof(SourceApplicationEntity));
6262
CreateIndexes();
6363
}

src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public StorageMetadataWrapperRepository(
5959
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
6060

6161
var mongoDbClient = _scope.ServiceProvider.GetRequiredService<IMongoClient>();
62-
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName);
62+
var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName);
6363
_collection = mongoDatabase.GetCollection<StorageMetadataWrapper>(nameof(StorageMetadataWrapper));
6464
CreateIndexes();
6565
}

src/InformaticsGateway/ExecutionPlugins/ExternalAppIncoming.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public ExternalAppIncoming(
6262
}
6363
foreach (var key in remoteAppExecution.OriginalValues.Keys)
6464
{
65-
dicomFile.Dataset.AddOrUpdate(key, remoteAppExecution.OriginalValues[key]);
65+
var (group, element) = Parse(key);
66+
dicomFile.Dataset.AddOrUpdate(new DicomTag(group, element), remoteAppExecution.OriginalValues[key]);
6667
}
6768

6869
fileMetadata.WorkflowInstanceId = remoteAppExecution.WorkflowInstanceId;
@@ -71,6 +72,13 @@ public ExternalAppIncoming(
7172
return (dicomFile, fileMetadata);
7273
}
7374

75+
private (ushort group, ushort element) Parse(string input)
76+
{
77+
var trim = input.Substring(1, input.Length - 2);
78+
var array = trim.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
79+
return (Convert.ToUInt16(array[0], 16), Convert.ToUInt16(array[1], 16));
80+
}
81+
7482
private static DicomTag[] GetTags(string values)
7583
{
7684
var names = values.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);

src/InformaticsGateway/ExecutionPlugins/ExternalAppOutgoing.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
using System;
18+
using System.Data;
1819
using System.Linq;
1920
using System.Threading;
2021
using System.Threading.Tasks;
@@ -61,7 +62,7 @@ public ExternalAppOutgoing(
6162
{
6263
if (dicomFile.Dataset.TryGetString(tag, out var value))
6364
{
64-
remoteAppExecution.OriginalValues.Add(tag, value);
65+
remoteAppExecution.OriginalValues.Add(tag.ToString(), value);
6566
SetTag(dicomFile, tag);
6667
}
6768
}

src/InformaticsGateway/Test/Services/Common/ExternalAppPluginTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ public async Task ExternalAppPlugin_Should_Repare_StudyUid()
211211
{
212212
OutgoingUid = outboundStudyUid,
213213
StudyUid = originalStudyUid,
214-
OriginalValues = { { DicomTag.StudyInstanceUID, originalStudyUid } }
214+
OriginalValues = { { DicomTag.StudyInstanceUID.ToString(), originalStudyUid } }
215215
};
216216

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

0 commit comments

Comments
 (0)