Files
Learn_System/backend
Maxim Dolgolyov 2ec59c0fa5 refactor: unify assignment creation — 3 endpoints через общие helpers
Все три endpoint'а POST для создания assignment теперь используют
общую логику валидации, резолва FK и INSERT'а:

  POST /api/classes/:id/assignments  → createAssignment
  POST /api/assignments              → createDirectAssignment
  POST /api/assignments/bulk         → bulkCreateAssignment

Три новых private helper'а:
  _resolveAssignment(body) — валидирует и резолвит test_id/textbook_slug/
    file_id → возвращает {ok: {...resolved}, error: '...'}
  _insertAssignmentStmt — единственный prepared INSERT с полным
    набором колонок включая textbook_id, textbook_paragraphs
  _insertAssignment(target, fields, creatorId) — обёртка над INSERT,
    target = {class_id} или {user_id}
  _notifyAssignment(target, title) — pushNotif для class members или
    одного user в зависимости от target

Каждая из трёх public-функций теперь:
  - 25-40 строк (было 50-80)
  - Уникальная логика только в:
    • createAssignment       — проверка владения классом
    • createDirectAssignment — резолв ученика + class-membership
                                либо teacher_students проверка
    • bulkCreateAssignment   — цикл по class_ids в транзакции

Бонусы:
  - createAssignment (через /classes/:id/assignments) теперь
    поддерживает textbook_slug + textbook_paragraphs (раньше нет —
    скрытый баг, проявлялся бы при попытке назначить чтение через
    UI классов)
  - max_attempts теперь применяется во всех трёх (был только в
    createAssignment)
  - Все три используют stmts.getClass вместо inline db.prepare()

API совместимость не нарушена: схемы тел запросов, return value,
коды статусов идентичны. Existing UI работает без изменений.

Файл: 734 → 744 строки (+10, но дубликат-логика выкинута).
2026-05-16 17:29:22 +03:00
..

LearnSpace Backend — Фаза 1

Быстрый старт

cd backend
npm install

# 1. Скопировать и заполнить переменные окружения
cp .env.example .env

# 2. Создать базу данных в PostgreSQL
createdb learnspace

# 3. Применить миграции (создать таблицы)
npm run migrate

# 4. Загрузить тестовые вопросы
npm run seed

# 5. Запустить сервер
npm run dev

API

Auth

Метод URL Тело Описание
POST /api/auth/register { email, password, name } Регистрация
POST /api/auth/login { email, password } Вход
GET /api/auth/me Текущий пользователь

Предметы

Метод URL Описание
GET /api/subjects Список предметов
GET /api/subjects/:slug/topics Темы предмета

Сессии тестирования

Метод URL Тело Описание
POST /api/sessions { subject_slug, mode, count, topic_id? } Начать тест
POST /api/sessions/:id/answer { question_id, option_id, time_spent_sec? } Отправить ответ
POST /api/sessions/:id/finish Завершить тест + разбор
GET /api/sessions/:id/result Результат завершённого теста
GET /api/sessions/history История тестов

Все /api/sessions/* требуют заголовок:

Authorization: Bearer <token>

Добавление вопросов

Создать JSON-файл в data/ по образцу questions-bio.json:

{
  "subject": "chem",
  "topics": [{ "name": "Органическая химия", "order": 1 }],
  "questions": [
    {
      "topic": "Органическая химия",
      "difficulty": 2,
      "text": "Текст вопроса",
      "options": ["А", "Б", "В", "Г"],
      "answer": 0,
      "explanation": "Объяснение правильного ответа"
    }
  ]
}

Затем повторно запустить npm run seed.

Структура проекта

backend/
├── data/                     ← JSON с вопросами
├── src/
│   ├── server.js             ← точка входа
│   ├── middleware/auth.js    ← JWT верификация
│   ├── db/
│   │   ├── pool.js           ← соединение с PostgreSQL
│   │   ├── migrate.js        ← запуск миграций
│   │   ├── seed.js           ← загрузка вопросов
│   │   └── migrations/       ← SQL-файлы схемы
│   ├── routes/               ← маршруты
│   └── controllers/          ← бизнес-логика
└── .env.example