Maxim Dolgolyov
068d6c2afe
feat(classroom): открытие любого учебника в онлайн-уроке
...
Учитель может выбрать любой активный учебник из каталога /api/textbooks
и открыть его в общем iframe для всех участников. По аналогии с симуляциями:
- Backend: контроллер classroom/textbook.js + 4 роута
(POST/DELETE /:id/textbook, /:id/textbook/nav, /:id/textbook/mode)
с SSE-событиями classroom_textbook_open|close|nav|mode
- Embed-режим /textbook/:slug?embed=1: сервер injectит CSS+JS-bridge
перед </head>, скрывая хедер/сайдбар и пересылая клики/скролл наверх
через postMessage (без правки 40+ HTML-учебников)
- Frontend (classroom.html): кнопка «Учебник» в header, пикер с
фильтрами по предмету, iframe-панель с режимами демо/свободно,
relay nav-событий учителя → всем студентам в demo-режиме
2026-05-29 11:41:57 +03:00
Maxim Dolgolyov
c0f20ef020
fix: classroom review — 11 исправлений из code review
...
- sessions.js: endSession закрывает classroom_attendance (left_at), чистит classroom_muted
- sessions.js: joinSession восстанавливает mute-состояние при реконнекте
- strokes.js: updateStroke проверяет авторство штриха (не только canDraw)
- strokes.js: clearPage валидирует page_num как положительное целое
- strokes.js: postStrokes ограничивает массив 500 штрихами
- pages.js: duplicatePage сохраняет user_id при копировании штрихов
- pages.js: changePage валидирует page_num
- pages.js: updatePageTemplate делает INSERT OR IGNORE перед UPDATE
- permissions.js: mutePeer сохраняет в classroom_muted; добавлен unmutePeer
- permissions.js: getOnlineStudents не возвращает email
- chat.js: exportChat экранирует переводы строк в именах и сообщениях
- guestClassroom.js: санитизация имени гостя (убираем HTML-символы)
- ws-server.js: mute_peer сохраняет в БД; добавлен обработчик unmute_peer
- routes/classroom.js: rate-limit для cursor/preview/signal/strokes; маршрут DELETE /mute
- migrations/001_classroom_muted.sql: новая таблица classroom_muted
2026-05-07 14:26:19 +03:00
Maxim Dolgolyov
977e46e75b
refactor: split classroomController.js into 7 domain files (phase 2 of 2)
...
1618-line monolith split into:
classroom/_shared.js — GUEST_EVENTS, emitToSession, hasAccess, canDraw
classroom/sessions.js — lifecycle + guest tokens (12 functions)
classroom/strokes.js — CRUD + cursor + preview (7 functions)
classroom/pages.js — page CRUD + theme (8 functions)
classroom/chat.js — messages, reactions, attachments, export (7 functions)
classroom/permissions.js — draw, hand, mute, screen, attendance (11 functions)
classroom/sim.js — simulation relay (5 functions)
classroom/admin.js — history, notes, templates, admin views (14 functions)
classroomController.js is now a 9-line re-export facade.
routes/classroom.js unchanged. All 65 exports verified. Tests pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-06 17:30:37 +03:00