Logotipo Hedhog

Receba novidades do Hedhog no seu e-mail

Novos lançamentos, receitas e breaking changes — sem spam.

Submódulo LMS

exams

Banco de exames com um catálogo global de assuntos de questões, cinco tipos de questão (múltipla escolha, verdadeiro/falso, dissertativa, preencher lacunas e associação), um banco de questões avulso e o ciclo de vida completo da tentativa do aluno.

Caminho de origem: libraries/lms/src/exam

Arquivo do módulo: exam.module.ts

Introdução

O submódulo Exams é dividido em três controllers que, juntos, cobrem a autoria e a realização de exames. O `ExamController` (`/lms/exams`) é dono das definições de exame — título, código, limite de pontuação, limite de tempo, flags de embaralhamento/visibilidade do gabarito, nível e status — além de uma superfície aninhada de gerenciamento de questões para adicionar, editar, remover e reordenar as questões de cada exame. Cinco tipos de questão são suportados: multiple_choice e true_false são corrigidos automaticamente contra as alternativas marcadas como corretas (true_false exige estritamente exatamente duas), essay é armazenada sem correção para revisão manual, fill_blank é corrigida por correspondência exata insensível a maiúsculas/minúsculas contra uma ou mais respostas aceitas, e matching é corrigida por comparação exata do conjunto de pares esquerda/direita. Uma escolha de design pequena mas fácil de perder: o `GET /lms/exams/:id` retorna `null` em vez de um 404 quando o exame não existe, e vários endpoints de gerenciamento de questões (excluir, reordenar) são no-ops em vez de erros quando o alvo não existe ou o conjunto de IDs enviado não corresponde — os chamadores devem verificar o formato da resposta em vez de confiar puramente no status HTTP.

O `QuestionController` (`/lms/questions`) é um banco de questões avulso, separado e mais plano — questões criadas aqui não são vinculadas a nenhum exame no momento da criação, útil para construir um banco de itens reutilizável antes de montar exames, ou para outras partes da plataforma que precisam de questões corrigidas ad-hoc fora do fluxo de tentativa de exame.

O `ExamAttemptController` (também sob `/lms/exams`) é a metade voltada ao aluno: iniciar uma tentativa, salvar respostas em andamento e submeter para correção. O `GET /:id/attempt` finaliza automaticamente uma tentativa se seu limite de tempo tiver silenciosamente expirado, e resolve a qual registro `person` a tentativa pertence via uma cadeia de fallback — sobrescrita explícita por `studentId`, depois person correspondente por e-mail, e então (como último recurso) criando automaticamente um novo registro de person para o usuário chamador, o que é um efeito colateral notável que vale conhecer antes de fazer scripts contra este endpoint com uma service account recém-criada. Iniciar uma nova tentativa é idempotente em relação a uma tentativa em andamento existente e não expirada, e a submissão publica um evento de integração `lms.exam.attempt.submitted` carregando a pontuação final e o resultado de aprovação/reprovação para consumidores downstream (por exemplo, concessão de conquistas ou relatórios de licença corporativa) reagirem.

Endpoints HTTP

19 endpoints

Lista paginada de assuntos/categorias de questões.

Query
page, pageSize, search

Cria um assunto de questão; rejeita nomes vazios ou duplicados insensíveis a maiúsculas/minúsculas.

Body

FieldTypeRequiredNotes
namestringyes
descriptionstringno

Lista paginada de exames com a pontuação média por exame.

Query
page, pageSize, search, status

Estatísticas agregadas: exames totais/publicados, total de questões, pontuação média geral.

Obtém um exame por ID; retorna null (não 404) se não encontrado.

Params
id (int)

Lista as questões do exame em ordem, incluindo alternativas/respostas/pares específicos do tipo.

Params
id (int)

Adiciona uma questão ao exame; validação por tipo é aplicada (objetiva precisa de ≥2 alternativas com ≥1 correta, true_false exatamente 2, fill_blank ≥1 resposta, matching ≥2 pares únicos).

Params
id (int)

Body

FieldTypeRequiredNotes
subjectIdnumberyes
statementstringyes
pointsnumberyesMin 1
questionType'multiple_choice' | 'true_false' | 'essay' | 'fill_blank' | 'matching'noDefault multiple_choice
explanationstringno
alternatives{ text, isCorrect }[]noMax 2000 chars per text
fillBlankAnswers{ answer, alternatives? }[]noMin size 1 if present
matchingPairs{ id, leftText, rightText }[]noMin size 2 if present

