using Ban.Sdaid.Notation.Documents;
namespace Ban.Sdaid.Icd.Epics.Authentication
{
/// <summary>Эпик «Аутентификация и доступ» — вход, проверка прав на каждой операции, выход.</summary>
public class EPIC_Authentication : IEpicDocument
{
public static string _refName = "эпик «Аутентификация и доступ»";
public string Name => "Аутентификация и доступ";
public string Description =>
@"Контроль доступа к Сервису: вход по логину и паролю с выдачей JWT, проверка полномочий (ABAC) на каждой команде и запросе, скрытие недоступного на UI и настоящий выход с отзывом токена. Точка входа в модель доступа ADR-011.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string S1_Goal = """
## Цель
Пускать в Сервис только своих и давать каждому ровно то, что ему разрешено. Пользователь входит
по логину и паролю, получает сессию и на каждый защищённый вызов предъявляет полномочия; backend
проверяет их у каждой команды/запроса, UI прячет недоступное, выход прекращает сессию сразу.
Роли из видения (хранитель, администратор) выражаются наборами групп и функций, а не отдельным
полем: доступ — следствие членства, а не звания.
""";
public static string S2_Actors = """
## Акторы
| Актор | Роль в эпике |
|---|---|
| Пользователь | входит, работает в пределах своих прав, выходит |
| Администратор | ведёт пользователей, группы и их назначение (в объёме доступа) |
| Разработчик | сеет функции и их claim-значения (состав прав следует из устройства команд/запросов и экранов) |
| Сервис | выдаёт и валидирует токен, собирает контекст, проверяет права, отзывает токен |
""";
public static string S3_Scope = """
## Границы
**Входит:** вход по паролю (JWT + jti), профиль с UI-claims, выход с отзывом токена; проверка
прав на каждой команде/запросе (базовый хендлер); скрытие недоступных разделов и действий на UI;
экраны входа/выхода/отказа; заполнение полей истории пакета реальным пользователем.
**Не входит:** периметр (фильтрация данных по орг-структуре — вне охвата, ADR-011); OAuth2/OIDC и
refresh-токен; хеширование пароля (на dev — открытый текст); полноценное администрирование
пользователей/групп/функций на UI (отдельная работа).
Требования: доступность действий проверки и очереди «по правам»
(«Верификация и корректировка данных», «Очередь обработки пакетов»); закрывает открытый вопрос
видения о составе ролей и прав.
""";
public static string S4_AcceptanceCriteria = """
## Критерии приёмки
1. Неаутентифицированный пользователь при обращении к защищённому маршруту попадает на экран входа.
2. После успешного входа и перезагрузки страницы (F5) пользователь остаётся в системе.
3. Вход выдаёт токен; выход его отзывает — повторный запрос с тем же токеном отклоняется (401),
даже если срок ещё не истёк.
4. Команда или запрос без нужного claim отклоняется (403); соответствующий раздел/действие на UI
не показывается.
5. После входа UI показывает только разрешённые разделы и действия — по UI-claims из профиля.
6. Ответ 401 уводит на вход с уведомлением; ответ 403 — на экран отказа, сессия сохраняется.
7. Поля истории пакета («кто ввёл», «кто взял в работу») заполняются реальным пользователем,
а не заглушкой.
8. Вход, выход и получение профиля работают без предъявления прав; всё остальное — только с ними.
""";
public static string S5_OpenQuestions = """
## Открытые вопросы
| № | Вопрос |
|---|---|
| OQ-AU-1 | Хранение пароля: сейчас открытый текст (dev); переход на хеш + соль до продакшна |
| OQ-AU-2 | Refresh-токен и время жизни сессии; поведение при истечении посреди работы |
| OQ-AU-3 | Администрирование доступа на UI (CRUD пользователей/групп/функций) — отдельным эпиком |
| OQ-AU-4 | Состав ролей-пресетов: какие функции входят в «хранителя» и «администратора» при посеве |
| OQ-AU-5 | Инвалидация кэша контекста между несколькими инстансами (шина/Outbox) |
| OQ-AU-6 | Синхронизация выхода между вкладками браузера |
""";
public static string S99_Related = $"""
## Связанные артефакты
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_011_AbacAuthorization)} — модель доступа (claims → функции → группы)
- {nameof(Ban.Sdaid.Icd.Arch.Tech.CSharp.ADR_SRV_006_AuthImplementation)} — backend: токен, энфорс, контекст, отзыв
- {nameof(Ban.Sdaid.Icd.Arch.Tech.Angular.ADR_UI_010_Auth)}, {nameof(Ban.Sdaid.Icd.Arch.Tech.Angular.ADR_UI_011_Claims)} — фронт: сессия, гарды, claims
- {nameof(Ban.Sdaid.Icd.Api.Endpoints.Auth.LoginByPassword.DOC_LoginByPassword)}, {nameof(Ban.Sdaid.Icd.Api.Endpoints.Auth.Logout.DOC_Logout)}, {nameof(Ban.Sdaid.Icd.Api.Endpoints.Auth.GetUserProfile.DOC_GetUserProfile)} — контракты
- {nameof(Ban.Sdaid.Icd.Ui.Pages.LoginPage)}, {nameof(Ban.Sdaid.Icd.Ui.Pages.LogoutPage)}, {nameof(Ban.Sdaid.Icd.Ui.Pages.AccessDeniedPage)} — экраны
- {nameof(Ban.Sdaid.Icd.Vision.IcdVision)} — роли (хранитель, администратор) и открытый вопрос доступа
""";
}
}