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
{
}
}