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)} — сборка контекста и проверка права.
""";
}
}