b29b395a96
Перенос данных путей из ~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>
43 lines
1.6 KiB
JavaScript
43 lines
1.6 KiB
JavaScript
'use strict';
|
|
/*
|
|
* Сид метаболических путей в bio_pathways.
|
|
* Источник данных — backend/scripts/data/biochem_pathways.json (изначально
|
|
* извлечён из инлайн-объекта PATHWAYS; теперь это самодостаточный источник
|
|
* правды, не зависящий от фронта). Каждый путь — документ data_json.
|
|
* Идемпотентно (upsert по slug): повторный запуск синхронизирует данные.
|
|
*
|
|
* Запуск: node backend/scripts/seed_biochem_pathways.js
|
|
*/
|
|
const db = require('../src/db/db');
|
|
const P = require('./biochem_pathways_data');
|
|
|
|
const upsert = db.prepare(`INSERT INTO bio_pathways (slug, name, color, ord, data_json)
|
|
VALUES (@slug, @name, @color, @ord, @data_json)
|
|
ON CONFLICT(slug) DO UPDATE SET
|
|
name=excluded.name, color=excluded.color, ord=excluded.ord, data_json=excluded.data_json`);
|
|
|
|
const slugs = Object.keys(P);
|
|
let n = 0;
|
|
db.exec('BEGIN');
|
|
try {
|
|
slugs.forEach((slug, idx) => {
|
|
const p = P[slug];
|
|
upsert.run({
|
|
slug,
|
|
name: p.name || slug,
|
|
color: p.color || '#9B5DE5',
|
|
ord: idx,
|
|
data_json: JSON.stringify(p),
|
|
});
|
|
n++;
|
|
});
|
|
db.exec('COMMIT');
|
|
} catch (e) {
|
|
db.exec('ROLLBACK');
|
|
throw e;
|
|
}
|
|
|
|
console.log(`biochem pathways seed: ${n} путь(ей) — ${slugs.join(', ')}`);
|
|
console.log('в БД:', db.prepare('SELECT slug, name, LENGTH(data_json) AS bytes FROM bio_pathways ORDER BY ord').all()
|
|
.map(r => `${r.slug}(${r.bytes}b)`).join(' '));
|