HTTP API
Оба приложения — FastAPI на localhost, каждое говорит только со своей SPA. Общего сервера и межприложенческого API нет: генератор и раннер связаны форматом пака.
Раннер студента
Порт 8766.
Практика и задания
| Метод | Путь | Отдаёт |
|---|---|---|
GET | /api/pack | описание базы, DDL, таблицы, число заданий, сколько решено |
GET | /api/tasks | задания с формулировками, темами, сложностью, открытыми примерами, статусом и текущим решением |
GET /api/tasks отдаёт и public_checks — открытые проверки задания. Скрытые в ответ не попадают.
Работа с базой
| Метод | Путь | Делает |
|---|---|---|
POST | /api/query | выполняет SQL в живой базе, возвращает колонки, строки и время |
POST | /api/load_example | наливает в живую базу открытый вариант данных |
POST | /api/reset | возвращает живую базу к пустой схеме |
Проверка
| Метод | Путь | Делает |
|---|---|---|
POST | /api/tasks/{id}/check | прогоняет решение по всем вариантам в проверочной базе, сохраняет solutions/<id>.sql |
GET | /api/tasks/{id}/variant/{variant} | данные варианта и ожидаемый результат |
POST | /api/tasks/{id}/variant/{variant} | то же плюс результат решения студента на этих данных — для построчного сравнения |
Эти два эндпоинта отдают ожидаемый результат только для открытых примеров и для вариантов, на которых решение студента уже упало. Всё остальное остаётся в закрытой части пака и наружу не уходит.
Черновики
| Метод | Путь | Делает |
|---|---|---|
GET POST | /api/history/{id} | история запросов по заданию; кольцо из ста записей |
GET PUT | /api/bookmarks | закладки |
Хранятся в solutions/.history/, который раннер дописывает в solutions/.gitignore: черновики не попадают в сдачу.
Оформление
| Метод | Путь | Отдаёт |
|---|---|---|
GET | /api/theme | разобранную тему: brand, scheme, fonts, tokens, hasCss |
GET | /theme/theme.css | содержимое theme.css как есть |
GET | /theme/assets/{path} | файлы темы; расширения по белому списку |
Значения токенов подставляются в <head> при отдаче index.html, поэтому приложение стартует уже в цветах курса. Параметр ?theme=off отключает тему.
Заголовки
Content-Security-Policy: default-src 'self'; img-src 'self' data:; font-src 'self';
style-src 'self' 'unsafe-inline'; script-src 'self'
X-Content-Type-Options: nosniff
unsafe-inline для стилей необходим: редактор кода вставляет свои <style> в рантайме, и токены темы приходят инлайн-блоком. Внешние запросы при этом запрещены — образ автономен.
Студия автора
Порт 8765. Доступна только с локального адреса.
| Метод | Путь | Делает |
|---|---|---|
GET | /api/practice | состояние всех трёх шагов и хэши |
GET | /api/catalog | каталог предметных областей и тем SQL для форм |
GET POST | /api/domain, /api/domain/generate, /api/domain/approve | шаг 1 |
GET POST | /api/tasks, /api/tasks/generate, /api/tasks/approve | шаг 2 |
POST | /api/materialize | шаг 3 по всем заданиям |
GET | /api/outcomes | результаты прогона: статусы, материализации, матрица негативов |
GET | /api/tasks/{id}/variant/{variant} | данные любого варианта, включая скрытые |
Ручной режим — параллельная пара эндпоинтов у каждого шага: /prompt отдаёт готовый промт, /manual принимает ответ модели и валидирует его так же, как ответ API.
Студии автора закрытых данных не существует: она показывает всё содержимое пака, включая скрытые проверки и ожидаемые результаты всех вариантов.