Logotipo Hedhog

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

FieldTypeRequiredNotes
categorystringyesOne 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

FieldTypeRequiredNotes
format'scorm_1_2'yes
visualSettingsScormVisualSettingsDtonoprimaryColor, fontFamily, fontSize, sidebarWidth, sidebarPosition, progressStyle, sidebarTheme
subtitleLocaleIdsnumber[]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

FieldTypeRequiredNotes
slugstringyesKebab-case, max 255 chars
namestringnoMax 32 chars
titlestringnoPublic title, max 255 chars
descriptionstringno
requirementsstringno
objectivesstringno
targetAudiencestringno
durationHoursnumberno
certificateWorkloadnumberno
level'beginner' | 'intermediate' | 'advanced'no
status'draft' | 'published' | 'archived'no
offeringType'scheduled' | 'on_demand' | 'blended'no
isFeaturedbooleanno
hasCertificatebooleanno
isListedbooleanno
primaryColorstringnoHex #RRGGBB
secondaryColorstringnoHex #RRGGBB
certificateModelstring | nullno
logoFileIdnumber | nullno
bannerFileIdnumber | nullno
operationsProjectIdnumber | nullno
codestringnoUppercase/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

FieldTypeRequiredNotes
recursosCourseResourceDto[]yes{ nome, fileId?, type?, is_public? }[]

Adiciona uma sessão (módulo) ao curso.

Params
id (int)

Body

FieldTypeRequiredNotes
titulostringyesMax 255 chars
duracaonumberyesDuration in seconds, min 0
codigostringnoMax 32 chars
descricaostringno
publishedbooleanno

Reordena as sessões.

Params
id (int)

Body

FieldTypeRequiredNotes
sessionIdsnumber[]yesArrayMinSize(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

FieldTypeRequiredNotes
titulostringyesMax 255 chars
tipo'video' | 'questao' | 'post'yes
codigostringnoMax 32 chars
descricaoPublicastringno
descricaoPrivadastringno
duracaonumbernoSeconds, default 0
publishedbooleanno
statusProducao'preparada' | 'gravada' | 'editada' | 'finalizada' | 'publicada'no
videoProvedor'youtube' | 'vimeo' | 'file_storage' | 'bunny' | 'custom'no
videoUrlstringno
exameVinculadonumbernoLinked exam ID, for tipo=questao
conteudoPoststringnoFor tipo=post
instructorIdsnumber[]no
recursosCourseLessonResourceDto[]no

Copia aulas previamente copiadas para esta sessão.

Params
id, sessionId (int)

Body

FieldTypeRequiredNotes
lessonIdsnumber[]yesArrayMinSize(1)

Reordena as aulas dentro de uma sessão.

Params
id, sessionId (int)

Body

FieldTypeRequiredNotes
lessonIdsnumber[]yesArrayMinSize(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

FieldTypeRequiredNotes
toSessionIdnumberyes
toIndexnumbernoZero-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

FieldTypeRequiredNotes
originalFileIdnumberyes

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

FieldTypeRequiredNotes
timeSecondsnumberyes
fileIdnumberyes

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

FieldTypeRequiredNotes
jobType'transcription' | 'xp_recalculation' | 'video_processing' | 'translate_transcription'yes
reprocessAlreadyProcessedbooleanno
targetLocaleIdnumberno

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

FieldTypeRequiredNotes
projectIdnumber | nullno
taskMode'per_lesson' | 'per_production_status' | nullno
completionStatusstring | nullno

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

FieldTypeRequiredNotes
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

FieldTypeRequiredNotes
targetLocaleIdnumberyes
sourceLocaleIdnumber | nullno

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

FieldTypeRequiredNotes
keystringno
fileNamestringno
configurebooleanno
storageProfileIdnumberno
lambdaRoleArnstringno

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

FieldTypeRequiredNotes
appNamestringno
folderPathstring | nullno
files{ uploadId?, fileName?, sizeBytes? }[]no

Atualiza o progresso/status de uma sessão de upload em massa em andamento e seus itens.

Body

FieldTypeRequiredNotes
sessionIdnumberno
statusstringno
progressPercentnumberno
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

FieldTypeRequiredNotes
files{ fileName?, sizeBytes? }[]no

Exclui registros históricos de sessão de upload em massa que correspondem aos status/janela de tempo fornecidos.

Body

FieldTypeRequiredNotes
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

FieldTypeRequiredNotes
courseIdnumberyes
sessionIdnumberyes
lessonIdnumberyes

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.list

    Lista cursos com paginação e filtros opcionais

  • lms.courses.stats

    Retorna estatísticas resumidas de cursos

  • lms.courses.get

    Retorna um único curso por ID com detalhes completos

  • lms.courses.create

    Cria um novo curso

  • lms.courses.update

    Atualiza um curso existente

  • lms.courses.delete

    Remove um curso por ID

  • lms.courses.structure.get

    Retorna a estrutura de conteúdo completa de um curso (módulos/sessões e suas aulas)

  • lms.courses.structure.sessions.create

    Cria um novo módulo/sessão na estrutura de um curso

  • lms.courses.structure.sessions.reorder

    Reordena módulos/sessões dentro da estrutura de um curso

  • lms.courses.structure.sessions.update

    Atualiza um módulo/sessão na estrutura de um curso

  • lms.courses.structure.sessions.delete

    Exclui um módulo/sessão da estrutura de um curso

  • lms.courses.structure.sessions.duplicate

    Duplica um módulo/sessão com todas as suas aulas

  • lms.courses.structure.lessons.create

    Cria uma nova aula dentro de um módulo/sessão

  • lms.courses.structure.lessons.paste

    Cola (copia) aulas de outra sessão para uma sessão

  • lms.courses.structure.lessons.reorder

    Reordena aulas dentro de uma sessão

  • lms.courses.structure.lessons.update

    Atualiza uma aula na estrutura do curso

  • lms.courses.structure.lessons.move

    Move uma aula para uma sessão diferente

  • lms.courses.structure.lessons.delete

    Exclui uma aula da estrutura do curso

  • lms.courses.structure.lessons.duplicate

    Duplica uma aula dentro de sua sessão

  • lms.courses.structure.resources.get

    Retorna a lista de recursos (anexos de arquivo, links) de um curso

  • lms.courses.structure.resources.update

    Atualiza a lista de recursos de um curso