Разбить модули Deal.Modules.* по назначению

Application проектов Discovery, Kanban, Pipeline, Settings, Tenants
разделён на Abstractions/Exceptions/Extensions/Models/Registrars/Services;
namespace приведён к путям, using потребителей мигрированы и
дедуплицированы (169 файлов), cref/FQN обновлены.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:18:14 +03:00
parent 31c434ed93
commit cd0b3b606b
356 changed files with 14436 additions and 12906 deletions
@@ -0,0 +1,42 @@
using Deal.Modules.Settings.Application.Abstractions;
using Deal.Modules.Settings.Application.Models;
using Deal.Modules.Settings.Application.Registrars;
using Deal.Modules.Settings.Application.Services;
using Deal.Modules.Discovery.Application.Abstractions;
using Deal.Modules.Discovery.Application.Exceptions;
using Deal.Modules.Discovery.Application.Extensions;
using Deal.Modules.Discovery.Application.Models;
using Deal.Modules.Discovery.Application.Registrars;
namespace Deal.Modules.Discovery.Application.Services;
/// <summary>
/// Продовая реализация <see cref="IDiscoveryPacer"/>: случайная пауза из настроек тенанта (ban_guard L4456).
/// </summary>
/// <remarks>
/// Защита инварианта min ≤ max как в python L47–51: настройки мог изменить один конец интервала (single-key
/// PATCH), поэтому при инверсии концы меняются местами. Обе настройки не заданы/≤0 — паузы нет (крайний случай
/// L52–53). Детерминизма нет: интервал сэмплируется из <see cref="Random.Shared"/>.
/// </remarks>
public sealed class DiscoveryPacer(ISettingsStore settings) : IDiscoveryPacer
{
/// <inheritdoc />
public async Task WaitJoinDelayAsync(CancellationToken ct)
{
TenantSettingsSnapshot snapshot = await TenantSettingsSnapshot.LoadAsync(settings, ct);
int low = snapshot.GetInt(SettingsKeys.DiscJoinDelayMin, SettingsDefaults.DiscJoinDelayMin);
int high = snapshot.GetInt(SettingsKeys.DiscJoinDelayMax, SettingsDefaults.DiscJoinDelayMax);
if (low <= 0 && high <= 0)
{
return;
}
if (low > high)
{
(low, high) = (high, low);
}
double seconds = low + Random.Shared.NextDouble() * (high - low);
await Task.Delay(TimeSpan.FromSeconds(seconds), ct).ConfigureAwait(false);
}
}