feat(access): Фаза 1a — видимость симуляций по классам (добавочная модель)
Миграция 051: расширяет content_access.content_type на 'course'/'sim' (пересборка таблицы — SQLite не умеет ALTER CHECK) + мост «открыть все включённые симуляции всем существующим классам» → текущее поведение не меняется. GET /api/lab/sims теперь фильтрует список для НЕпривилегированных по allowedRefs(uid,'sim'); admin/ teacher видят все. Ролевой simulations.access остаётся «модуль вкл.» (добавочно). Тесты: lab-access (4/4, allowlist+класс+личное), lab-sims переведён на admin для проверки полного каталога (видимость ученика — в lab-access). /api/lab в харнессе. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
const router = require('express').Router();
|
||||
const db = require('../db/db');
|
||||
const { authMiddleware, requireRole } = require('../middleware/auth');
|
||||
const access = require('../services/contentAccess');
|
||||
|
||||
const CATS = ['math', 'phys', 'chem', 'bio', 'game'];
|
||||
const LINK_KINDS = ['textbook', 'topic', 'kmap', 'question'];
|
||||
@@ -48,7 +49,7 @@ function rowToSim(r) {
|
||||
}
|
||||
|
||||
/* ── GET /api/lab/sims ─────────────────────────────────────────────────── */
|
||||
router.get('/sims', (_req, res) => {
|
||||
router.get('/sims', (req, res) => {
|
||||
let rows;
|
||||
try {
|
||||
rows = db.prepare(`SELECT * FROM lab_sims ORDER BY sort_order, id`).all();
|
||||
@@ -60,12 +61,19 @@ router.get('/sims', (_req, res) => {
|
||||
return res.json({ module_disabled: readModuleDisabled(), sims: [], needs_migration: true });
|
||||
}
|
||||
const legacyDisabled = readLegacyDisabledIds();
|
||||
const sims = rows.map(r => {
|
||||
let sims = rows.map(r => {
|
||||
const s = rowToSim(r);
|
||||
// Симуляция считается выключенной, если так сказано в lab_sims ИЛИ в legacy-списке.
|
||||
s.enabled = s.enabled && !legacyDisabled.has(r.id);
|
||||
return s;
|
||||
});
|
||||
// Видимость по классам (добавочная модель): ролевой simulations.access решает,
|
||||
// включён ли модуль вообще (проверяется на фронте/при действиях); здесь ученик
|
||||
// видит только разрешённые его классу/лично симуляции. admin/teacher — все.
|
||||
if (req.user && !access.PRIVILEGED.has(req.user.role)) {
|
||||
const allowed = access.allowedRefs(req.user.id, 'sim');
|
||||
sims = sims.filter(s => allowed.has(s.id));
|
||||
}
|
||||
res.json({ module_disabled: readModuleDisabled(), sims });
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user