using Core.Thalos.Infraestructure.Caching.Contracts; using Core.Thalos.Infraestructure.Contexts.Mongo; using Core.Thalos.Provider.Contracts; using Core.Thalos.Provider.Providers; using Core.Thalos.Provider.Providers.Onboarding; using LSA.Core.Dapper.Service.Caching; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace Core.Thalos.Provider { public static class ServiceCollectionExtensions { public static IServiceCollection AddDALLayer(this IServiceCollection services, IConfiguration configuration) { var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; var connectionString = configuration.GetSection("ConnectionStrings:MongoDB").Value ?? string.Empty; var databaseName = configuration.GetSection("MongoDB:DatabaseName").Value ?? string.Empty; var audience = (environment == "Local") ? configuration.GetSection("MongoDB:LocalAudience").Value : configuration.GetSection("MongoDB:Audience").Value; if (string.IsNullOrEmpty(connectionString) || string.IsNullOrEmpty(databaseName) || string.IsNullOrEmpty(audience)) { throw new InvalidOperationException("Mongo connection is not configured correctly."); } services.Configure(options => { options.ConnectionString = connectionString; options.Databasename = databaseName; options.Audience = audience ?? string.Empty; }); services.AddSingleton(serviceProvider => { var settings = serviceProvider.GetRequiredService>().Value; var mongoClientSettings = MongoClientSettings.FromConnectionString(settings.ConnectionString); mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathOidcCallback(settings.Audience)); return new MongoClient(mongoClientSettings); }); services.AddSingleton(serviceProvider => { var settings = serviceProvider.GetRequiredService>().Value; var client = serviceProvider.GetRequiredService(); return client.GetDatabase(settings.Databasename); }); services.AddDALConfigurationLayer(); services.AddLogs(); services.AddRedisCacheService(configuration); return services; } private static IServiceCollection AddDALConfigurationLayer(this IServiceCollection services) { services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); return services; } private static IServiceCollection AddLogs(this IServiceCollection services) { services.AddLogging(); var serviceProvider = services.BuildServiceProvider(); //var logger = serviceProvider.GetService>(); //Add for Markup class later TODO //services.AddSingleton(typeof(ILogger), logger); return services; } private static IServiceCollection AddRedisCacheService(this IServiceCollection services, IConfiguration configuration) { var source = configuration.GetSection("ConnectionStrings"); var redisConnectionString = source["Redis"]?.ToString(); if (string.IsNullOrEmpty(redisConnectionString)) { throw new InvalidOperationException("Redis connection string is not configured."); } services.AddSingleton(provider => new CacheService(redisConnectionString, provider.GetRequiredService>())); return services; } } }