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);
}