diff --git a/Application/Configuration/ConfigurationDependencyInjection.cs b/Application/Configuration/ConfigurationDependencyInjection.cs index 46d3702..d1e0fab 100644 --- a/Application/Configuration/ConfigurationDependencyInjection.cs +++ b/Application/Configuration/ConfigurationDependencyInjection.cs @@ -8,14 +8,12 @@ namespace Musify.Application.Configuration public static void AddPlayListConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) { var playListConfiguration = PlayListConfiguration.Load(configuration); - serviceDescriptors.AddSingleton(playListConfiguration); } public static void AddStorageConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) { var storageConfiguration = StorageConfiguration.Load(configuration); - serviceDescriptors.AddSingleton(storageConfiguration); } } diff --git a/Application/Configuration/PlayListConfiguration.cs b/Application/Configuration/PlayListConfiguration.cs index fd6260b..4567cc7 100644 --- a/Application/Configuration/PlayListConfiguration.cs +++ b/Application/Configuration/PlayListConfiguration.cs @@ -26,7 +26,6 @@ namespace Musify.Application.Configuration ?? throw new InvalidOperationException($"{SectionName} configuration section not found."); Validate(section); - return section; } diff --git a/Application/Configuration/StorageConfiguration.cs b/Application/Configuration/StorageConfiguration.cs index 0940fc7..b8932aa 100644 --- a/Application/Configuration/StorageConfiguration.cs +++ b/Application/Configuration/StorageConfiguration.cs @@ -26,7 +26,6 @@ namespace Musify.Application.Configuration ?? throw new InvalidOperationException($"{SectionName} configuration section not found."); Validate(section); - return section; } diff --git a/Infrastructure/Configuration/ConfigurationDependencyInjection.cs b/Infrastructure/Configuration/ConfigurationDependencyInjection.cs new file mode 100644 index 0000000..815fb0f --- /dev/null +++ b/Infrastructure/Configuration/ConfigurationDependencyInjection.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Musify.Infrastructure.Configuration +{ + public static class ConfigurationDependencyInjection + { + public static void AddKeycloakConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) + { + var keycloakConfiguration = KeycloakConfiguration.Load(configuration); + serviceDescriptors.AddSingleton(keycloakConfiguration); + } + + public static void AddDatabaseConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) + { + var databaseConfiguration = DatabaseConfiguration.Load(configuration); + serviceDescriptors.AddSingleton(databaseConfiguration); + } + } +} \ No newline at end of file diff --git a/Infrastructure/Configuration/DatabaseConfiguration.cs b/Infrastructure/Configuration/DatabaseConfiguration.cs new file mode 100644 index 0000000..aeef73d --- /dev/null +++ b/Infrastructure/Configuration/DatabaseConfiguration.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.Configuration; + +namespace Musify.Infrastructure.Configuration +{ + public class DatabaseConfiguration + { + public const string SectionName = "Database"; + + public string ConnectionString { get; set; } = string.Empty; + + public static DatabaseConfiguration Load(IConfiguration configuration) + { + var databaseConfiguration = configuration.GetSection(SectionName).Get() + ?? throw new InvalidOperationException($"{SectionName} configuration section not found."); + + Validate(databaseConfiguration); + return databaseConfiguration; + } + + static void Validate(DatabaseConfiguration configuration) + { + EnsureValue(configuration.ConnectionString, nameof(configuration.ConnectionString)); + } + + static void EnsureValue(string value, string name) + { + if (string.IsNullOrEmpty(value)) + throw new InvalidOperationException($"{name} configuration value not found."); + } + } +} \ No newline at end of file diff --git a/Infrastructure/Identity/KeycloakConfiguration.cs b/Infrastructure/Configuration/KeycloakConfiguration.cs similarity index 96% rename from Infrastructure/Identity/KeycloakConfiguration.cs rename to Infrastructure/Configuration/KeycloakConfiguration.cs index 9b1f146..23d0198 100644 --- a/Infrastructure/Identity/KeycloakConfiguration.cs +++ b/Infrastructure/Configuration/KeycloakConfiguration.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Configuration; -namespace Musify.Infrastructure.Identity +namespace Musify.Infrastructure.Configuration { public class KeycloakConfiguration { @@ -20,7 +20,6 @@ namespace Musify.Infrastructure.Identity ?? throw new InvalidOperationException($"{SectionName} configuration section not found."); Validate(keycloakConfiguration); - return keycloakConfiguration; } diff --git a/Infrastructure/Identity/KeycloakDependencyInjection.cs b/Infrastructure/Identity/KeycloakDependencyInjection.cs index ab2bacf..f23619f 100644 --- a/Infrastructure/Identity/KeycloakDependencyInjection.cs +++ b/Infrastructure/Identity/KeycloakDependencyInjection.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Musify.Application.Contracts.Infrastructure; +using Musify.Infrastructure.Configuration; namespace Musify.Infrastructure.Identity { @@ -9,9 +10,7 @@ namespace Musify.Infrastructure.Identity public static void AddKeycloakAuthentication(this IServiceCollection serviceDescriptors, IConfiguration configuration) { var keycloakConfiguration = KeycloakConfiguration.Load(configuration); - serviceDescriptors.AddSingleton(keycloakConfiguration); - serviceDescriptors.AddScoped(); } } diff --git a/Infrastructure/Identity/KeycloakIdentityService.cs b/Infrastructure/Identity/KeycloakIdentityService.cs index ea4533d..ecb3f13 100644 --- a/Infrastructure/Identity/KeycloakIdentityService.cs +++ b/Infrastructure/Identity/KeycloakIdentityService.cs @@ -4,6 +4,7 @@ using Keycloak.Net.Models.Users; using Microsoft.Extensions.Logging; using Musify.Application.Contracts.Infrastructure; using Musify.Application.Users.Contracts; +using Musify.Infrastructure.Configuration; namespace Musify.Infrastructure.Identity { diff --git a/Infrastructure/Persistence/Database.cs b/Infrastructure/Persistence/Database.cs index cf4b52d..5a1e8da 100644 --- a/Infrastructure/Persistence/Database.cs +++ b/Infrastructure/Persistence/Database.cs @@ -1,12 +1,18 @@ using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts.Infrastructure; using Musify.Domain.Entities; +using Musify.Infrastructure.Configuration; namespace Musify.Infrastructure.Persistence { - public class Database(DbContextOptions dbContextOptions) - : DbContext(dbContextOptions), IDatabase + public class Database(DatabaseConfiguration configuration) + : DbContext, IDatabase { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseNpgsql(configuration.ConnectionString); + } + public DbSet Users => Set(); public DbSet Tracks => Set(); diff --git a/Infrastructure/Persistence/DatabaseDesignTimeFactory.cs b/Infrastructure/Persistence/DatabaseDesignTimeFactory.cs index d776732..dd6aa29 100644 --- a/Infrastructure/Persistence/DatabaseDesignTimeFactory.cs +++ b/Infrastructure/Persistence/DatabaseDesignTimeFactory.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; +using Musify.Infrastructure.Configuration; namespace Musify.Infrastructure.Persistence { @@ -12,12 +13,15 @@ namespace Musify.Infrastructure.Persistence .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("AppSettings.json") .Build(); - var connectionString = configuration.GetConnectionString("Default"); + + var databaseConfiguration = configuration.GetSection(DatabaseConfiguration.SectionName) + .Get() + ?? throw new InvalidOperationException($"Failed to load {DatabaseConfiguration.SectionName} configuration."); var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseNpgsql(connectionString); + optionsBuilder.UseNpgsql(databaseConfiguration.ConnectionString); - return new Database(optionsBuilder.Options); + return new Database(databaseConfiguration); } } } \ No newline at end of file diff --git a/Infrastructure/Storage/StorageDependencyInjection.cs b/Infrastructure/Storage/StorageDependencyInjection.cs index 0c13dd2..6c54325 100644 --- a/Infrastructure/Storage/StorageDependencyInjection.cs +++ b/Infrastructure/Storage/StorageDependencyInjection.cs @@ -12,14 +12,12 @@ namespace Musify.Infrastructure.Storage serviceDescriptors.AddScoped(serviceProvider => { var configuration = serviceProvider.GetRequiredService(); - var s3Configuration = new AmazonS3Config { ServiceURL = configuration.ServiceUrl, ForcePathStyle = configuration.ForcePathStyle, UseHttp = configuration.UseHttp, }; - return new AmazonS3Client(configuration.AccessKey, configuration.SecretAccessKey, s3Configuration); } );