⟨/⟩ 50_Domain/Access/Function.cs

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

using System;
using System.Collections.Generic;
using Ban.Sdaid.Notation.Documents;

namespace Ban.Sdaid.Icd.Domain.Access
{
    /// <summary>Функция — человекочитаемая единица полномочий; её фактические права — набор claim-значений.</summary>
    [DomainEntity]
    public class Function
    {
        /// <summary>Идентификатор функции.</summary>
        public Guid Id { get; init; }

        /// <summary>Название функции (напр. «Ввод и проверка», «Только просмотр», «Управление доступом»).</summary>
        public string Name { get; init; }

        /// <summary>Claim-значения, составляющие фактические полномочия функции.</summary>
        [Relation(Kind = RelationKind.Composition)]
        public IReadOnlyList<FunctionClaimValue> ClaimValues { get; init; }
    }

    /// <summary>Claim-значение функции: конкретное значение под конкретным ключом claim.</summary>
    [DomainEntity]
    public class FunctionClaimValue
    {
        /// <summary>Идентификатор.</summary>
        public Guid Id { get; init; }

        /// <summary>Ключ claim (из справочника): что именно разрешается.</summary>
        [Relation]
        public Claim Claim { get; init; }

        /// <summary>
        /// Значение под ключом: имя класса команды/запроса, строка вида «подсистема/ресурс/действие»
        /// или «*» (всё). Смысл значения определяется ключом claim.
        /// </summary>
        public string Value { get; init; }
    }

    /// <summary>Описание доменной сущности <see cref="Function"/>.</summary>
    public class FunctionSpec : IDomainEntityDocument
    {
        public Type Entity => typeof(Function);

        public string Name => "Функция";

        public string Description =>
            @"Человекочитаемая единица полномочий (напр. «Ввод и проверка»). Раскрывается в набор claim-значений — атомарных разрешений на команды, запросы и UI-элементы.";

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

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

            Функция — то, чем оперирует администратор, думая о доступе: «ввод и проверка», «только
            просмотр», «управление доступом». За понятным названием стоит набор атомов —
            claim-значений, которые и проверяются системой.

            Функции **сеет разработчик** (в инфраструктуре, вместе с их claim-значениями): состав
            разрешений — следствие устройства команд/запросов и экранов, а не предмет ручной настройки
            администратором. Администратор комбинирует готовые функции в группы.
            """;

        public static string S2_Invariants = """
            ## Инварианты

            - Полномочия функции — её набор claim-значений; вне этого набора функция ничего не разрешает.
            - Функции и их claim-значения задаются посевом (разработчик), а не пользовательским вводом.
            - Значение claim трактуется по его ключу: для `icd/cqrs/command|query` — имя класса или «*»;
              для `icd/ui` — «подсистема/ресурс/действие» или «*».
            """;

        public static string S99_Related = $"""
            ## Связанные артефакты

            - {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_011_AbacAuthorization)} — модель доступа и реестр ключей claim.
            - {nameof(Ban.Sdaid.Icd.Arch.Tech.Angular.ADR_UI_011_Claims)} — как UI-claims функции проявляются на фронте.
            """;
    }

    /// <summary>Описание доменной сущности <see cref="FunctionClaimValue"/>.</summary>
    public class FunctionClaimValueSpec : IDomainEntityDocument
    {
        public Type Entity => typeof(FunctionClaimValue);

        public string Name => "Claim-значение функции";

        public string Description =>
            @"Атом полномочий: пара «ключ claim + значение». Именно эти пары складываются в контекст пользователя и проверяются на командах, запросах и UI-элементах.";

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

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

            Самый нижний уровень модели: конкретное разрешение. Ключ говорит, **что за разрешение**
            (команда, запрос, UI-элемент), значение — **на что именно** (имя класса, путь UI-элемента
            или «*»).

            Контекст пользователя — это объединение всех claim-значений всех функций всех его групп,
            сгруппированных по ключу. Проверка права = поиск в этом объединении значения (или «*») под
            нужным ключом.
            """;

        public static string S2_Invariants = """
            ## Инварианты

            - Пара (функция, ключ, значение) уникальна в пределах функции.
            - «*» под ключом означает «все значения этого ключа» (напр. все команды).
            """;

        public static string S99_Related = $"""
            ## Связанные артефакты

            - {nameof(Ban.Sdaid.Icd.Arch.Tech.CSharp.ADR_SRV_006_AuthImplementation)} — сборка контекста и проверка права.
            """;
    }
}