using System;
using System.Collections.Generic;
using Ban.Sdaid.Notation.Documents;
namespace Ban.Sdaid.Icd.Domain.Access
{
/// <summary>Группа полномочий — набор функций, назначаемый пользователям.</summary>
[DomainEntity]
public class Group
{
/// <summary>Идентификатор группы.</summary>
public Guid Id { get; init; }
/// <summary>Название группы (человекочитаемое, напр. «Хранители», «Администраторы»).</summary>
public string Name { get; init; }
/// <summary>Функции, входящие в группу.</summary>
[Relation(Kind = RelationKind.Composition)]
public IReadOnlyList<GroupFunction> Functions { get; init; }
}
/// <summary>Вхождение функции в группу (связь «группа — функция»).</summary>
[DomainEntity]
public class GroupFunction
{
/// <summary>Идентификатор вхождения.</summary>
public Guid Id { get; init; }
/// <summary>Функция, входящая в группу.</summary>
[Relation]
public Function Function { get; init; }
}
/// <summary>Описание доменной сущности <see cref="Group"/>.</summary>
public class GroupSpec : IDomainEntityDocument
{
public Type Entity => typeof(Group);
public string Name => "Группа полномочий";
public string Description =>
@"Набор функций, назначаемый пользователям. Средний уровень модели доступа: администратор собирает группу из функций и выдаёт её пользователям.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string S1_Purpose = """
## Назначение
Группа — единица назначения прав пользователю. Администратор не раздаёт функции поштучно:
он собирает их в группу («Хранители», «Администраторы») и назначает группу пользователям.
Пользователь получает объединение claim-значений всех функций всех своих групп.
Группы глобальны: одна и та же группа означает один и тот же набор прав для любого
пользователя (периметр, который сужал бы область действия, не вводится — см. ADR-011).
""";
public static string S2_Invariants = """
## Инварианты
- Права группы — объединение claim-значений входящих в неё функций.
- Изменение состава группы меняет права всех её участников; их кэш контекста
инвалидируется (см. ADR-SRV-006).
""";
public static string S99_Related = $"""
## Связанные артефакты
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_011_AbacAuthorization)} — модель доступа (claims → функции → группы).
""";
}
}