feat(assistant): учитель видит профиль ученика для Квантика (агрегат, без заметок)
GET /assistant/student-profile/:id (teacher/admin): производный профиль ученика — слабые предметы, трудные темы экзамена, цель, серия. Сырые заметки НЕ отдаются (приватны). Доступ: свой класс или «Мои ученики»; чужой → 403; админ — любой (проверено). На /my-students — кнопка «Профиль» с поповером. Ученику в панели памяти уже написано «учитель видит лишь общие слабые темы». Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -221,6 +221,27 @@ async function _extractMemory(uid, q, answer) {
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
// Доступ учителя к ученику: свой класс или личный список «Мои ученики».
|
||||
function _teacherCanSeeStudent(teacherId, studentId) {
|
||||
try {
|
||||
const inClass = db.prepare('SELECT 1 FROM class_members cm JOIN classes c ON c.id = cm.class_id WHERE cm.user_id = ? AND c.teacher_id = ? LIMIT 1').get(studentId, teacherId);
|
||||
if (inClass) return true;
|
||||
return !!db.prepare('SELECT 1 FROM teacher_students WHERE teacher_id = ? AND student_id = ? LIMIT 1').get(teacherId, studentId);
|
||||
} catch (e) { return false; }
|
||||
}
|
||||
|
||||
/* ── GET /api/assistant/student-profile/:id — для учителя/админа ────────
|
||||
* Только производный профиль (слабые предметы/темы, цель). БЕЗ сырых заметок. */
|
||||
function getStudentProfile(req, res) {
|
||||
const sid = Number(req.params.id);
|
||||
if (!sid) return res.status(400).json({ error: 'bad id' });
|
||||
const role = req.user && req.user.role;
|
||||
if (role !== 'admin' && !_teacherCanSeeStudent(req.user.id, sid)) return res.status(403).json({ error: 'нет доступа к ученику' });
|
||||
let name = null;
|
||||
try { name = db.prepare('SELECT name FROM users WHERE id = ?').get(sid)?.name || null; } catch (e) {}
|
||||
res.json({ name, profile: _studentProfile(sid) });
|
||||
}
|
||||
|
||||
/* ── GET /api/assistant/memory — что Квантик знает об ученике ──────────── */
|
||||
function getMemory(req, res) {
|
||||
const uid = req.user.id;
|
||||
@@ -595,4 +616,4 @@ async function flashcardsFromText(req, res) {
|
||||
res.json({ title, cards });
|
||||
}
|
||||
|
||||
module.exports = { getContext, markSeen, dismiss, setSettings, ask, flashcardsFromText, feedback, getMemory, clearMemory, llmConfig, pingLLM, clearFailover: _clearFailover };
|
||||
module.exports = { getContext, markSeen, dismiss, setSettings, ask, flashcardsFromText, feedback, getMemory, clearMemory, getStudentProfile, llmConfig, pingLLM, clearFailover: _clearFailover };
|
||||
|
||||
Reference in New Issue
Block a user