HTTP API
Авторизация
- Cookie-сессия:
session (Flask) + UserSession в БД
- Проверка:
@login_required (302 на /login) или @require_role([...]) (403)
- OAuth2: Gitea →
/auth/callback
Публичные роуты (без cookie)
| Метод |
Путь |
Ответ |
| GET |
/healthz |
JSON {"status":"ok","db":"ok","llm":"disabled"} |
| GET |
/ |
HTML — главная |
| GET |
/schedule |
HTML — расписание |
| GET |
/schedule/export.ics |
text/calendar — ICS |
| POST |
/api/assistant |
JSON {"reply":"...","source":"regex"} |
| GET |
/api/public-status |
JSON {"status":"free","delay_minutes":0,"message":null} |
| GET |
/feed |
HTML |
| GET |
/projects |
HTML |
| GET |
/workshops |
HTML |
| GET |
/login, /register, /forgot_password |
HTML |
Auth
| Метод |
Путь |
Форма |
Ответ |
| POST |
/register |
username, email, password, full_name, organization |
200 (HTML) |
| POST |
/login |
username, password |
302 → /dashboard |
| GET |
/login/gitea |
— |
302 на Gitea OAuth |
| GET |
/auth/callback |
?code=... |
302 → /dashboard или /onboarding |
| GET |
/logout |
— |
302 → / |
| POST |
/forgot_password |
email |
200 (HTML) |
| POST |
/reset_password/<token> |
password |
302 → /login |
| GET |
/sessions |
— |
HTML |
| POST |
/sessions/logout_all |
— |
302 |
| GET |
/profile |
— |
HTML |
| POST |
/subscribe/toggle |
action, notify_status, notify_events, next |
302 |
| GET |
/unsubscribe/<token> |
— |
HTML (confirm) |
| POST |
/unsubscribe/<token> |
— |
HTML (done) |
Расписание
| Метод |
Путь |
Права |
| GET |
/admin/schedule |
admin/professor |
| POST |
/admin/schedule/status |
admin/professor |
| POST |
/admin/schedule/event/add |
admin/professor |
| GET/POST |
/admin/schedule/event/<id>/edit |
admin/professor |
| POST |
/admin/schedule/event/<id>/delete |
admin/professor |
| POST |
/admin/schedule/event/cancel_nearest |
admin/professor |
| GET/POST |
/admin/schedule/import |
admin/professor |
Форма события: title, event_type, start_time, end_time, location, description, audience, reason, status, is_public
Проекты
| Метод |
Путь |
Права |
| POST |
/projects/new |
admin/professor/lead |
| GET |
/projects/<id> |
по видимости |
| GET |
/projects/<id>/board |
по видимости |
| GET |
/projects/<id>/gitea-stats |
по видимости |
| POST |
/projects/<id>/edit |
can_manage |
| POST |
/projects/<id>/delete |
owner/admin |
| POST |
/projects/<id>/members/add |
can_manage |
| POST |
/projects/<id>/members/<uid>/permissions |
can_manage |
| POST |
/projects/<id>/members/<uid>/remove |
can_manage |
| POST |
/projects/<id>/posts/new |
can_post_feed |
| POST |
/projects/<id>/posts/<pid>/edit |
can_edit_* |
| POST |
/projects/<id>/posts/<pid>/delete |
can_edit_* |
| POST |
/projects/<id>/tasks/new |
can_edit |
| GET/POST |
/projects/<id>/tasks/<tid>/edit |
can_edit |
| POST |
/projects/<id>/tasks/<tid>/delete |
can_manage |
| POST |
/projects/<id>/tasks/<tid>/move |
can_edit (JSON) |
| POST |
/projects/<id>/files/upload |
can_upload |
| POST |
/projects/<id>/subscribe |
logged in |
JSON для task move: {"status":"in_progress","position":2}
Мастер-классы
| Метод |
Путь |
Права |
| GET/POST |
/workshops/new |
admin |
| GET |
/workshops/<id> |
по видимости |
| GET/POST |
/workshops/<id>/edit |
can_manage |
| POST |
/workshops/<id>/delete |
can_delete_workshop |
| POST |
/workshops/<id>/assistants/add |
lead/admin |
| POST |
/workshops/<id>/assistants/<uid>/remove |
lead/admin |
| POST |
/workshops/<id>/sessions/add |
can_manage |
| POST |
/workshops/<id>/sessions/<sid>/delete |
can_manage |
| POST |
/workshops/<id>/materials/add |
can_manage |
| POST |
/workshops/<id>/materials/<mid>/delete |
can_manage |
| POST |
/workshops/<id>/posts/new |
can_post |
| POST |
/workshops/<id>/posts/<pid>/edit |
can_manage |
| POST |
/workshops/<id>/posts/<pid>/delete |
can_manage |
| POST |
/workshops/<id>/register |
logged in |
| POST |
/workshops/<id>/unregister |
logged in |
| POST |
/workshops/<id>/attendance/<reg_id> |
can_manage |
| POST |
/workshops/<id>/subscribe |
logged in |
Файлы v2.0
| Метод |
Путь |
Права |
| GET |
/files |
logged in |
| POST |
/files/space/new |
admin/professor/lead |
| GET |
/files/space/<id> |
can_view |
| GET/POST |
/files/space/<id>/edit |
can_manage |
| POST |
/files/space/<id>/delete |
owner/admin |
| POST |
/files/folder/new |
can_upload |
| GET |
/files/folder/<id> |
can_view |
| POST |
/files/folder/<id>/delete |
can_delete |
| POST |
/files/upload |
can_upload |
| GET |
/files/download/<id> |
can_download |
| GET |
/files/preview/<id> |
can_download |
| GET/POST |
/files/<id>/edit |
can_edit |
| POST |
/files/<id>/delete |
can_delete |
| GET |
/files/<id>/history |
can_view |
| POST |
/files/<id>/new_version |
can_edit |
| GET |
/files/<id>/version/<vid>/download |
can_download |
| POST |
/files/<id>/revert/<vid> |
can_edit |
| GET/POST |
/files/<id>/move |
can_edit |
| GET |
/files/search?q=&space_id= |
logged in |
| GET |
/files/space/<id>/acl |
can_manage |
| POST |
/files/space/<id>/acl/add |
can_manage |
| POST |
/files/space/<id>/acl/<aid>/remove |
can_manage |
| GET |
/files/folder/<id>/acl |
can_manage |
| POST |
/files/folder/<id>/acl/add |
can_manage |
| POST |
/files/folder/<id>/acl/<aid>/save |
can_manage |
| POST |
/files/folder/<id>/acl/<aid>/remove |
can_manage |
Уведомления
| Метод |
Путь |
Ответ |
| GET |
/api/notifications |
JSON {items:[], unread:N} |
| GET |
/api/notifications/count |
JSON {unread:N} |
| POST |
/api/notifications/<id>/read |
JSON {ok:true} |
| POST |
/api/notifications/read-all |
JSON {ok:true} |
| GET |
/notifications |
HTML |
Онбординг
| Метод |
Путь |
Тело |
| GET |
/onboarding |
— |
| POST |
/onboarding/mark |
JSON {"key":"visited_schedule","value":true} |
| POST |
/onboarding/skip |
— |
| POST |
/onboarding/complete |
— |
Дашборд
| Метод |
Путь |
Права |
| GET |
/dashboard |
logged in |
Админка
| Метод |
Путь |
Права |
| GET |
/admin/users?q= |
admin |
| POST |
/admin/users/<id>/role |
admin |
| POST |
/admin/users/<id>/toggle_active |
admin |
| POST |
/admin/users/<id>/delete |
admin |
Вебхук
| Метод |
Путь |
Заголовки |
| POST |
/webhooks/gitea |
X-Gitea-Event, X-Gitea-Signature (HMAC-SHA256 hex) |
Тело: JSON от Gitea.
Ответ: {"ok":true,"event":"push","repo":"...","cache_invalidated_keys":N,"linked_projects":[...]}
Проверка подписи: если GITEA_WEBHOOK_SECRET пустой — любой запрос проходит. Если задан — HMAC-SHA256 должен совпасть. Иначе 401.