docs: права преподавателя, аудит, CI и итоговые проверки

This commit is contained in:
2026-10-27 20:39:37 +03:00
parent d7b886513f
commit 25a3dbd0fb
12 changed files with 204 additions and 109 deletions

View File

@@ -205,6 +205,30 @@ INSERT INTO membership_history(student_id, to_group_id, action, at)
SELECT student_id, group_id, 'ENROLL', enrolled_at FROM enrollments;
```
**V8–V9 — история членства и статусы аккаунтов** реализованы на этапе 1
(`membership_history`, `accounts.status`).
**V10 — журнал аудита (добавлен на этапе 6, `V10__audit_events.sql`)**
```sql
CREATE TABLE identity.audit_events (
id uuid PRIMARY KEY,
occurred_at timestamptz NOT NULL DEFAULT now(),
actor_account_id uuid,
actor_login varchar(100),
action varchar(64) NOT NULL,
entity_type varchar(64) NOT NULL,
entity_id varchar(128),
course_id uuid,
student_id uuid,
details text NOT NULL DEFAULT ''
);
CREATE INDEX audit_events_occurred_idx ON identity.audit_events (occurred_at DESC);
CREATE INDEX audit_events_action_idx ON identity.audit_events (action);
```
Внешних ключей нет: событие должно переживать удаление субъекта. Запись идёт
из сервисов через `POST /api/v1/internal/audit` (`X-Internal-Token`), чтение —
`GET /api/v1/audit` и `/admin/audit` только для админа.
### academic
**V6 — курс (пересоздание)**
@@ -365,7 +389,17 @@ V13 идемпотентна: если старая feature-миграция V10
- скачивание файлов не даёт доступа к чужим сдачам;
- профиль не заменяет ведомость: оценки по-прежнему выставляются в ведомости;
- старые комментарии без автора отображаются как «автор не указан»;
- аудит скачиваний — этап 6.
- аудит скачиваний реализован на этапе 6 (см. §5.2).
### 5.2. Аудит (реализовано на этапе 6)
Чувствительные действия пишутся в `identity.audit_events` (`V10`): создание и
сброс преподавателя, жизненный цикл и архив групп, повышение и удаление,
действия с курсами/группами/материалами/лабораториями, просмотр профиля,
скачивания, оценки/публикация, раздача вариантов и защиты. Админ смотрит
журнал на `/admin/audit` с фильтром по действию; время отображается в МСК.
`membership_history` и `promotion_runs/items` остаются доменной историей и
дополняют общий журнал.
---
@@ -465,7 +499,9 @@ V13 идемпотентна: если старая feature-миграция V10
старые ссылки на текущие материалы не поддерживаются.
7. Миграция существующих лаб/материалов в курс C; «общих» лаб нет.
8. Немедленный отзыв доступа (преподаватель/группа/публикация материала).
9. Аудит-лог: переводы, академ, повышение, назначения преподавателей, публикации, архив/удаление.
9. Аудит-лог: переводы, академ, повышение, назначения преподавателей, публикации,
архив/удаление — реализован в `identity.audit_events` (`V10`), просмотр
`/admin/audit`.
10. Производительность: индексы `course_id`/`group_id`, пагинация материалов и групп.
11. Бэкфилл `enrollment_year` для существующих групп — приблизительный, требует подтверждения админом.
12. Лабы: уникальность номера — в рамках курса (`(number, course_id)`), прежний ключ по семестру снимается.