Почистить комментарии от упоминаний процесса

Удалены <remarks>, <summary> сжаты до короткой фразы, вырезаны
ссылки на Task/Ruling/этап/python/прототип; //-комментарии со ссылками
на процесс удалены; то же в .proto. Правила обновлены в
docs/spec/Код-стайл-Дейл.md. Строк комментариев 27210 -> ~19100.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:39:39 +03:00
parent 5f5538d33b
commit b053d58335
902 changed files with 3902 additions and 12074 deletions
@@ -6,25 +6,15 @@ using Microsoft.Extensions.Logging;
namespace Deal.Infrastructure.Integrations.Services;
/// <summary>
/// HTTP-источник курсов ЦБ РФ: GET daily_json.js (Ruling 6, Task 8; 1:1 rates.py L4359).
/// HTTP-источник курсов ЦБ РФ
/// </summary>
/// <remarks>
/// Запрос — GET <c>https://www.cbr-xml-daily.ru/daily_json.js</c> (JSON-зеркало ЦБ). SSRF-контур: URL —
/// фиксированная константа (allowlist), тенант не управляет адресом источника (в отличие от baseUrl
/// AI-провайдеров, Task 6). Таймаут клиента — 15 с (python: <c>httpx timeout=15</c>), задаётся
/// DI-регистрацией AddHttpClient в Deal.Api. Парсинг: <c>Valute[code].Value / Nominal</c> (1 единица
/// валюты в рублях; Nominal может быть &gt; 1, напр. 100 KZT), к курсам добавляется <c>RUB:1</c>.
/// Любой сбой (HTTP-код ≠ 2xx, нераспознанное тело/запись, сетевая ошибка) → null + warning — кэш
/// RatesService при этом не трогает (Ruling 6). Отмена вызывающего пробрасывается (не «сбой»).
/// </remarks>
public sealed class CbrRateSource : IRatesSource
{
/// <summary>
/// Таймаут HTTP-запроса в секундах (python rates.py L46: <c>timeout=15</c>).
/// Таймаут HTTP-запроса в секундах.
/// </summary>
public const int RequestTimeoutSeconds = 15;
// URL JSON-зеркала курсов ЦБ (constants.py L52). Фиксированный — SSRF-allowlist.
private const string CbrUrl = "https://www.cbr-xml-daily.ru/daily_json.js";
// Корневой объект ответа: валюта → {Value, Nominal, …}.
@@ -39,7 +29,6 @@ public sealed class CbrRateSource : IRatesSource
// Базовая валюта ответа: курсы даются к рублю.
private const string BaseCurrency = "RUB";
// Курс рубля к рублю (всегда 1.0, rates.py L50).
private const double RubToRubRate = 1.0;
private readonly HttpClient _httpClient;
@@ -74,7 +63,6 @@ public sealed class CbrRateSource : IRatesSource
}
catch (Exception exception)
{
// Любой сбой HTTP/парсинга = неуспех источника (python ловит все исключения, rates.py L5759).
_logger.LogWarning("CBR fetch failed: {Reason}", exception.Message);
return null;
}
@@ -103,7 +91,6 @@ public sealed class CbrRateSource : IRatesSource
{
if (!TryParseCurrency(currency, out double rate))
{
// Нераспознанная запись валюты: как и исключение python внутри цикла, роняет весь fetch.
return null;
}
@@ -113,7 +100,6 @@ public sealed class CbrRateSource : IRatesSource
return rates;
}
// Разбирает одну запись валюты: курс = Value / Nominal, округлён до 6 знаков (rates.py L5155).
// currency: Пара «код валюты → объект {Value, Nominal}».
// rate: Курс единицы валюты к рублю (валиден при возврате true).
// Возвращает: True — запись распознана; False — повреждённая запись (весь fetch — сбой).
@@ -127,7 +113,6 @@ public sealed class CbrRateSource : IRatesSource
JsonElement item = currency.Value;
// Значение по умолчанию, как в python: отсутствующий Value → 0, Nominal → 1 (иначе — сбой).
double value = 0;
if (item.TryGetProperty(ValuePropertyName, out JsonElement valueElement))
{