⟨/⟩ 45_Api/Endpoints/Auth/Logout.cs

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

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

namespace Ban.Sdaid.Icd.Api.Endpoints.Auth.Logout
{
    /// <summary>Документ-обёртка над endpoint выхода (отзыва текущего токена).</summary>
    public class DOC_Logout : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.Auth.LogoutHandler>(),
        };

        public static string _refName = "Endpoint Logout";

        public string Name => "Endpoint: Logout";

        public string Description =>
            @"Выход: текущий токен отзывается (попадает в чёрный список), контекст пользователя вытесняется из кэша. Поведение — LogoutHandler.";

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

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

            `POST /api/Auth/Logout` — тела нет: `jti` берётся из токена в заголовке `Authorization`.
            Требует аутентификации. Семантика — в HTTP-статусе; полезной нагрузки нет.

            После выхода запрос с тем же токеном отклоняется (`401`), даже если срок ещё не истёк.
            """;

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

            {SdaidCode.OfClass<LogoutEndpoint>()}

            ## Command

            {SdaidCode.OfClass<LogoutCommand>()}

            ## Result

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

    /// <summary>Endpoint выхода.</summary>
    public class LogoutEndpoint
    {
        public LogoutCommand? Input { get; set; }
        public LogoutResult? Output { get; set; }
    }

    /// <summary>Команда выхода (пустая — токен берётся из заголовка).</summary>
    public class LogoutCommand : BasedCommand
    {
    }

    /// <summary>Результат выхода (без полезной нагрузки).</summary>
    public class LogoutResult : BasedResult
    {
    }
}