Files
Learn_System/backend/src/db/migrations/078_prep_tracks.sql
T
Maxim Dolgolyov 9509a67e25 feat(prep): мастер-флаг подготовки к направлению (ЦТ) + коллекции колод — бэкенд
Система «готовится к ЦТ»: флаг student_prep(user_id,track) открывает ученику
ВЕСЬ контент трека (карточки + курс + пробники) динамически, без материализации.
- мигр.078: таблица student_prep + flashcard_decks.collection + разметка ЦТ-колод 'ct-math'
- services/prepTracks.js: реестр треков (трек→коллекция/курсы/экзамены), устойчив до миграции
- contentAccess.resolve/allowedRefs: учитывают мастер-флаг (явный запрет ученика побеждает)
- flashcardController.deckAccess/listDecks: колоды коллекции открыты по флагу
- prepController + /api/prep: учитель (своим) и админ ставят/снимают флаг (ученику/классу)
- js/api.js: LS.prep* обёртки

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:29:00 +03:00

29 lines
1.9 KiB
SQL

-- 078_prep_tracks.sql
-- Система «подготовка к направлению» (ЦТ и др.): флаг ученика + коллекция колод.
--
-- МАСТЕР-ФЛАГ: запись student_prep(user_id, track) открывает ученику ВЕСЬ контент
-- трека сразу — коллекцию флешкарт (flashcard_decks.collection), курс и пробники
-- (content_type='course'/'exam'). Маппинг трек→контент — services/prepTracks.js;
-- динамический резолв доступа — services/contentAccess.js (без материализации
-- правил content_access) и flashcardController.deckAccess/listDecks.
--
-- Управление флагом — учитель (своим ученикам) и админ (см. prepController.js).
-- 1) Флаг подготовки ученика по треку. track — ключ направления ('ct-math', …).
CREATE TABLE IF NOT EXISTS student_prep (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
track TEXT NOT NULL,
created_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE (user_id, track)
);
CREATE INDEX IF NOT EXISTS idx_student_prep_user ON student_prep(user_id);
CREATE INDEX IF NOT EXISTS idx_student_prep_track ON student_prep(track);
-- 2) Коллекция (папка/направление) колоды. NULL = вне коллекции (поведение как раньше).
ALTER TABLE flashcard_decks ADD COLUMN collection TEXT;
-- 3) Разметить существующие ЦТ-колоды коллекцией 'ct-math' (заголовки «ЦТ · …»).
UPDATE flashcard_decks SET collection = 'ct-math' WHERE title LIKE 'ЦТ ·%';