using Microsoft.Extensions.Configuration; namespace Deal.Storage.Options; /// /// Настройки объектного хранилища сервиса данных. /// public sealed class StorageOptions { /// /// Значение бакета по умолчанию. /// public const string DefaultBucketName = "deal-attachments"; /// /// Env-ключ адреса хранилища (host:port). /// public const string EndpointEnvKey = "DEAL_STORAGE_ENDPOINT"; /// /// Env-ключ ключа доступа. /// public const string AccessKeyEnvKey = "DEAL_STORAGE_ACCESS_KEY"; /// /// Env-ключ секрета доступа. /// public const string SecretKeyEnvKey = "DEAL_STORAGE_SECRET_KEY"; /// /// Env-ключ имени бакета. /// public const string BucketEnvKey = "DEAL_STORAGE_BUCKET"; /// /// Env-ключ флага TLS (1/true — https). /// public const string SecureEnvKey = "DEAL_STORAGE_SECURE"; private const string TrueLiteral = "true"; public string Endpoint { get; init; } = string.Empty; public string AccessKey { get; init; } = string.Empty; public string SecretKey { get; init; } = string.Empty; public string Bucket { get; init; } = DefaultBucketName; public bool Secure { get; init; } /// /// Читает настройки из конфигурации хоста. /// public static StorageOptions FromConfiguration(IConfiguration configuration) { ArgumentNullException.ThrowIfNull(configuration); string bucket = (configuration[BucketEnvKey] ?? string.Empty).Trim(); return new StorageOptions { Endpoint = (configuration[EndpointEnvKey] ?? string.Empty).Trim(), AccessKey = (configuration[AccessKeyEnvKey] ?? string.Empty).Trim(), SecretKey = configuration[SecretKeyEnvKey] ?? string.Empty, Bucket = bucket.Length == 0 ? DefaultBucketName : bucket, Secure = IsEnabled(configuration[SecureEnvKey]), }; } /// /// Разбирает значение флага TLS. /// public static bool IsEnabled(string? rawValue) => string.Equals(rawValue, "1", StringComparison.Ordinal) || string.Equals(rawValue, TrueLiteral, StringComparison.OrdinalIgnoreCase); }