Ejemplo n.º 1
0
        public GroupMemberExtractorTests()
        {
            var dataClient = Substitute.For <IFhirDataClient>();

            dataClient.SearchAsync(new ResourceIdSearchOptions("Group", _sampleGroupId, null), _noneCancellationToken)
            .ReturnsForAnyArgs(x =>
            {
                var resourceId   = ((ResourceIdSearchOptions)x[0]).ResourceId;
                var testDataFile = _groupIdToTestDataFile.ContainsKey(resourceId)
                        ? Path.Combine(_testDataFolder, _groupIdToTestDataFile[resourceId])
                        : TestDataConstants.EmptyBundleFile;
                var bundle =
                    TestDataProvider.GetBundleFromFile(testDataFile);
                return(bundle);
            });

            var fhirServerConfig = new FhirServerConfiguration
            {
                ServerUrl      = "https://example.com",
                Authentication = AuthenticationType.None,
            };
            var fhirServerOption = Options.Create(fhirServerConfig);

            _dataSource           = new FhirApiDataSource(fhirServerOption);
            _referenceParser      = new R4ReferenceParser(_dataSource, NullLogger <R4ReferenceParser> .Instance);
            _groupMemberExtractor = new GroupMemberExtractor(dataClient, _referenceParser, _nullGroupMemberExtractorLogger);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Adds services for enabling a FHIR server.
        /// </summary>
        /// <param name="services">The services collection.</param>
        /// <param name="configurationRoot">An optional configuration root object. This method uses "FhirServer" section.</param>
        /// <param name="configureAction">An optional delegate to set <see cref="FhirServerConfiguration"/> properties after values have been loaded from configuration</param>
        /// <returns>A <see cref="IFhirServerBuilder"/> object.</returns>
        public static IFhirServerBuilder AddFhirServer(
            this IServiceCollection services,
            IConfiguration configurationRoot = null,
            Action <FhirServerConfiguration> configureAction = null)
        {
            EnsureArg.IsNotNull(services, nameof(services));

            services.AddOptions();
            services.AddMvc(options =>
            {
                options.EnableEndpointRouting      = false;
                options.RespectBrowserAcceptHeader = true;
            })
            .AddNewtonsoftJson()
            .AddRazorRuntimeCompilation();

            var fhirServerConfiguration = new FhirServerConfiguration();

            configurationRoot?.GetSection(FhirServerConfigurationSectionName).Bind(fhirServerConfiguration);
            configureAction?.Invoke(fhirServerConfiguration);

            services.AddSingleton(Options.Options.Create(fhirServerConfiguration));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Security));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Features));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.CoreFeatures));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Cors));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations.Export));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations.Reindex));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations.ConvertData));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Audit));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Bundle));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Throttling));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.ArtifactStore));
            services.AddTransient <IStartupFilter, FhirServerStartupFilter>();

            services.RegisterAssemblyModules(Assembly.GetExecutingAssembly(), fhirServerConfiguration);

            services.AddFhirServerBase(fhirServerConfiguration);

            services.AddHttpClient(Options.Options.DefaultName)
            .AddTransientHttpErrorPolicy(builder =>
                                         builder.OrResult(m => m.StatusCode == HttpStatusCode.TooManyRequests)
                                         .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));

            var multipleRegisteredServices = services
                                             .GroupBy(x => (x.ServiceType, x.ImplementationType, x.ImplementationInstance, x.ImplementationFactory))
                                             .Where(x => x.Count() > 1)
                                             .ToArray();

            if (multipleRegisteredServices.Any())
            {
                foreach (var service in multipleRegisteredServices)
                {
                    Debug.WriteLine($"** IoC Config Warning: Service implementation '{service.Key.ImplementationType ?? service.Key.ImplementationInstance ?? service.Key.ImplementationFactory}' was registered multiple times.");
                }
            }

            return(new FhirServerBuilder(services));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Adds services for enabling a FHIR server.
        /// </summary>
        /// <param name="services">The services collection.</param>
        /// <param name="configurationRoot">An optional configuration root object. This method uses "FhirServer" section.</param>
        /// <param name="configureAction">An optional delegate to set <see cref="FhirServerConfiguration"/> properties after values have been loaded from configuration</param>
        /// <returns>A <see cref="IFhirServerBuilder"/> object.</returns>
        public static IFhirServerBuilder AddFhirServer(
            this IServiceCollection services,
            IConfiguration configurationRoot = null,
            Action <FhirServerConfiguration> configureAction = null)
        {
            EnsureArg.IsNotNull(services, nameof(services));

            services.AddOptions();
            services.AddMvc(options =>
            {
                options.RespectBrowserAcceptHeader = true;
            });

            var fhirServerConfiguration = new FhirServerConfiguration();

            configurationRoot?.GetSection(FhirServerConfigurationSectionName).Bind(fhirServerConfiguration);
            configureAction?.Invoke(fhirServerConfiguration);

            services.AddSingleton(Options.Options.Create(fhirServerConfiguration));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Security));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Conformance));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Features));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Cors));
            services.AddTransient <IStartupFilter, FhirServerStartupFilter>();

            services.RegisterAssemblyModules(Assembly.GetExecutingAssembly(), fhirServerConfiguration);

            services.AddHttpClient();

            return(new FhirServerBuilder(services));
        }
        public void GivenEmptyServerUrl_WhenInitialize_ArgumentExceptionShouldBeThrown()
        {
            // ServerUrl is string.empty
            var fhirServerConfig = new FhirServerConfiguration();

            Assert.Throws <ArgumentException>(() => new FhirApiDataSource(Options.Create(fhirServerConfig)));

            fhirServerConfig.ServerUrl = "";
            Assert.Throws <ArgumentException>(() => new FhirApiDataSource(Options.Create(fhirServerConfig)));
        }
