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

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

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

namespace Ban.Sdaid.Icd.Api.Endpoints.Auth.GetUserProfile
{
    /// <summary>Документ-обёртка над endpoint выдачи профиля текущего пользователя.</summary>
    public class DOC_GetUserProfile : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.Auth.GetUserProfileHandler>(),
        };

        public static string _refName = "Endpoint GetUserProfile";

        public string Name => "Endpoint: GetUserProfile";

        public string Description =>
            @"Профиль текущего пользователя для инициализации UI: ФИО, логин и UI-claims (ключ icd/ui). Пользователь определяется по токену. Поведение — GetUserProfileHandler.";

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

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

            `GET /api/Auth/GetUserProfile` — параметров нет: пользователь определяется по токену.
            Требует аутентификации. Фронт зовёт его при старте (после наличия токена), чтобы построить
            меню/действия по правам.

            В `Payload.Claims` отдаются **только** UI-claims (значения ключа `icd/ui`); ключи `cqrs/*`
            фронту не нужны и не передаются. Суперпользователю приходит `*/*`.
            """;

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

            {SdaidCode.OfClass<GetUserProfileEndpoint>()}

            ## Query

            {SdaidCode.OfClass<GetUserProfileQuery>()}

            ## Result

            {SdaidCode.OfClass<GetUserProfileResult>()}

            ## Payload

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

    /// <summary>Endpoint выдачи профиля.</summary>
    public class GetUserProfileEndpoint
    {
        public GetUserProfileQuery? Input { get; set; }
        public GetUserProfileResult? Output { get; set; }
    }

    /// <summary>Запрос профиля (без параметров — пользователь по токену).</summary>
    public class GetUserProfileQuery : BasedQuery
    {
    }

    /// <summary>Результат — профиль в поле Payload.</summary>
    public class GetUserProfileResult : BasedResult
    {
        public UserProfilePayload? Payload { get; init; }
    }

    /// <summary>Профиль текущего пользователя.</summary>
    public class UserProfilePayload
    {
        public Guid UserId { get; init; }

        /// <summary>ФИО пользователя.</summary>
        public string FullName { get; init; } = "";

        /// <summary>Логин.</summary>
        public string Login { get; init; } = "";

        /// <summary>UI-claims (значения ключа icd/ui) — по ним фронт скрывает недоступное.</summary>
        public string[] Claims { get; init; } = new string[0];
    }
}