Atualiza uma questão (mesmos validadores da criação, aplicados quando campos/tipo mudam).

Params
id, questionId (int)

Remove uma questão e re-sequencia a ordem restante (no-op se não encontrada).

Params
id, questionId (int)

Reordena as questões; retorna {success:false} se o conjunto de IDs enviado não corresponder exatamente às questões do exame.

Params
id (int)

Body

FieldTypeRequiredNotes
questionIdsnumber[]yesArrayMinSize(1)

Cria um exame (exam_type fixado como "test").

Body

FieldTypeRequiredNotes
titlestringyesMax 255 chars
codestringnoMax 32 chars
minScorenumbernoPassing threshold on a base-10 scale, default 7
timeLimitnumbernoMinutes, default 60
shufflebooleanno
showAnswerKeyAfterFinishbooleanno
level'beginner' | 'intermediate' | 'advanced'noDefault beginner
status'draft' | 'published' | 'closed' | 'archived'noDefault draft
primaryColorstringnoMax 32 chars
secondaryColorstringnoMax 32 chars

Atualiza os campos do exame (todos opcionais, mesmo formato da criação).

Params
id (int)

Exclui permanentemente o exame.

Params
id (int)

Lista o banco global de questões avulsas (correspondência de substring no enunciado).

Query
search?, page?, limit? (default 50)

Cria uma questão avulsa, não vinculada a nenhum exame. Mesma validação por tipo das questões de exame.

Body

FieldTypeRequiredNotes
subjectIdnumberno
statementstringyes
explanationstringno
questionType'multiple_choice' | 'true_false' | 'essay' | 'fill_blank' | 'matching'noDefault multiple_choice
pointsnumbernoDefault 1
alternatives{ text, isCorrect }[]no
fillBlankAnswers{ answer, alternatives? }[]no
matchingPairs{ id, leftText, rightText }[]no

Estado atual da tentativa para o usuário; finaliza automaticamente uma tentativa em andamento expirada; resolve/cria um registro de person se nenhum existir.

Params
id (int)
Query
studentId?

Inicia uma nova tentativa, ou retorna uma existente em andamento e não expirada. Rejeita se a cota de tentativas foi esgotada ou o exame não tem questões.

Params
id (int)

Body

FieldTypeRequiredNotes
studentIdnumbernoAdmin-initiated attempt for another student

Salva respostas durante a tentativa com correção automática por tipo, onde aplicável.

Params
id, attemptId (int)

Body

FieldTypeRequiredNotes
answersSaveExamAttemptAnswerDto[]yes{ questionId, examOptionId?, answerText?, matchingPairs? }[]

Finaliza a tentativa, computa a pontuação e publica lms.exam.attempt.submitted. Idempotente se já concluída.

Params
id, attemptId (int)

Body

FieldTypeRequiredNotes
answersSaveExamAttemptAnswerDto[]yes
forcebooleannoBypass the require-all-answered check

Ferramentas MCP

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

  • lms.exams.list

    Lista exames com paginação e filtros opcionais

  • lms.exams.stats

    Retorna estatísticas agregadas de exames

  • lms.exams.get

    Retorna um único exame por ID

  • lms.exams.create

    Cria um novo exame

  • lms.exams.update

    Atualiza um exame existente

  • lms.exams.delete

    Remove um exame por ID

  • lms.exams.question-subjects.list

    Lista assuntos de questão (tópicos) disponíveis para questões de exame

  • lms.exams.question-subjects.create

    Cria um novo assunto de questão

  • lms.exams.questions.list

    Lista todas as questões de um exame

  • lms.exams.questions.create

    Cria uma nova questão para um exame

  • lms.exams.questions.update

    Atualiza uma questão em um exame

  • lms.exams.questions.delete

    Remove uma questão de um exame

  • lms.exams.questions.reorder

    Reordena questões dentro de um exame

  • lms.exams.attempt.get

    Retorna o estado atual da tentativa de um exame para o usuário autenticado

  • lms.exams.attempt.start

    Inicia uma nova tentativa de exame para o usuário autenticado

  • lms.exams.attempt.save-answers

    Salva respostas de uma tentativa de exame em andamento

  • lms.exams.attempt.submit

    Submete uma tentativa de exame para correção