This commit is contained in:
2026-03-18 18:59:41 +01:00
parent 9f14bb2c86
commit 4f74192cb6
11 changed files with 69 additions and 15 deletions
@@ -8,14 +8,12 @@ namespace Musify.Application.Configuration
public static void AddPlayListConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static void AddPlayListConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
var playListConfiguration = PlayListConfiguration.Load(configuration); var playListConfiguration = PlayListConfiguration.Load(configuration);
serviceDescriptors.AddSingleton(playListConfiguration); serviceDescriptors.AddSingleton(playListConfiguration);
} }
public static void AddStorageConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static void AddStorageConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
var storageConfiguration = StorageConfiguration.Load(configuration); var storageConfiguration = StorageConfiguration.Load(configuration);
serviceDescriptors.AddSingleton(storageConfiguration); serviceDescriptors.AddSingleton(storageConfiguration);
} }
} }
@@ -26,7 +26,6 @@ namespace Musify.Application.Configuration
?? throw new InvalidOperationException($"{SectionName} configuration section not found."); ?? throw new InvalidOperationException($"{SectionName} configuration section not found.");
Validate(section); Validate(section);
return section; return section;
} }
@@ -26,7 +26,6 @@ namespace Musify.Application.Configuration
?? throw new InvalidOperationException($"{SectionName} configuration section not found."); ?? throw new InvalidOperationException($"{SectionName} configuration section not found.");
Validate(section); Validate(section);
return section; return section;
} }
@@ -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);
}
}
}
@@ -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<DatabaseConfiguration>()
?? 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.");
}
}
}
@@ -1,6 +1,6 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace Musify.Infrastructure.Identity namespace Musify.Infrastructure.Configuration
{ {
public class KeycloakConfiguration public class KeycloakConfiguration
{ {
@@ -20,7 +20,6 @@ namespace Musify.Infrastructure.Identity
?? throw new InvalidOperationException($"{SectionName} configuration section not found."); ?? throw new InvalidOperationException($"{SectionName} configuration section not found.");
Validate(keycloakConfiguration); Validate(keycloakConfiguration);
return keycloakConfiguration; return keycloakConfiguration;
} }
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Musify.Application.Contracts.Infrastructure; using Musify.Application.Contracts.Infrastructure;
using Musify.Infrastructure.Configuration;
namespace Musify.Infrastructure.Identity namespace Musify.Infrastructure.Identity
{ {
@@ -9,9 +10,7 @@ namespace Musify.Infrastructure.Identity
public static void AddKeycloakAuthentication(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static void AddKeycloakAuthentication(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
var keycloakConfiguration = KeycloakConfiguration.Load(configuration); var keycloakConfiguration = KeycloakConfiguration.Load(configuration);
serviceDescriptors.AddSingleton(keycloakConfiguration); serviceDescriptors.AddSingleton(keycloakConfiguration);
serviceDescriptors.AddScoped<IKeycloakUserClient, KeycloakIdentityService>(); serviceDescriptors.AddScoped<IKeycloakUserClient, KeycloakIdentityService>();
} }
} }
@@ -4,6 +4,7 @@ using Keycloak.Net.Models.Users;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Contracts.Infrastructure; using Musify.Application.Contracts.Infrastructure;
using Musify.Application.Users.Contracts; using Musify.Application.Users.Contracts;
using Musify.Infrastructure.Configuration;
namespace Musify.Infrastructure.Identity namespace Musify.Infrastructure.Identity
{ {
+8 -2
View File
@@ -1,12 +1,18 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts.Infrastructure; using Musify.Application.Contracts.Infrastructure;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Infrastructure.Configuration;
namespace Musify.Infrastructure.Persistence namespace Musify.Infrastructure.Persistence
{ {
public class Database(DbContextOptions<Database> dbContextOptions) public class Database(DatabaseConfiguration configuration)
: DbContext(dbContextOptions), IDatabase : DbContext, IDatabase
{ {
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(configuration.ConnectionString);
}
public DbSet<User> Users => Set<User>(); public DbSet<User> Users => Set<User>();
public DbSet<Track> Tracks => Set<Track>(); public DbSet<Track> Tracks => Set<Track>();
@@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Musify.Infrastructure.Configuration;
namespace Musify.Infrastructure.Persistence namespace Musify.Infrastructure.Persistence
{ {
@@ -12,12 +13,15 @@ namespace Musify.Infrastructure.Persistence
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("AppSettings.json") .AddJsonFile("AppSettings.json")
.Build(); .Build();
var connectionString = configuration.GetConnectionString("Default");
var databaseConfiguration = configuration.GetSection(DatabaseConfiguration.SectionName)
.Get<DatabaseConfiguration>()
?? throw new InvalidOperationException($"Failed to load {DatabaseConfiguration.SectionName} configuration.");
var optionsBuilder = new DbContextOptionsBuilder<Database>(); var optionsBuilder = new DbContextOptionsBuilder<Database>();
optionsBuilder.UseNpgsql(connectionString); optionsBuilder.UseNpgsql(databaseConfiguration.ConnectionString);
return new Database(optionsBuilder.Options); return new Database(databaseConfiguration);
} }
} }
} }
@@ -12,14 +12,12 @@ namespace Musify.Infrastructure.Storage
serviceDescriptors.AddScoped<IAmazonS3>(serviceProvider => serviceDescriptors.AddScoped<IAmazonS3>(serviceProvider =>
{ {
var configuration = serviceProvider.GetRequiredService<StorageConfiguration>(); var configuration = serviceProvider.GetRequiredService<StorageConfiguration>();
var s3Configuration = new AmazonS3Config var s3Configuration = new AmazonS3Config
{ {
ServiceURL = configuration.ServiceUrl, ServiceURL = configuration.ServiceUrl,
ForcePathStyle = configuration.ForcePathStyle, ForcePathStyle = configuration.ForcePathStyle,
UseHttp = configuration.UseHttp, UseHttp = configuration.UseHttp,
}; };
return new AmazonS3Client(configuration.AccessKey, configuration.SecretAccessKey, s3Configuration); return new AmazonS3Client(configuration.AccessKey, configuration.SecretAccessKey, s3Configuration);
} ); } );