Ejemplo n.º 5
0
        private ITypedElement GetTestElement(string fileName)
        {
            var fhirConfiguration = new FhirServerConfiguration()
            {
                Version = FhirVersion.R4,
            };
            var fhirParser = new FhirSerializer(Options.Create(fhirConfiguration));

            return(fhirParser.DeserializeToElement(File.ReadAllText(fileName)));
        }
        public void GivenServerUrl_WhenInitialize_ServerUrlShouldBeEndsWithSlash(string serverUrl, string expectedServerUrl)
        {
            var fhirServerConfig = new FhirServerConfiguration
            {
                ServerUrl = serverUrl,
            };
            var dataSource = new FhirApiDataSource(Options.Create(fhirServerConfig));

            Assert.Equal(expectedServerUrl, dataSource.FhirServerUrl);
        }
        /// <summary>
        /// Adds services for enabling a FHIR server.
        /// </summary>
        /// <param name="services">The services collection.</param>
        /// <param name="configurationRoot">An optional configuration root object. This method uses "FhirServer" section.</param>
        /// <param name="configureAction">An optional delegate to set <see cref="FhirServerConfiguration"/> properties after values have been loaded from configuration</param>
        /// <returns>A <see cref="IFhirServerBuilder"/> object.</returns>
        public static IFhirServerBuilder AddFhirServer(
            this IServiceCollection services,
            IConfiguration configurationRoot = null,
            Action <FhirServerConfiguration> configureAction = null)
        {
            EnsureArg.IsNotNull(services, nameof(services));

            services.AddOptions();
            services.AddMvc(options =>
            {
                options.EnableEndpointRouting      = false;
                options.RespectBrowserAcceptHeader = true;
            })
            .AddNewtonsoftJson()
            .AddRazorRuntimeCompilation();

            var fhirServerConfiguration = new FhirServerConfiguration();

            configurationRoot?.GetSection(FhirServerConfigurationSectionName).Bind(fhirServerConfiguration);
            configureAction?.Invoke(fhirServerConfiguration);

            services.AddSingleton(Options.Options.Create(fhirServerConfiguration));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Security));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Features));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.CoreFeatures));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Cors));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations.Export));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Audit));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Bundle));

            services.AddTransient <IStartupFilter, FhirServerStartupFilter>();

            services.RegisterAssemblyModules(Assembly.GetExecutingAssembly(), fhirServerConfiguration);

            services.AddFhirServerBase(fhirServerConfiguration);

            services.AddHttpClient();

            var multipleRegisteredServices = services
                                             .GroupBy(x => (x.ServiceType, x.ImplementationType, x.ImplementationInstance, x.ImplementationFactory))
                                             .Where(x => x.Count() > 1)
                                             .ToArray();

            if (multipleRegisteredServices.Any())
            {
                foreach (var service in multipleRegisteredServices)
                {
                    Debug.WriteLine($"** IoC Config Warning: Service implementation '{service.Key.ImplementationType ?? service.Key.ImplementationInstance ?? service.Key.ImplementationFactory}' was registered multiple times.");
                }
            }

            return(new FhirServerBuilder(services));
        }
        public R4ReferenceParserTests()
        {
            var fhirServerConfig = new FhirServerConfiguration
            {
                ServerUrl      = _serverUrl,
                Authentication = AuthenticationType.None,
            };
            var fhirServerOption = Options.Create(fhirServerConfig);

            _dataSource      = new FhirApiDataSource(fhirServerOption);
            _referenceParser = new R4ReferenceParser(_dataSource, _nullR4ReferenceParserLogger);
        }
        public static ITypedElement GetBundleElementFromFile(string filePath)
        {
            var bundleContent = GetBundleFromFile(filePath);

            var fhirConfiguration = new FhirServerConfiguration()
            {
                Version = FhirVersion.R4,
            };
            var fhirSerializer = new FhirSerializer(Options.Create(fhirConfiguration));

            return(fhirSerializer.DeserializeToElement(bundleContent));
        }
        public void GivenDataSourceServerUrlEndsWithSlash_WhenParseReference_ParsedReferenceShouldBeReturned()
        {
            var fhirServerConfig = new FhirServerConfiguration
            {
                ServerUrl      = "https://example.com/",
                Authentication = AuthenticationType.None,
            };

            var fhirServerOption = Options.Create(fhirServerConfig);
            var dataSource       = new FhirApiDataSource(fhirServerOption);
            var referenceParser  = new R4ReferenceParser(dataSource, _nullR4ReferenceParserLogger);

            var fhirReference = referenceParser.Parse("https://example.com/Patient/123/_history/2");

            Assert.NotNull(fhirReference);
            Assert.Equal("Patient", fhirReference.ResourceType);
            Assert.Equal("123", fhirReference.ResourceId);
        }
        /// <summary>
        /// Adds services for enabling a FHIR server.
        /// </summary>
        /// <param name="services">The services collection.</param>
        /// <param name="configurationRoot">An optional configuration root object. This method uses "FhirServer" section.</param>
        /// <param name="configureAction">An optional delegate to set <see cref="FhirServerConfiguration"/> properties after values have been loaded from configuration</param>
        /// <returns>A <see cref="IFhirServerBuilder"/> object.</returns>
        public static IFhirServerBuilder AddFhirServer(
            this IServiceCollection services,
            IConfiguration configurationRoot = null,
            Action <FhirServerConfiguration> configureAction = null)
        {
            EnsureArg.IsNotNull(services, nameof(services));

            services.AddOptions();
            services.AddMvc(options =>
            {
                options.EnableEndpointRouting      = false;
                options.RespectBrowserAcceptHeader = true;
            })
            .AddNewtonsoftJson()
            .AddRazorRuntimeCompilation();

            var fhirServerConfiguration = new FhirServerConfiguration();

            configurationRoot?.GetSection(FhirServerConfigurationSectionName).Bind(fhirServerConfiguration);
            configureAction?.Invoke(fhirServerConfiguration);

            services.AddSingleton(Options.Options.Create(fhirServerConfiguration));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Security));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Features));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.CoreFeatures));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Cors));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Operations.Export));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Audit));
            services.AddSingleton(Options.Options.Create(fhirServerConfiguration.Bundle));

            services.AddTransient <IStartupFilter, FhirServerStartupFilter>();

            services.RegisterAssemblyModules(Assembly.GetExecutingAssembly(), fhirServerConfiguration);

            services.AddFhirServerBase(fhirServerConfiguration);

            services.AddHttpClient();

            return(new FhirServerBuilder(services));
        }
