⟨/⟩ 50_Domain/Access/Group.cs

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

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 → функции → группы).
            """;
    }
}