Deal — единая кодовая база
ci / build-test (push) Canceled after 0s

SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 23:56:47 +03:00
commit 27c7831910
1383 changed files with 158436 additions and 0 deletions
@@ -0,0 +1,73 @@
using Microsoft.Extensions.Configuration;
namespace Deal.Storage.Options;
/// <summary>
/// Настройки объектного хранилища сервиса данных.
/// </summary>
public sealed class StorageOptions
{
/// <summary>
/// Значение бакета по умолчанию.
/// </summary>
public const string DefaultBucketName = "deal-attachments";
/// <summary>
/// Env-ключ адреса хранилища (host:port).
/// </summary>
public const string EndpointEnvKey = "DEAL_STORAGE_ENDPOINT";
/// <summary>
/// Env-ключ ключа доступа.
/// </summary>
public const string AccessKeyEnvKey = "DEAL_STORAGE_ACCESS_KEY";
/// <summary>
/// Env-ключ секрета доступа.
/// </summary>
public const string SecretKeyEnvKey = "DEAL_STORAGE_SECRET_KEY";
/// <summary>
/// Env-ключ имени бакета.
/// </summary>
public const string BucketEnvKey = "DEAL_STORAGE_BUCKET";
/// <summary>
/// Env-ключ флага TLS (1/true — https).
/// </summary>
public const string SecureEnvKey = "DEAL_STORAGE_SECURE";
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; }
/// <summary>
/// Читает настройки из конфигурации хоста.
/// </summary>
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]),
};
}
/// <summary>
/// Разбирает значение флага TLS.
/// </summary>
public static bool IsEnabled(string? rawValue)
=> string.Equals(rawValue, "1", StringComparison.Ordinal)
|| string.Equals(rawValue, "true", StringComparison.OrdinalIgnoreCase);
}