Files
Learn_System/plans/lab-content-engine/phase-4-db-admin.md
Maxim Dolgolyov c1c5bafaff feat(lab-content-engine): phase 4 - каталог симуляций в БД + API + админка
- Миграция 042_lab_sims.sql: таблица lab_sims (id, cat, title, subject, grade,
  sort_order, enabled, featured, tags JSON), сид 40 симуляций в порядке каталога
- backend/src/routes/lab.js: GET /api/lab/sims (мёрж БД + legacy-флаги, auth),
  PATCH /api/lab/sims/:id (admin), POST /api/lab/sims/reorder (admin).
  enabled зеркалится в legacy sim_disabled_ids -> lab.html без правок фронта
- server.js: монтирование /api/lab
- tests/lab-sims.test.js: 11 тестов (auth/роли/вкл-выкл+зеркало/featured/tags/
  валидация/reorder/404), все проходят; +0 к baseline (3 pre-existing)
- admin/sections/sims.js: убран захардкоженный ADMIN_SIMS, каталог из /api/lab/sims,
  тумблеры вкл-выкл и «рекомендуемая»; XSS-эскейп, иконки .ic
- plans/: Фаза 4 done + handoff

Независимое ревью: PASS, блокеров нет. route-auth lint: PATCH-роут защищён inline
requireRole('admin'). Миграция применена к живой БД.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 15:49:05 +03:00

4.8 KiB

Phase 4: Реестр в БД + API + админка

Status: Done — review PASS, 11 тестов, миграция применена, запушено Parent plan: PLAN.md Domain: fullstack

Objective

Хранить оверрайды каталога в БД, мёржить с код-манифестами, управлять каталогом из админки (вкл/выкл, порядок, теги, рекомендуемые).

Tasks

  • Миграция БД: таблица lab_sims (id PK, title, cat, subject, grade, desc, enabled, sort, topic_id, textbook_ref, flags JSON, updated_at). Через node:sqlite DatabaseSync.
  • Backend route GET /api/lab/sims — отдаёт мёрж: код-манифест (база) + БД-оверрайды.
  • Backend admin routes: upsert/enable/disable/reorder/tag (под RBAC admin).
  • Frontend: каталог берёт enabled/order/теги из /api/lab/sims (с фолбэком на код-манифест офлайн).
  • Расширить frontend/js/admin/sections/sims.js: список, вкл/выкл, drag-reorder, теги, «рекомендуемые».
  • Сохранить совместимость с _disabledSimIds.

Files to Modify/Create

  • backend/src/db/migrations/0XX_lab_sims.sql — новая миграция.
  • backend/src/routes/lab.js (или расширить существующий) — API.
  • backend/src/server.js — подключить роут (если новый файл).
  • frontend/js/admin/sections/sims.js — расширить админку.
  • frontend/js/labs/_loader.js/manifest — учитывать БД-данные.

Acceptance Criteria

  • npm test зелёный; npm run lint:routes без ошибок (auth на роутах).
  • Админ может вкл/выкл/переупорядочить/тегировать симуляцию, изменения видны в каталоге.
  • Офлайн/без БД — фолбэк на код-манифест.

Notes

  • RBAC: мутации только admin. Чтение каталога — для роли с доступом к лаборатории.
  • Не дублировать данные: код-манифест = источник базовых полей; БД = оверрайды/доп.

Review Checklist

  • Миграция идемпотентна
  • Роуты под auth (lint:routes)
  • Мёрж корректен, фолбэк работает
  • Тесты проходят

Handoff to Next Phase

  • РЕАЛИЗОВАНО: таблица lab_sims (миграция 042), backend/src/routes/lab.js (GET /api/lab/sims + PATCH /:id + POST /reorder), монтирование в server.js (require:58, mount:181), 11 тестов lab-sims.test.js, переписан frontend/js/admin/sections/sims.js (убран ADMIN_SIMS).
  • ИСТОЧНИК ИСТИНЫ каталога теперь БД (lab_sims). preview-SVG остаются в коде. Поля subject/grade/featured/tags ГОТОВЫ в схеме и API — Фаза 5 их наполнит (курикулум) и фронт /lab может начать их потреблять.
  • СОВМЕСТИМОСТЬ: enabled зеркалится в app_settings.sim_disabled_ids, поэтому lab.html (читает /api/settings/sims) скрывает выключенные без правок фронта. Каталог /lab пока НЕ читает /api/lab/sims (рендерится из кода-реестра+SIMS) — это опционально для Фазы 5: можно подтянуть порядок/featured/теги из БД.
  • ТЕСТЫ: npm test имеет 3 PRE-EXISTING baseline-фейла (документированы с lab-split, не связаны с этой работой). pre-commit хук толерантен (BASELINE_FAILS=3). Мои 11 тестов проходят, +0 к фейлам.
  • БРАУЗЕР-ПРОВЕРКА (желательно для Ф4): зайти в админку → раздел «Симуляции»: список грузится из API, тумблеры вкл/выкл и звёзда «рекомендуемая» работают; на /lab выключенная симуляция исчезает из каталога.
  • ⚠️ ПАРАЛЛЕЛЬНАЯ СЕССИЯ активно коммитит в эту ветку (chemistry-8 и др.) — fetch+rebase перед push (в этой фазе было 2 behind, rebase прошёл чисто, без пересечений по файлам).
  • Для Фазы 5: связи sim ↔ §учебника/тема/kmap можно класть в новую таблицу lab_sim_links; subject/grade уже есть в lab_sims для грубой привязки.