Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
@@ -0,0 +1,55 @@
namespace Deal.Telegram.Telegram;
/// <summary>
/// Результат чтения выборки источника для оценки кандидата (план Task 11; 1:1 discovery_read
/// python-прототипа telegram.py L718–760: {ok, error, messages}).
///
/// ok=false — история недоступна (приватный/закрытый источник без членства), error="no_history";
/// это НЕ ошибка сессии/RPC, а нормальный ответ контракта (ReadForEvalReply.ok=false).
/// </summary>
public sealed record DiscoveryReadResult
{
/// <summary>
/// Код причины ok=false: история недоступна без членства (1:1 прототип L726).
/// </summary>
public const string NoHistoryError = "no_history";
/// <summary>
/// Пустой успешный результат (limit ≤ 0 — выборка не запрашивалась, прототип L730–732).
/// </summary>
public static DiscoveryReadResult Empty { get; } = new(true, null, []);
/// <summary>
/// Создаёт результат чтения выборки.
/// </summary>
/// <param name="ok">True — выборка получена; false — история недоступна.</param>
/// <param name="error">Код причины при ok=false ("no_history"); иначе null.</param>
/// <param name="messages">Сообщения выборки (форумы — по темам, topic_id/topic_title заполнены).</param>
public DiscoveryReadResult(bool ok, string? error, IReadOnlyList<DiscoveryMessage> messages)
{
Ok = ok;
Error = error;
Messages = messages;
}
/// <summary>
/// Создаёт результат «история недоступна» (ok=false, error=no_history, сообщений нет).
/// </summary>
public static DiscoveryReadResult NoHistory()
=> new(false, NoHistoryError, []);
/// <summary>
/// True — выборка получена; false — история недоступна без членства.
/// </summary>
public bool Ok { get; }
/// <summary>
/// Код причины при ok=false: "no_history"; иначе null.
/// </summary>
public string? Error { get; }
/// <summary>
/// Сообщения выборки (для обычных источников topic_id/topic_title пусты).
/// </summary>
public IReadOnlyList<DiscoveryMessage> Messages { get; }
}