Endpoint: NormalizePacket

API-контракт Версия: 0.1 draft

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

⟨/⟩ Исходник

1. Транспорт

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

2. Command

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

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

3. Result

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

4. Payload

/// <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];
}

5. FrameInfo

/// <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; }
}