⟨/⟩ 55_Backend/Handlers/InputPackets/SubmitInputPacketHandler.cs

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

using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Endpoints.InputPackets.SubmitInputPacket;
using Ban.Sdaid.Icd.Domain.Capture;
using Ban.Sdaid.Icd.Arch.Adr;

namespace Ban.Sdaid.Icd.Backend.Handlers.InputPackets
{
    /// <summary>Handler постановки пакета ввода в очередь.</summary>
    public class SubmitInputPacketHandler : IHandlerDocument, IFolder<BackendFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Domain.BC_Icd>(),
            Rel.Uses<InputPacketSpec>(),
            Rel.Uses<DOC_SubmitInputPacket>(),
            Rel.Uses<ADR_002_PacketIdentityAndFileKeys>(),
        };

        public static string _refName = "Handler SubmitInputPacket";

        public string Name => "Handler: SubmitInputPacket";

        public string Description =>
            @"Что произойдёт при вызове endpoint SubmitInputPacket: собранный пакет получает идентичность (номер и ключи хранения кадров) и становится в очередь обработки.";

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

        public static string Purpose = $"""
            ## Назначение

            Канонический сценарий обработки {SdaidAnchors.RefTo<DOC_SubmitInputPacket>()}
            (`{nameof(SubmitInputPacketCommand)}`). Создаёт {SdaidAnchors.RefTo<InputPacketSpec>()} и ставит его
            в очередь обработки. Идентичность (номер, ключи файлов) возникает **в момент постановки** —
            см. {SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()}.
            """;

        public static string Scenario = $"""
            ## Сценарий вызова

            1. **Валидация:** в пакете есть хотя бы один кадр (`{nameof(SubmitInputPacketCommand.Frames)}`).
               Пусто — ошибка `Validation`, пакет не создаётся.
            2. **Номер:** присвоить пакету номер вида `П-ГГГГММДД-NNN` — сквозная нумерация в пределах дня
               ({SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()}).
            3. **Кадры:** для каждого кадра (по порядку) назначить ключ хранения `<номер>/<NN>.<расширение>`
               (по порядковому номеру, без роли — роль определяется при обработке) и сохранить содержимое в
               файловом хранилище. Содержимое — из части `files` (по `{nameof(SubmitFrameItem.FileIndex)}`)
               либо скачанное по `{nameof(SubmitFrameItem.Url)}` для кадра-ссылки.
            4. **Сохранение:** пакет с кадрами записывается в БД; состояние — `Queued` (производное, отдельным
               полем не хранится). Роли кадров и идентификаторы на вводе не заполняются — извлекаются при обработке.
            5. **Ответ:** `{nameof(SubmitInputPacketResult)}` с `{nameof(SubmittedPacketPayload)}` —
               номер, время постановки и число кадров (для списка «сдано за смену»).
            """;

        public static string Errors = $"""
            ## Ошибки и альтернативы

            | Ситуация | Поведение |
            |---|---|
            | Ни одного кадра | Отказ с ошибкой `Validation` — пакет не может быть пустым |
            | Кадр-ссылка недоступна по `{nameof(SubmitFrameItem.Url)}` | Отказ: содержимое кадра получить не удалось |
            """;
    }
}