Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
Submódulo LMS
discussions
Engajamento em aulas voltado ao aluno: tópicos de discussão com âncoras de timestamp de vídeo e curtidas (compartilhados entre alunos matriculados), e notas pessoais com marcação de tempo (privadas para cada aluno).
Caminho de origem: libraries/lms/src/course-lesson-discussion, libraries/lms/src/course-lesson-note
Arquivo do módulo: course-lesson-discussion.module.ts, course-lesson-note.module.ts
Introdução
Esses dois controllers ficam lado a lado sob `/lms/course-lessons/:lessonId/` e parecem superficialmente semelhantes — ambos exigem que o chamador esteja matriculado no curso da aula (via uma verificação compartilhada `assertStudentAccess` que resolve o `person_id` a partir do usuário autenticado e verifica uma `course_enrollment` não cancelada), e ambos ancoram as entradas a uma posição `playerTimeSeconds` no vídeo da aula. A principal diferença de comportamento é a visibilidade: os tópicos de discussão são compartilhados entre todos os alunos matriculados na aula — o `GET /discussion/topics` retorna a árvore completa da thread sem filtragem por usuário, apenas computando uma flag `likedByMe` por tópico para o visualizador — enquanto as notas são estritamente privadas, com cada consulta filtrada por `person_id = chamador`. Um aluno não pode ver as notas de outro aluno sob nenhuma circunstância.
As respostas de discussão não são uma entidade separada; uma resposta é apenas outra linha de tópico com `parentTopicId` definido, e a árvore é reconstruída em memória a cada leitura. As curtidas usam uma linha com unicidade composta `(topic_id, person_id)` com `ON CONFLICT DO NOTHING` ao curtir e uma exclusão incondicional ao descurtir, de modo que curtir duas vezes ou descurtir quando não curtido são ambos no-ops silenciosos, e não erros. O conteúdo postado passa por um sanitizador manual baseado em regex que remove blocos `<script>`/`<style>`, atributos de evento inline `on*` e URIs `javascript:` — não é uma biblioteca completa de sanitização de HTML, portanto outras tags/atributos passam intactos.
Endpoints HTTP
9 endpoints
Árvore completa da thread de discussão da aula; exige que o chamador esteja matriculado no curso.
- Params
- lessonId (int)
Posta um tópico, ou uma resposta se parentTopicId estiver definido; o conteúdo é sanitizado de HTML.
- Params
- lessonId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| content | string | yes | Max 20000 chars |
| playerTimeSeconds | number | yes | Min 0 |
| parentTopicId | number | no | Set to reply to an existing topic |
Curte um tópico (idempotente — curtir duas vezes é um no-op).
- Params
- lessonId, topicId (int)
Remove a curtida do chamador (no-op se não previamente curtido).
- Params
- lessonId, topicId (int)
Lista as próprias notas do chamador para a aula, ordenadas pelo timestamp do player.
- Params
- lessonId (int)
Obtém uma das próprias notas do chamador por ID.
- Params
- lessonId, id (int)
Cria uma nota privada para o chamador na aula.
- Params
- lessonId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| description | string | yes | Max 5000 chars |
| playerTimeSeconds | number | yes | Min 0 |
| frameFileId | number | null | no | Screenshot frame attachment |
Atualiza uma das próprias notas do chamador.
- Params
- lessonId, id (int)
Exclui uma das próprias notas do chamador; 204 No Content.
- Params
- lessonId, id (int)
Ferramentas MCP
Ferramentas nomeadas que podem ser chamadas por modelos de IA através do Model Context Protocol (MCP).
lms.lesson-discussion.topics.listLista tópicos de discussão de uma aula de curso, retornados como uma árvore de thread. Requer matrícula
lms.lesson-discussion.topics.createCria um novo tópico de discussão (ou resposta) em uma aula de curso
lms.lesson-discussion.topics.likeCurte um tópico de discussão em uma aula de curso
lms.lesson-discussion.topics.unlikeRemove a curtida de um tópico de discussão em uma aula de curso
lms.lesson-notes.listLista as notas do usuário autenticado para uma aula de curso, ordenadas pelo timestamp do player
lms.lesson-notes.getRetorna uma única nota por ID para o usuário autenticado
lms.lesson-notes.createCria uma nova nota em uma aula de curso para o usuário autenticado
lms.lesson-notes.updateAtualiza uma das notas de aula do usuário autenticado
lms.lesson-notes.deleteExclui uma das notas de aula do usuário autenticado