Endpoint: SubmitInputPacket

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

Постановка собранного пакета ввода в очередь: произвольный набор кадров одной ИК, без плана. Поведение — SubmitInputPacketHandler.

⟨/⟩ Исходник

1. Транспорт

POST /api/InputPacket, multipart/form-data:

Кадр-ссылка (Source = Url) содержимого не несёт — сервер скачивает изображение по Url сам.

2. Endpoint

/// <summary>Endpoint постановки пакета в очередь.</summary>
public class SubmitInputPacketEndpoint
{
    public SubmitInputPacketCommand? Input { get; set; }
    public SubmitInputPacketResult? Output { get; set; }
}

3. Command (часть payload)

/// <summary>Метаданные сдаваемого пакета (JSON-часть multipart).</summary>
public class SubmitInputPacketCommand : BasedCommand
{
    /// <summary>Кадры пакета (минимум один — пакет не может быть пустым). Роль на вводе не задаётся.</summary>
    public SubmitFrameItem[] Frames { get; init; } = new SubmitFrameItem[0];
}

4. FrameItem

/// <summary>Описание одного кадра: метаданные + привязка к содержимому (файл или URL).</summary>
public class SubmitFrameItem
{
    /// <summary>Способ получения: камера, диск, ссылка.</summary>
    [Relation]
    public ImageSource Source { get; init; }

    /// <summary>Порядок кадра в пакете.</summary>
    public int Order { get; init; }

    /// <summary>Исходное имя файла (для диска/ссылки).</summary>
    public string? OriginalFileName { get; init; }

    /// <summary>Момент получения кадра.</summary>
    public DateTime CapturedAt { get; init; }

    /// <summary>Индекс файла в части `files` (для источников камера/диск).</summary>
    public int? FileIndex { get; init; }

    /// <summary>URL изображения (для источника «ссылка»); сервер скачивает содержимое.</summary>
    public string? Url { get; init; }
}

5. Result

/// <summary>Результат постановки в очередь.</summary>
public class SubmitInputPacketResult : BasedResult
{
    /// <summary>Сведения о сданном пакете; null при ошибке.</summary>
    public SubmittedPacketPayload? Payload { get; init; }
}

6. Payload

/// <summary>Сданный пакет — номер, время и состав (для списка «сдано за смену»).</summary>
public class SubmittedPacketPayload
{
    public Guid Id { get; init; }

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

    public DateTime QueuedAt { get; init; }
    public int FramesCount { get; init; }
}