Logotipo Hedhog

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

12 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

FieldTypeRequiredNotes
contentstringyesMax 20000 chars
playerTimeSecondsnumberyesMin 0
parentTopicIdnumbernoSet 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

FieldTypeRequiredNotes
descriptionstringyesMax 5000 chars
playerTimeSecondsnumberyesMin 0
frameFileIdnumber | nullnoScreenshot 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)

Student surface for notes, used by the mobile app. Same listing as the route above, but gated by subscription instead of the lms-student role.

Params
lessonId (int)

Student surface for creating a note. Enrolls the caller in the course first when no active enrollment exists, the same way lesson open and the video heartbeat already do.

Params
lessonId (int)

Body

FieldTypeRequiredNotes
descriptionstringyesMax 5000 chars
playerTimeSecondsnumberyesMin 0
frameFileIdnumber | nullnoScreenshot frame attachment

Student surface for deleting one of the caller's own notes; 204 No Content.

Params
lessonId, noteId (int)

Ferramentas MCP

Ferramentas nomeadas que podem ser chamadas por modelos de IA através do Model Context Protocol (MCP).

  • lms.lesson-discussion.topics.list

    Lista tópicos de discussão de uma aula de curso, retornados como uma árvore de thread. Requer matrícula

  • lms.lesson-discussion.topics.create

    Cria um novo tópico de discussão (ou resposta) em uma aula de curso

  • lms.lesson-discussion.topics.like

    Curte um tópico de discussão em uma aula de curso

  • lms.lesson-discussion.topics.unlike

    Remove a curtida de um tópico de discussão em uma aula de curso

  • lms.lesson-notes.list

    Lista as notas do usuário autenticado para uma aula de curso, ordenadas pelo timestamp do player

  • lms.lesson-notes.get

    Retorna uma única nota por ID para o usuário autenticado

  • lms.lesson-notes.create

    Cria uma nova nota em uma aula de curso para o usuário autenticado

  • lms.lesson-notes.update

    Atualiza uma das notas de aula do usuário autenticado

  • lms.lesson-notes.delete

    Exclui uma das notas de aula do usuário autenticado