using System.Text.Json.Serialization; namespace Deal.Modules.Pipeline.Application.Models; /// /// Элемент очереди входящих — item ответа GET /api/pipeline/queue (§4.5 L308, processing.list_queue L218–241). /// /// /// Поля 1:1 с §4.5 (фронт читает: id/text/status/ch/msgAt; dialogId/msgId/queuedAt — справочные). Status — /// new (ждёт правил/дедупа/ML) | filtered (прошла «new»-проход, ждёт ИИ; в счётчиках — bucket /// «ai»). Времена наружу epoch-ms; маппинг с DateTimeOffset-строкой (Ruling 1) выполняет адаптер хранилища. /// — внутренний флаг строки «возвращено из отсева» (Ruling 2/8), в JSON не выходит /// ([JsonIgnore]): прототипная запись pipeline_msg несёт force, но wire очередь её не отдаёт. /// public sealed record QueueItemDto { /// /// Короткий id строки очереди (префикс p_, Ruling 10). /// public string Id { get; init; } = string.Empty; /// /// Id диалога-источника сообщения. /// public string DialogId { get; init; } = string.Empty; /// /// Id исходного сообщения в Telegram (дубль-гвард приёма), либо null. /// public long? MsgId { get; init; } /// /// Текст сообщения (обрезан при приёме до 6000 символов, Ruling 2). /// public string Text { get; init; } = string.Empty; /// /// Статус строки: new | filtered (значения — как pipeline.py ST_NEW/ST_AI). /// public string Status { get; init; } = string.Empty; /// /// Канал-источник (выходит под ключом ch). /// [property: JsonPropertyName("ch")] public PipelineChannelDto Channel { get; init; } = new(string.Empty, string.Empty, string.Empty); /// /// Время исходного сообщения, epoch-ms (выходит под ключом msgAt). /// [property: JsonPropertyName("msgAt")] public long MsgAtMs { get; init; } /// /// Время постановки в очередь (= CreatedAt строки), epoch-ms (выходит под ключом queuedAt). /// [property: JsonPropertyName("queuedAt")] public long QueuedAtMs { get; init; } /// /// Внутренний флаг «возвращено пользователем из отсева»: правила/устарело/ML для строки игнорируются (Ruling 2/8). /// [JsonIgnore] public bool Force { get; init; } }