feat(biochem): Фаза 4 (4.1-4.3) — пути метаболизма из БД (API), хардкод убран

Перенос данных путей из ~700 строк инлайн-объекта PATHWAYS в biochem-pathways.html
в БД. Document-подход: каждый путь — самодостаточный документ data_json (граф
узлов/рёбер + шаги с квизами); путь всегда читается целиком, реляционных
запросов нет — нормализация не нужна.

- migration 045_bio_pathways: таблица bio_pathways(slug, name, color, ord, data_json).
- backend/scripts/biochem_pathways_data.js: данные 4 путей (извлечены из инлайн-
  объекта, теперь самодостаточный источник правды).
- seed_biochem_pathways.js: идемпотентный upsert по slug.
- biochemController.getPathways + GET /biochem/pathways (карта slug->данные).
- js/api.js: biochemGetPathways.
- biochem-pathways.html: инлайн PATHWAYS (-238 строк) заменён на загрузку из API
  в init (loadPathways); форма данных идентична — рендер не изменён.

Проверено: API отдаёт 4 пути в форме фронта, сидер идемпотентен.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 17:39:36 +03:00
parent e2ff28a482
commit b29b395a96
7 changed files with 1372 additions and 240 deletions
+2 -1
View File
@@ -943,6 +943,7 @@ async function biochemSolveChallenge(id,payload) { return req('POST',`/bioche
async function biochemGetSaved() { return req('GET', '/biochem/saved'); }
async function biochemSave(atoms,bonds,name){ return req('POST','/biochem/saved',{atoms,bonds,name}); }
async function biochemDeleteSaved(id) { return req('DELETE',`/biochem/saved/${id}`); }
async function biochemGetPathways() { return req('GET', '/biochem/pathways'); }
async function biochemGetPathwayProgress() { return req('GET', '/biochem/pathways/progress'); }
async function biochemSavePathwayProgress(pathway,step,completed){ return req('POST','/biochem/pathways/progress',{pathway,step,completed}); }
@@ -1067,7 +1068,7 @@ window.LS = {
biochemGetElements, biochemGetMolecules, biochemGetMolecule, biochemValidate,
biochemGetReactions, biochemGetChallenges, biochemSolveChallenge,
biochemGetSaved, biochemSave, biochemDeleteSaved,
biochemGetPathwayProgress, biochemSavePathwayProgress,
biochemGetPathways, biochemGetPathwayProgress, biochemSavePathwayProgress,
prefs: lsPrefs,
};