diff --git a/Application/Application.csproj b/Application/Application.csproj
index d1a1586..28753c1 100644
--- a/Application/Application.csproj
+++ b/Application/Application.csproj
@@ -12,6 +12,8 @@
+
+
diff --git a/Application/Configuration/PlayListConfiguration.cs b/Application/Configuration/PlayListConfiguration.cs
index fea1cf7..e0360c0 100644
--- a/Application/Configuration/PlayListConfiguration.cs
+++ b/Application/Configuration/PlayListConfiguration.cs
@@ -1,7 +1,11 @@
-namespace Musify.Application.Configuration
+using Microsoft.Extensions.Configuration;
+
+namespace Musify.Application.Configuration
{
public class PlayListConfiguration
{
+ public const string SectionName = "PlayListConfiguration";
+
public PlayListRoutes Routes { get; set; } = new PlayListRoutes();
public int SmallPictureWidth { get; set; } = 128;
@@ -15,6 +19,43 @@
public int LargePictureWidth { get; private set; } = 512;
public int LargePictureHeight { get; private set; } = 512;
+
+ public PlayListConfiguration Load(IConfiguration configuration)
+ {
+ var section = configuration.GetSection(SectionName).Get()
+ ?? throw new InvalidOperationException($"{SectionName} configuration section not found.");
+
+ Validate();
+
+ return section;
+ }
+
+ void Validate()
+ {
+ EnsureValue(Routes.ParentFolder, $"{SectionName}:BucketName");
+ EnsureValue(Routes.SmallPictures, $"{SectionName}:Routes:SmallPictures");
+ EnsureValue(Routes.MediumPictures, $"{SectionName}:Routes:MediumPictures");
+ EnsureValue(Routes.LargePictures, $"{SectionName}:Routes:LargePictures");
+
+ EnsurePositiveValue(SmallPictureWidth, $"{SectionName}:SmallPictureWidth");
+ EnsurePositiveValue(SmallPictureHeight, $"{SectionName}:SmallPictureHeight");
+ EnsurePositiveValue(MediumPictureWidth, $"{SectionName}:MediumPictureWidth");
+ EnsurePositiveValue(MediumPictureHeight, $"{SectionName}:MediumPictureHeight");
+ EnsurePositiveValue(LargePictureWidth, $"{SectionName}:LargePictureWidth");
+ EnsurePositiveValue(LargePictureHeight, $"{SectionName}:LargePictureHeight");
+ }
+
+ void EnsureValue(string value, string name)
+ {
+ if (string.IsNullOrEmpty(value))
+ throw new InvalidOperationException($"{name} configuration value not found.");
+ }
+
+ void EnsurePositiveValue(int value, string name)
+ {
+ if (value < 1)
+ throw new InvalidOperationException($"{name} configuration value must be a positive integer.");
+ }
}
public class PlayListRoutes
diff --git a/Application/Configuration/StorageConfiguration.cs b/Application/Configuration/StorageConfiguration.cs
index 8cf6c49..e18b5de 100644
--- a/Application/Configuration/StorageConfiguration.cs
+++ b/Application/Configuration/StorageConfiguration.cs
@@ -1,10 +1,36 @@
-namespace Musify.Application.Configuration
+using Microsoft.Extensions.Configuration;
+
+namespace Musify.Application.Configuration
{
public class StorageConfiguration
{
+ public const string SectionName = "Storage";
+
public string BucketName { get; set; } = "musify-S3";
public StorageRoutes Routes { get; set; } = new StorageRoutes();
+
+ public StorageConfiguration Load(IConfiguration configuration)
+ {
+ var section = configuration.GetSection(SectionName).Get()
+ ?? throw new InvalidOperationException($"{SectionName} configuration section not found.");
+
+ Validate();
+
+ return section;
+ }
+
+ void Validate()
+ {
+ EnsureValue(BucketName, nameof(BucketName));
+ EnsureValue(Routes.Uploads, $"{SectionName}:Route:Upload");
+ }
+
+ void EnsureValue(string value, string name)
+ {
+ if (string.IsNullOrEmpty(value))
+ throw new InvalidOperationException($"{name} configuration value not found.");
+ }
}
public class StorageRoutes