# Phase 4: Реестр в БД + API + админка **Status:** ✅ Done — review PASS, 11 тестов, миграция применена, запушено **Parent plan:** [PLAN.md](./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 для грубой привязки.