⟨/⟩ 45_Api/Endpoints/InputPackets/GetInputQueue.cs

137 строк · в начало

using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Based;
using Ban.Sdaid.Icd.Domain.Capture;

namespace Ban.Sdaid.Icd.Api.Endpoints.InputPackets.GetInputQueue
{
    /// <summary>Документ-обёртка над endpoint выдачи очереди пакетов обработки.</summary>
    public class DOC_GetInputQueue : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.InputPackets.GetInputQueueHandler>(),
        };

        public static string _refName = "Endpoint GetInputQueue";

        public string Name => "Endpoint: GetInputQueue";

        public string Description =>
            @"Список пакетов очереди обработки с составом (кадры и идентификаторы) для страницы «Обработка очереди». Мягко удалённые пакеты исключены. Поведение — GetInputQueueHandler.";

        public string Version => "0.1";
        public string Status => "draft";
        public string[] Comments => new string[0];

        public static string Transport = """
            ## Транспорт

            `GET /api/InputPacket` — параметров нет; ответ в единой обёртке (`Payload` ниже). Пагинации пока нет
            (упрощённый просмотр): список отсортирован от новых к старым, мягко удалённые исключены.
            """;

        public static string Body = $"""
            ## Endpoint

            {SdaidCode.OfClass<GetInputQueueEndpoint>()}

            ## Query

            {SdaidCode.OfClass<GetInputQueueQuery>()}

            ## Result

            {SdaidCode.OfClass<GetInputQueueResult>()}

            ## Payload

            {SdaidCode.OfClass<InputQueuePayload>()}

            ## PacketItem / FrameItem / IdentifierItem

            {SdaidCode.OfClass<QueuePacketItem>()}

            {SdaidCode.OfClass<QueueFrameItem>()}

            {SdaidCode.OfClass<QueueIdentifierItem>()}
            """;
    }

    /// <summary>Endpoint выдачи очереди пакетов.</summary>
    public class GetInputQueueEndpoint
    {
        public GetInputQueueQuery? Input { get; set; }
        public GetInputQueueResult? Output { get; set; }
    }

    /// <summary>Запрос очереди (без параметров).</summary>
    public class GetInputQueueQuery : BasedQuery
    {
    }

    /// <summary>Результат — список пакетов в поле Payload.</summary>
    public class GetInputQueueResult : BasedResult
    {
        public InputQueuePayload? Payload { get; init; }
    }

    /// <summary>Полезная нагрузка очереди.</summary>
    public class InputQueuePayload
    {
        /// <summary>Пакеты очереди, от новых к старым.</summary>
        public QueuePacketItem[] Packets { get; init; } = new QueuePacketItem[0];
    }

    /// <summary>Пакет очереди: сводка и состав.</summary>
    public class QueuePacketItem
    {
        public Guid Id { get; init; }

        /// <summary>Номер вида П-ГГГГММДД-NNN.</summary>
        public string Number { get; init; } = "";

        public DateTime QueuedAt { get; init; }

        public int FramesCount { get; init; }

        /// <summary>Состояние жизненного цикла; пока только `Queued` — обработки ещё нет.</summary>
        public string State { get; init; } = "Queued";

        public QueueFrameItem[] Frames { get; init; } = new QueueFrameItem[0];
        public QueueIdentifierItem[] Identifiers { get; init; } = new QueueIdentifierItem[0];
    }

    /// <summary>Кадр в составе пакета.</summary>
    public class QueueFrameItem
    {
        public int Order { get; init; }

        /// <summary>Русская подпись роли изображения; null — роль ещё не определена (на вводе не задаётся).</summary>
        public string? RoleName { get; init; }

        /// <summary>Способ получения кадра.</summary>
        [Relation]
        public ImageSource Source { get; init; }

        /// <summary>Ключ хранения кадра (ADR-002); по нему отдаётся содержимое (GetFrameContent).</summary>
        public string StorageKey { get; init; } = "";

        public string? OriginalFileName { get; init; }

        /// <summary>Есть обработанная (нормализованная) версия кадра — ADR-SRV-005.</summary>
        public bool Normalized { get; init; }

        /// <summary>Флаг качества/режима нормализации (напр. low_quality); null — нет.</summary>
        public string? NormalizationFlag { get; init; }
    }

    /// <summary>Идентификатор в составе пакета: подпись и значение.</summary>
    public class QueueIdentifierItem
    {
        public string Name { get; init; } = "";
        public string Value { get; init; } = "";
    }
}