Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
Submódulo LMS
courses
Gerenciamento do catálogo principal de cursos — CRUD, a árvore de conteúdo sessão/aula, integração com tarefas do Operations, transcrição/tradução de áudio, exportação SCORM e upload em massa de vídeos para o S3.
Caminho de origem: libraries/lms/src/course
Arquivo do módulo: course.module.ts
Introdução
O submódulo Courses é o maior do LMS e é dono de todo o pipeline de autoria de um curso, do registro de catálogo até os frames de vídeo individuais dentro de uma aula. O `CourseController` expõe operações no nível do catálogo — criar/atualizar/excluir, listagem filtrável por status/nível/categoria/tipo de oferta, estatísticas agregadas, um endpoint de visão geral de conteúdo que reporta contagens de módulos/aulas e cobertura de transcrição/XP, jobs de limpeza de armazenamento com escopo por categoria de arquivo e gerenciamento de jobs de exportação SCORM 1.2 com temática visual configurável (cores, fontes, layout da barra lateral).
O `CourseStructureController` é a superfície de edição para a árvore aninhada sessão → aula que compõe o conteúdo de um curso. Sessões (módulos) contêm aulas; aulas carregam um `tipo` de vídeo, questao (exame vinculado) ou post, além de metadata rica para o provedor de vídeo (YouTube, Vimeo, armazenamento de arquivo interno, Bunny ou custom), status de produção e uma lista de recursos opcional. Reordenação, duplicação, movimentações entre sessões e colar da área de transferência são todas operações de primeira classe, em vez de serem reconstruídas no cliente a partir de PATCHes da árvore completa — isso mantém árvores de curso grandes editáveis sem reenviar a estrutura inteira a cada mudança. Frames (imagens estáticas extraídas de um vídeo de aula em um timestamp) são gerenciados como seu próprio sub-recurso, suportando casos de uso como thumbnails gerados automaticamente ou marcadores de capítulo. Um endpoint dedicado de bulk-jobs permite que um editor redispare transcrição, recálculo de XP, processamento de vídeo ou tradução de transcrição em cada aula de um curso em uma única chamada, retornando um detalhamento por aula de enfileirado/pulado.
O tratamento de vídeo abrange três controllers trabalhando juntos: o `CourseStructureController` expõe video-processing-stats e enfileira jobs de conversão HLS por aula; o `CourseLessonController` (montado em `/lms/lessons`) é dono dos segmentos de transcrição (legendas com código de tempo), dos arquivos de áudio da aula e dispara jobs de transcrição/tradução em segundo plano; o `LmsBulkUploadController` fornece o pipeline de upload direto-para-S3 usado para ingerir arquivos de vídeo grandes — emitindo credenciais STS temporárias, verificando a conclusão do upload, rastreando o progresso de sessão/item para a UI de admin e vinculando um upload concluído diretamente a uma aula para disparar a conversão automatizada. O `LmsSettingController` expõe a superfície resultante de feature-flags (se transcrição, extração de imagens, embedding de YouTube/Vimeo e upload em massa estão habilitados, além da configuração resolvida de bucket S3/IAM), de modo que o frontend de admin possa renderizar condicionalmente a UI de upload/transcrição.
Notavelmente, vários dos endpoints mais novos (tradução de transcrição de aula, a maioria dos endpoints de sessão/webhook de upload em massa) aceitam formatos de body inline em TypeScript puro, em vez de DTOs com class-validator, portanto não recebem validação de payload em tempo de execução — uma lacuna deliberada ou incidental que vale conhecer antes de construir contratos estritos do lado do cliente contra eles.
Endpoints HTTP
54 endpoints
Lista de cursos paginada e filtrável.
- Query
- page, pageSize, search, status, level, category, offeringTypes
Estatísticas agregadas: total, cursos publicados, em destaque e total de alunos.
Visão geral de conteúdo: contagens de módulos/aulas por tipo e estado de publicação, cobertura de transcrição/XP, imagens extraídas e contagens de arquivos de armazenamento.
- Params
- id (int)
Enfileira um job assíncrono para excluir todos os arquivos de armazenamento de uma categoria do curso.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| category | string | yes | One of: video_original, video_profile, lesson_audio, extracted_image, student_download, supplementary_material, course_image, course_file, other_lesson_file, course_export |
Lista o histórico de jobs de exportação SCORM do curso.
- Params
- id (int)
Enfileira um job de exportação SCORM 1.2 para o curso com temática visual opcional.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| format | 'scorm_1_2' | yes | — |
| visualSettings | ScormVisualSettingsDto | no | primaryColor, fontFamily, fontSize, sidebarWidth, sidebarPosition, progressStyle, sidebarTheme |
| subtitleLocaleIds | number[] | no | — |
Exclui um registro/artefato de exportação do curso.
- Params
- id, exportId (int)
Detalhes completos do curso, incluindo categorias, imagens e instrutores das aulas.
- Params
- id (int)
Cria um curso.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Kebab-case, max 255 chars |
| name | string | no | Max 32 chars |
| title | string | no | Public title, max 255 chars |
| description | string | no | — |
| requirements | string | no | — |
| objectives | string | no | — |
| targetAudience | string | no | — |
| durationHours | number | no | — |
| certificateWorkload | number | no | — |
| level | 'beginner' | 'intermediate' | 'advanced' | no | — |
| status | 'draft' | 'published' | 'archived' | no | — |
| offeringType | 'scheduled' | 'on_demand' | 'blended' | no | — |
| isFeatured | boolean | no | — |
| hasCertificate | boolean | no | — |
| isListed | boolean | no | — |
| primaryColor | string | no | Hex #RRGGBB |
| secondaryColor | string | no | Hex #RRGGBB |
| certificateModel | string | null | no | — |
| logoFileId | number | null | no | — |
| bannerFileId | number | null | no | — |
| operationsProjectId | number | null | no | — |
| code | string | no | Uppercase/numbers, min 2 chars |
Atualiza os campos do curso (todos opcionais, mesmo formato da criação).
- Params
- id (int)
Exclui um curso.
- Params
- id (int)
Retorna a árvore aninhada completa sessão → aula.
- Params
- id (int)
Retorna os recursos suplementares no nível do curso.
- Params
- id (int)
Substitui a lista de recursos no nível do curso.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| recursos | CourseResourceDto[] | yes | { nome, fileId?, type?, is_public? }[] |
Adiciona uma sessão (módulo) ao curso.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| titulo | string | yes | Max 255 chars |
| duracao | number | yes | Duration in seconds, min 0 |
| codigo | string | no | Max 32 chars |
| descricao | string | no | — |
| published | boolean | no | — |
Reordena as sessões.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| sessionIds | number[] | yes | ArrayMinSize(1) |
Atualiza a metadata da sessão.
- Params
- id, sessionId (int)
Exclui uma sessão e suas aulas.
- Params
- id, sessionId (int)
Faz uma cópia profunda de uma sessão com todas as suas aulas.
- Params
- id, sessionId (int)
Adiciona uma aula a uma sessão.
- Params
- id, sessionId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| titulo | string | yes | Max 255 chars |
| tipo | 'video' | 'questao' | 'post' | yes | — |
| codigo | string | no | Max 32 chars |
| descricaoPublica | string | no | — |
| descricaoPrivada | string | no | — |
| duracao | number | no | Seconds, default 0 |
| published | boolean | no | — |
| statusProducao | 'preparada' | 'gravada' | 'editada' | 'finalizada' | 'publicada' | no | — |
| videoProvedor | 'youtube' | 'vimeo' | 'file_storage' | 'bunny' | 'custom' | no | — |
| videoUrl | string | no | — |
| exameVinculado | number | no | Linked exam ID, for tipo=questao |
| conteudoPost | string | no | For tipo=post |
| instructorIds | number[] | no | — |
| recursos | CourseLessonResourceDto[] | no | — |
Copia aulas previamente copiadas para esta sessão.
- Params
- id, sessionId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| lessonIds | number[] | yes | ArrayMinSize(1) |
Reordena as aulas dentro de uma sessão.
- Params
- id, sessionId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| lessonIds | number[] | yes | ArrayMinSize(1) |
Atualiza a metadata da aula.
- Params
- id, sessionId, lessonId (int)
Move uma aula para uma sessão/posição diferente.
- Params
- id, sessionId, lessonId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| toSessionId | number | yes | — |
| toIndex | number | no | Zero-based; appended at end if omitted |
Inicia o pipeline de vídeo (conversão HLS/profile) para um arquivo de vídeo original enviado.
- Params
- id, sessionId, lessonId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| originalFileId | number | yes | — |
Exclui uma aula.
- Params
- id, sessionId, lessonId (int)
Adiciona um frame (imagem extraída em um timestamp) vinculado a um arquivo já enviado.
- Params
- id, sessionId, lessonId (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| timeSeconds | number | yes | — |
| fileId | number | yes | — |
Atualiza um frame de aula.
- Params
- id, sessionId, lessonId, frameId (int)
Exclui um frame de aula.
- Params
- id, sessionId, lessonId, frameId (int)
Duplica uma aula dentro de sua sessão.
- Params
- id, sessionId, lessonId (int)
Contagens de aulas de vídeo: com/sem um arquivo original, já processadas.
- Params
- id (int)
Locales com segmentos de transcrição nas aulas do curso.
- Params
- id (int)
Enfileira em massa um tipo de job em segundo plano em cada aula do curso; retorna contagens de enfileirado/pulado.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| jobType | 'transcription' | 'xp_recalculation' | 'video_processing' | 'translate_transcription' | yes | — |
| reprocessAlreadyProcessed | boolean | no | — |
| targetLocaleId | number | no | — |
Configuração de integração com o módulo Operations para o curso (projeto vinculado, modo de tarefa, status de conclusão).
- Params
- id (int)
Atualiza a configuração de integração com o Operations.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| projectId | number | null | no | — |
| taskMode | 'per_lesson' | 'per_production_status' | null | no | — |
| completionStatus | string | null | no | — |
Cria quaisquer tarefas do Operations ausentes para as aulas do curso.
- Params
- id (int)
Segmentos de transcrição com código de tempo para uma aula, opcionalmente filtrados por locale.
- Params
- id (int, lessonId)
- Query
- locale_id?
Locales para os quais esta aula específica tem segmentos de transcrição.
- Params
- id (int)
Substitui todos os segmentos de transcrição da aula/locale.
- Params
- id (int)
- Query
- locale_id?
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| segments | { startSeconds, endSeconds, text }[] | yes | — |
Lista os arquivos lesson_audio anexados à aula.
- Params
- id (int)
Enfileira a transcrição de áudio da aula usando seus arquivos de áudio.
- Params
- id (int)
Enfileira um job de tradução de uma transcrição existente para outro locale.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| targetLocaleId | number | yes | — |
| sourceLocaleId | number | null | no | — |
Configuração de upload em massa (bucket, duração do STS, storage profile).
Emite credenciais STS temporárias para upload direto-para-S3.
Verifica um arquivo enviado no S3 ou (com configure:true) atualiza o storage profile/role Lambda do upload em massa.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| key | string | no | — |
| fileName | string | no | — |
| configure | boolean | no | — |
| storageProfileId | number | no | — |
| lambdaRoleArn | string | no | — |
Regenera e sincroniza o token de webhook do upload em massa.
Inicia um novo registro de rastreamento de sessão de upload em massa.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| appName | string | no | — |
| folderPath | string | null | no | — |
| files | { uploadId?, fileName?, sizeBytes? }[] | no | — |
Atualiza o progresso/status de uma sessão de upload em massa em andamento e seus itens.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| sessionId | number | no | — |
| status | string | no | — |
| progressPercent | number | no | — |
| items | { uploadId?, status?, progressPercent?, errorMessage?, uploadedKey? }[] | no | — |
Histórico de sessões/itens de upload em massa.
- Query
- page, pageSize, search, status
Verifica quais dos arquivos fornecidos já foram enviados (deduplicação).
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| files | { fileName?, sizeBytes? }[] | no | — |
Exclui registros históricos de sessão de upload em massa que correspondem aos status/janela de tempo fornecidos.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| statuses | ('received' | 'done' | 'error' | 'cancelled')[] | no | — |
| timeWindow | 'last_hour' | 'last_day' | 'last_week' | 'all_time' | no | — |
URL de vídeo pré-assinada para um item de upload em massa.
- Params
- id (int)
Vincula manualmente um item de vídeo enviado em massa a um curso/sessão/aula, disparando a automação de conversão.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| courseId | number | yes | — |
| sessionId | number | yes | — |
| lessonId | number | yes | — |
Feature flags do LMS (conversão de vídeo, transcrição, YouTube/Vimeo, configuração de bucket/role do upload em massa).
Ferramentas MCP
Ferramentas nomeadas que podem ser chamadas por modelos de IA através do Model Context Protocol (MCP).
lms.courses.listLista cursos com paginação e filtros opcionais
lms.courses.statsRetorna estatísticas resumidas de cursos
lms.courses.getRetorna um único curso por ID com detalhes completos
lms.courses.createCria um novo curso
lms.courses.updateAtualiza um curso existente
lms.courses.deleteRemove um curso por ID
lms.courses.structure.getRetorna a estrutura de conteúdo completa de um curso (módulos/sessões e suas aulas)
lms.courses.structure.sessions.createCria um novo módulo/sessão na estrutura de um curso
lms.courses.structure.sessions.reorderReordena módulos/sessões dentro da estrutura de um curso
lms.courses.structure.sessions.updateAtualiza um módulo/sessão na estrutura de um curso
lms.courses.structure.sessions.deleteExclui um módulo/sessão da estrutura de um curso
lms.courses.structure.sessions.duplicateDuplica um módulo/sessão com todas as suas aulas
lms.courses.structure.lessons.createCria uma nova aula dentro de um módulo/sessão
lms.courses.structure.lessons.pasteCola (copia) aulas de outra sessão para uma sessão
lms.courses.structure.lessons.reorderReordena aulas dentro de uma sessão
lms.courses.structure.lessons.updateAtualiza uma aula na estrutura do curso
lms.courses.structure.lessons.moveMove uma aula para uma sessão diferente
lms.courses.structure.lessons.deleteExclui uma aula da estrutura do curso
lms.courses.structure.lessons.duplicateDuplica uma aula dentro de sua sessão
lms.courses.structure.resources.getRetorna a lista de recursos (anexos de arquivo, links) de um curso
lms.courses.structure.resources.updateAtualiza a lista de recursos de um curso