docs: права преподавателя, аудит, CI и итоговые проверки
This commit is contained in:
@@ -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)`), прежний ключ по семестру снимается.
|
||||
|
||||
Reference in New Issue
Block a user