Ejemplo n.º 12
0
 public CorsModule(FhirServerConfiguration fhirServerConfiguration)
 {
     EnsureArg.IsNotNull(fhirServerConfiguration, nameof(fhirServerConfiguration));
     _corsConfiguration = fhirServerConfiguration.Cors;
 }
Ejemplo n.º 13
0
 public FhirModule(FhirServerConfiguration fhirServerConfiguration)
 {
     EnsureArg.IsNotNull(fhirServerConfiguration, nameof(fhirServerConfiguration));
     _featureConfiguration = fhirServerConfiguration.Features;
 }
Ejemplo n.º 14
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var services = builder.Services;

            /* Hack to get IConfiguration */
            var serviceProvider   = builder.Services.BuildServiceProvider();
            var configurationRoot = serviceProvider.GetService <IConfiguration>();
            var env = serviceProvider.GetRequiredService <IHostEnvironment>();

            var appDirectory = serviceProvider.GetRequiredService <IOptions <ExecutionContextOptions> >().Value.AppDirectory;

            var configBuilder = new ConfigurationBuilder()
                                .SetBasePath(appDirectory)
                                .AddJsonFile("appsettings.json");

            var customConfig = configBuilder.AddConfiguration(configurationRoot).Build();

            services.AddOptions();
            services.Add <IConfiguration>(x => customConfig).Singleton().ReplaceService <IConfiguration>();

            var fhirServerConfiguration = new FhirServerConfiguration();

            customConfig?.GetSection(FhirServerConfigurationSectionName).Bind(fhirServerConfiguration);

            services.AddSingleton(Options.Create(fhirServerConfiguration));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Security));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Features));
            services.AddSingleton(Options.Create(fhirServerConfiguration.CoreFeatures));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Cors));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Operations));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Operations.Export));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Operations.Reindex));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Audit));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Bundle));
            services.AddSingleton(Options.Create(fhirServerConfiguration.Throttling));

            new FhirModule(fhirServerConfiguration).Load(services);
            services.RemoveAll(typeof(IScoped <>));
            services.AddTransient(typeof(IScoped <>), typeof(FunctionsScoped <>));

            new MediationModule().Load(services);
            new PersistenceModule().Load(services);
            new SearchModule(fhirServerConfiguration).Load(services);
            new ValidationModule().Load(services);

            services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.Add <QueryStringParser>().Singleton().AsService <IQueryStringParser>();
            services.Add <FunctionsUrlResolver>().Singleton().ReplaceService <IUrlResolver>();

            services.AddHttpClient();

            services.Add <StartupExtension>().Transient().AsImplementedInterfaces();

            string dataStore = customConfig["DataStore"];

            if (dataStore.Equals("CosmosDb", StringComparison.InvariantCultureIgnoreCase))
            {
                var fhirBuilder = new FunctionsFhirServerBuilder(services);
                fhirBuilder.AddCosmosDbCore();
            }
        }
