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

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

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

namespace Ban.Sdaid.Icd.Api.Endpoints.InputPackets.DeleteInputPacket
{
    /// <summary>Документ-обёртка над endpoint удаления пакета — мягкое и жёсткое.</summary>
    public class DOC_DeleteInputPacket : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.InputPackets.DeleteInputPacketHandler>(),
            Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.InputPackets.ForceDeleteInputPacketHandler>(),
        };

        public static string _refName = "Endpoint DeleteInputPacket";

        public string Name => "Endpoint: DeleteInputPacket";

        public string Description =>
            @"Удаление пакета из очереди двух видов: мягкое (пометка, скрытие, обратимо) и жёсткое (окончательное, с файлами). Поведение — DeleteInputPacketHandler / ForceDeleteInputPacketHandler.";

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

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

            - `DELETE /api/InputPacket/{id}` — **мягкое** удаление: пометка `Deleted`, пакет скрывается из очереди;
              запись и файлы сохраняются (обратимо). Оператору доступно по умолчанию.
            - `DELETE /api/InputPacket/{id}/force` — **жёсткое** удаление: окончательно удаляет запись (каскадом —
              кадры и идентификаторы) и файлы кадров из хранилища (необратимо). Доступно только по праву на
              эту команду (claim; модель доступа — ADR-011).

            Параметр `id` — в пути, тела запроса нет. Ответ обоих — единая обёртка с `Payload` (вид удаления в `Mode`).
            `404`, если пакет не найден.
            """;

        public static string Body = $"""
            ## Command (мягкое)

            {SdaidCode.OfClass<DeleteInputPacketCommand>()}

            ## Command (жёсткое)

            {SdaidCode.OfClass<ForceDeleteInputPacketCommand>()}

            ## Result

            {SdaidCode.OfClass<DeletePacketResult>()}

            ## Payload

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

    /// <summary>Команда мягкого удаления пакета.</summary>
    public class DeleteInputPacketCommand : BasedCommand
    {
        /// <summary>Идентификатор пакета.</summary>
        public Guid Id { get; init; }
    }

    /// <summary>Команда жёсткого (окончательного) удаления пакета.</summary>
    public class ForceDeleteInputPacketCommand : BasedCommand
    {
        /// <summary>Идентификатор пакета.</summary>
        public Guid Id { get; init; }
    }

    /// <summary>Результат удаления (общий для мягкого и жёсткого).</summary>
    public class DeletePacketResult : BasedResult
    {
        /// <summary>Сведения об удалённом пакете; null при ошибке (например, пакет не найден).</summary>
        public DeletedPacketPayload? Payload { get; init; }
    }

    /// <summary>Удалённый пакет: идентификатор, номер и вид удаления.</summary>
    public class DeletedPacketPayload
    {
        public Guid Id { get; init; }
        public string Number { get; init; } = "";

        /// <summary>Вид удаления: `soft` (мягкое) или `force` (жёсткое).</summary>
        public string Mode { get; init; } = "";
    }
}