# Phase 4: Реестр в БД + API + админка **Status:** ⬜ Not Started **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