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

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

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

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

        public static string _refName = "Endpoint NormalizePacket";

        public string Name => "Endpoint: NormalizePacket";

        public string Description =>
            @"Ручной запуск обработки (нормализации orthocover) кадров пакета: перекошенное фото → выровненное «как со сканера». Поведение — NormalizePacketHandler.";

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

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

            - `POST /api/InputPacket/{id}/frames/{order}/normalize` — обработать **один** кадр (ручной запуск
              «повторить обработку» на этапе предобработки).
            - `POST /api/InputPacket/{id}/normalize` — обработать **все** кадры пакета.

            Параметры — в пути, тела запроса нет. Ответ — единая обёртка со сводкой по кадрам. Обработка
            синхронная (≈2–5 с/кадр); фоновой очереди пока нет.
            """;

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

            {SdaidCode.OfClass<NormalizePacketCommand>()}

            ## Result

            {SdaidCode.OfClass<NormalizePacketResult>()}

            ## Payload

            {SdaidCode.OfClass<NormalizedPacketPayload>()}

            ## FrameInfo

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

    /// <summary>Команда обработки: `FrameOrder` задан — один кадр; null — все кадры пакета.</summary>
    public class NormalizePacketCommand : BasedCommand
    {
        public Guid PacketId { get; init; }

        /// <summary>Порядковый номер кадра; null — обработать все кадры.</summary>
        public int? FrameOrder { get; init; }
    }

    /// <summary>Результат обработки (обёртка + сводка по кадрам).</summary>
    public class NormalizePacketResult : BasedResult
    {
        public NormalizedPacketPayload? Payload { get; init; }
    }

    /// <summary>Итог: сколько кадров обработано/с ошибкой и результат по каждому.</summary>
    public class NormalizedPacketPayload
    {
        public Guid PacketId { get; init; }
        public int Processed { get; init; }
        public int Failed { get; init; }
        public NormalizedFrameInfo[] Frames { get; init; } = new NormalizedFrameInfo[0];
    }

    /// <summary>Результат обработки одного кадра.</summary>
    public class NormalizedFrameInfo
    {
        public int Order { get; init; }
        public string Role { get; init; } = "";

        /// <summary>Получена обработанная картинка (у barcode-типа — нет).</summary>
        public bool HasImage { get; init; }

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

        /// <summary>Текст ошибки по кадру (сервис недоступен и т.п.); null — успех.</summary>
        public string? Error { get; init; }
    }
}