feat(sim-builder): фаза 3 — БД custom_sims + CRUD API с валидацией спеки и проверкой владения

This commit is contained in:
Maxim Dolgolyov
2026-06-13 12:10:02 +03:00
parent 572d479f12
commit 014c96db1e
10 changed files with 697 additions and 24 deletions
@@ -0,0 +1,29 @@
-- ═══════════════════════════════════════════════════════════════
-- 071: Custom simulations (Конструктор симуляций / SimForge), Фаза 3.
--
-- Учитель/админ собирает интерактивную 2D-симуляцию из ДАННЫХ (JSON-спека:
-- params[], objects[], physics{}, …) и сохраняет её здесь. Спека хранится как
-- TEXT(JSON) в spec_json; её схема/лимиты валидируются на входе сервером
-- (validateSpec), БЕЗ исполнения. status='draft' видит только владелец;
-- status='published' — публичная (видна всем в каталоге /lab, Фаза 5).
--
-- owner_id ON DELETE CASCADE — спеки удаляются вместе с автором.
-- ═══════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS custom_sims (
id INTEGER PRIMARY KEY AUTOINCREMENT,
owner_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
title TEXT,
description TEXT,
subject TEXT, -- курикулум (напр. 'physics')
grade INTEGER, -- класс
cat TEXT, -- категория каталога (math|phys|chem|bio|game)
spec_json TEXT NOT NULL, -- JSON-спека (данные, не код)
status TEXT NOT NULL DEFAULT 'draft', -- draft | published
version INTEGER NOT NULL DEFAULT 1, -- ++ на каждом update
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_custom_sims_owner ON custom_sims (owner_id);
CREATE INDEX IF NOT EXISTS idx_custom_sims_status ON custom_sims (status);