docs: права преподавателя, аудит, CI и итоговые проверки
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
# 08. План реализации: группы, курсы, преподаватели
|
||||
|
||||
**Статус:** план согласован, этапы 0–5 выполнены. Проверка этапа 6 выполнена
|
||||
(тесты, upgrade миграций, security, deploy-runbook), но этап 6 закрыт не
|
||||
полностью: остаются права преподавателя на запись и CI —
|
||||
см. § 9.1 и [16-stage6-report.md](16-stage6-report.md).
|
||||
**Статус:** план согласован, этапы 0–6 выполнены. Этап 6 закрыт: права
|
||||
преподавателя на запись, аудит и CI добавлены; остаточные риски — § 9.1 и
|
||||
[16-stage6-report.md](16-stage6-report.md).
|
||||
**Основа:** [07-groups-courses.md](07-groups-courses.md).
|
||||
**Дата решений:** 2026-10-23.
|
||||
|
||||
@@ -117,7 +116,7 @@
|
||||
отдельная таблица не нужна.
|
||||
- Для производительности: один агрегирующий запрос/эндпоинт, пакетная выборка
|
||||
комментариев, попыток, защит и публикаций по списку `lab_id`; без N+1.
|
||||
- Аудит скачиваний: этап 6 (журнал `audit_events` или отдельная таблица).
|
||||
- Аудит скачиваний реализован на этапе 6 в `identity.audit_events`.
|
||||
|
||||
### 2.6. Ограничения
|
||||
|
||||
@@ -192,10 +191,14 @@
|
||||
|
||||
### Этап 6. Hardening
|
||||
|
||||
- Полная security-матрица.
|
||||
- Права преподавателя на запись: лабораторные/уровни/варианты, ведомость,
|
||||
привязка групп, авторские материалы курса.
|
||||
- Полная security-матрица и negative-тесты «свой/чужой курс».
|
||||
- Upgrade-тест миграций.
|
||||
- Индексы и пагинация.
|
||||
- Аудит скачиваний и чувствительных действий.
|
||||
- Индексы; пагинация и N+1 — follow-up (§ 9.1).
|
||||
- Аудит скачиваний и чувствительных действий (`identity.audit_events`,
|
||||
`/admin/audit`).
|
||||
- CI merge gate: `test ktlintCheck detekt` на каждом push/MR.
|
||||
- Проверка backup: создание, retention, `verify`, restore на staging.
|
||||
- Документация, deploy/runbook, smoke.
|
||||
|
||||
@@ -205,13 +208,13 @@
|
||||
|
||||
Номера уточняются при реализации, чтобы не конфликтовать с максимумами master
|
||||
(identity V3, **academic V5**, progress V12). Максимумы этой ветки:
|
||||
identity V9, **academic V12**, progress V13 (+V14 при необходимости аудита).
|
||||
identity V10, **academic V12**, progress V13.
|
||||
|
||||
| Сервис | Миграции | Содержание |
|
||||
|---|---|---|
|
||||
| identity | V4–V9 | роли, поля групп, статусы студентов, `membership_history`, `promotion_runs/items`, `accounts.status` |
|
||||
| identity | V4–V10 | роли, поля групп, статусы студентов, `membership_history`, `promotion_runs/items`, `accounts.status`; `V10` — `audit_events` без внешних ключей и индексы по `occurred_at`/`action` |
|
||||
| academic | V6–V12 + post-bootstrap step | курсы, преподаватели, группы курса, `labs.course_id` (nullable), материалы курса/аудитории, частичные индексы, активы; `V10` — уникальный индекс `lower(title)` по курсам; `V11` — backfill `audience='ALL'` для глобальных глав; `V12` — backfill связей `article_assets` из markdown-ссылок; `SET NOT NULL` — post-bootstrap шаг вне Flyway |
|
||||
| progress | V13 (+ V14 при необходимости аудита) | `grade_comments.author_account_id`, `lab_grades.updated_by_account_id`, индекс `lab_grades(lab_id)`; аудит скачиваний — этап 6 |
|
||||
| progress | V13 | `grade_comments.author_account_id`, `lab_grades.updated_by_account_id`, индекс `lab_grades(lab_id)`; аудит реализован в identity `V10` |
|
||||
|
||||
### Переход со старой feature-миграции V10 на V13
|
||||
|
||||
@@ -320,12 +323,12 @@ identity V9, **academic V12**, progress V13 (+V14 при необходимос
|
||||
`/learn/course/{course_no}/...` и аудитории, публичные материалы `ALL`,
|
||||
скрытые материалы для преподавателя, перепроверка статуса web-сессии.
|
||||
Отчёт: [15-stage5-course-materials.md](15-stage5-course-materials.md).
|
||||
- **Этап 6 — проверка выполнена, закрыт не полностью.** Проверены полный
|
||||
прогон тестов/линтеров, upgrade миграций с master-схемы, security-матрица,
|
||||
gateway, видимость активов и deploy-runbook. Отчёт: [16-stage6-report.md](16-stage6-report.md).
|
||||
Не закрыты: права преподавателя на запись, аудит скачиваний и CI. Остальные
|
||||
пункты hardening (индексы, backup/restore, документация, smoke) описаны в
|
||||
отчёте и чек-листе.
|
||||
- **Этап 6 — выполнен.** Права преподавателя на запись (лабораторные,
|
||||
ведомость, группы, материалы), центральный аудит `identity.audit_events`
|
||||
с `/admin/audit`, CI merge gate и полный hardening. Проверены прогон
|
||||
тестов/линтеров (**267**), upgrade миграций с master-схемы (identity
|
||||
`V4–V10`, academic `V6–V12`, progress `V13`), security-матрица, gateway,
|
||||
видимость активов и deploy-runbook. Отчёт: [16-stage6-report.md](16-stage6-report.md).
|
||||
|
||||
### 9.1. Известные пробелы после этапа 6
|
||||
|
||||
@@ -333,27 +336,26 @@ identity V9, **academic V12**, progress V13 (+V14 при необходимос
|
||||
проверяет `article_assets → article → section → chapter`, а `V12`
|
||||
восстанавливает связи из markdown. Файлы без ссылок в статьях остаются
|
||||
публичными; нужна инвентаризация и привязка или удаление.
|
||||
- **Преподаватель — в основном read-only.** Авторство лабораторных/материалов,
|
||||
распределение, оценки, комментарии и защита остаются admin-only в UI/API;
|
||||
ТЗ ожидает преподавательский self-service.
|
||||
- **Имена групп в кабинете преподавателя.** На странице курса показывается
|
||||
UUID группы, batch-разрешения имён нет.
|
||||
- **Аудит.** Есть история членства и журнал повышения, но нет audit-log
|
||||
скачиваний, просмотров профилей, назначений и публикаций.
|
||||
- **Импорт.** Старый формат не поддерживается; ведущие нули номера группы
|
||||
нормализуются (`01` → `1`).
|
||||
- **JWT 30 дней.** Web перепроверяет статус каждые 45 секунд, но прямой API
|
||||
с уже выданным токеном живёт до истечения.
|
||||
- **CI отсутствует.** Гейт — локальный `./gradlew test ktlintCheck detekt`;
|
||||
автоматического pipeline и upgrade-теста в CI нет.
|
||||
с уже выданным токеном живёт до истечения; нужны короткий TTL + refresh
|
||||
или revocation.
|
||||
- **Пагинация и N+1.** Журнал аудита ограничен `limit` без offset/keyset;
|
||||
часть списков групп, материалов и ведомости отдаётся целиком; на больших
|
||||
объёмах нужны пагинация и пакетные выборки.
|
||||
|
||||
## 10. Definition of Done
|
||||
|
||||
- Все решения раздела 1 реализованы.
|
||||
- Текущие лабы и материалы работают в курсе C.
|
||||
- Преподаватель видит только свои курсы и профили своих студентов.
|
||||
- Преподаватель видит только свои курсы и профили своих студентов, пишет
|
||||
в лабы/ведомость/группы/материалы только своего курса.
|
||||
- Профиль показывает статистику, комментарии и все попытки; файлы скачиваются.
|
||||
- Повышение, академотпуск, выпуск и архив работают по ТЗ.
|
||||
- Аудит чувствительных действий пишется в `identity.audit_events` и доступен
|
||||
админу на `/admin/audit`.
|
||||
- Security-матрица и миграционный upgrade-тест зелёные.
|
||||
- CI на каждом push/MR прогоняет `test ktlintCheck detekt`.
|
||||
- Backup перед деплоем обязателен; restore проверен на staging.
|
||||
- Документация, deploy/runbook и smoke обновлены.
|
||||
|
||||
Reference in New Issue
Block a user