Ejemplo n.º 15
0
        public static IServiceCollection AddFhirServerBase(this IServiceCollection services, FhirServerConfiguration fhirServerConfiguration)
        {
            EnsureArg.IsNotNull(services, nameof(services));
            EnsureArg.IsNotNull(fhirServerConfiguration, nameof(fhirServerConfiguration));

            services.RegisterAssemblyModules(Assembly.GetExecutingAssembly(), fhirServerConfiguration);
            services.RegisterAssemblyModules(typeof(InitializationModule).Assembly, fhirServerConfiguration);

            return(services);
        }
Ejemplo n.º 16
0
        public SearchModule(FhirServerConfiguration configuration)
        {
            EnsureArg.IsNotNull(configuration, nameof(configuration));

            _configuration = configuration;
        }
Ejemplo n.º 17
0
 public SecurityModule(FhirServerConfiguration fhirServerConfiguration)
 {
     EnsureArg.IsNotNull(fhirServerConfiguration, nameof(fhirServerConfiguration));
     _securityConfiguration = fhirServerConfiguration.Security;
 }
Ejemplo n.º 18
0
 public ControlPlaneModule(FhirServerConfiguration fhirServerConfiguration)
 {
     EnsureArg.IsNotNull(fhirServerConfiguration, nameof(fhirServerConfiguration));
 }