npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hed-hog/lms

v0.0.357

Published

```markdown # @hed-hog/lms

Downloads

4,025

Readme

# @hed-hog/lms

## 1. Visão geral do módulo

O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Management System (LMS) dentro do monorepo HedHog. Ele oferece funcionalidades para gerenciamento de cursos, aulas, avaliações, certificados, matrículas, instrutores, trilhas de aprendizagem e demais componentes relacionados ao ambiente educacional digital.

## 2. Escopo e responsabilidades

- Gerenciamento de cursos, módulos, aulas e suas respectivas estruturas.
- Controle de matrículas em cursos e trilhas de aprendizagem.
- Administração de avaliações, tentativas e respostas.
- Emissão e verificação de certificados.
- Gestão de instrutores e suas atribuições.
- Controle de presenças em aulas presenciais ou online.
- Organização de trilhas de aprendizagem e seus passos.
- Suporte a imagens e arquivos relacionados a cursos, exames e trilhas.
- Avaliações e feedbacks sobre tópicos específicos do LMS.
- Gestão de turmas (class groups), sessões e presença.
- Administração de empresas (enterprises) e seus usuários, cursos, turmas e leads.
- Dashboard com KPIs e estatísticas do LMS.

## 3. Endpoints

### Certificados

| Método | Path                                      | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|-------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/certificates/templates               | Sim          | Lista templates de certificados com paginação e filtros.                                       | Query: `page` (número), `pageSize` (número), `search` (string), `status` (draft|active|inactive)   | Paginação com lista de templates e seus dados básicos.                                    | Status inválido, parâmetros inválidos     |
| GET    | /lms/certificates/templates/:id           | Sim          | Obtém template de certificado pelo ID.                                                        | Param: `id` (número)                                                                              | Dados do template de certificado.                                                         | Template não encontrado                   |
| POST   | /lms/certificates/templates               | Sim          | Cria um novo template de certificado.                                                         | Body: `CreateCertificateTemplateDto`                                                              | Template criado com dados completos.                                                      | JSON inválido em templateContent, slug duplicado |
| PATCH  | /lms/certificates/templates/:id           | Sim          | Atualiza template existente.                                                                   | Param: `id` (número), Body: `UpdateCertificateTemplateDto`                                        | Template atualizado.                                                                       | Template não encontrado, JSON inválido   |
| DELETE | /lms/certificates/templates/:id           | Sim          | Remove template de certificado pelo ID.                                                       | Param: `id` (número)                                                                              | `{ success: true }`                                                                         | Template não encontrado, restrição de exclusão |
| POST   | /lms/certificates/templates/background-image | Sim        | Upload de imagem de fundo para template.                                                      | Form-data: campo `file` (imagem)                                                                  | Dados do arquivo enviado (id, url, filename, etc).                                       | Arquivo ausente, tipo inválido            |
| GET    | /lms/certificates/issued                  | Sim          | Lista certificados emitidos com paginação e filtros.                                          | Query: `page`, `pageSize`, `search`, `type` (course|exam|course_class_group|learning_path)         | Paginação com lista de certificados emitidos e dados relacionados.                        | Tipo inválido                            |

### Turmas (Class Groups)

| Método | Path                                   | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/classes                          | Sim          | Lista turmas com paginação e filtros.                                                         | Query: `page`, `pageSize`, `search`, `status` (open|ongoing|completed|cancelled), `deliveryMode` (presential|online|hybrid), `courseId` | Paginação com lista de turmas e dados resumidos.                                         | Status ou deliveryMode inválidos          |
| GET    | /lms/classes/stats                    | Sim          | Estatísticas gerais das turmas.                                                                | -                                                                                                 | Estatísticas como total, vagas abertas, taxa de ocupação, etc.                            | -                                        |
| GET    | /lms/classes/:id                      | Sim          | Obtém turma pelo ID.                                                                           | Param: `id` (número)                                                                              | Dados detalhados da turma, incluindo resumo de sessões.                                  | Turma não encontrada                      |
| POST   | /lms/classes                          | Sim          | Cria nova turma.                                                                              | Body: `CreateClassGroupDto`                                                                        | Dados da turma criada.                                                                    | Curso ou instrutor não encontrados, conflito de código |
| PATCH  | /lms/classes/:id                      | Sim          | Atualiza turma.                                                                               | Param: `id` (número), Body: `UpdateClassGroupDto`                                                | Dados da turma atualizada.                                                                | Turma não encontrada, conflito de código |
| DELETE | /lms/classes/:id                      | Sim          | Remove turma pelo ID.                                                                         | Param: `id` (número)                                                                              | `{ success: true }`                                                                         | Turma não encontrada                      |

#### Pessoas na turma (estudantes e instrutores)

| Método | Path                                   | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/classes/:id/people/search        | Sim          | Pesquisa pessoas para adicionar na turma.                                                     | Param: `id` (número), Query: `q` (string)                                                        | Lista de pessoas com flags de instrutor e matrícula.                                     | Turma não encontrada                      |
| GET    | /lms/classes/:id/students             | Sim          | Lista estudantes matriculados na turma.                                                      | Param: `id` (número), Query: `search` (string)                                                  | Lista de estudantes com dados de contato e status.                                      | Turma não encontrada                      |
| POST   | /lms/classes/:id/students             | Sim          | Matricula estudante existente na turma.                                                     | Param: `id` (número), Body: `{ personId: number }`                                              | Dados da matrícula criada ou atualizada.                                               | Turma ou estudante não encontrados, matrícula duplicada |
| POST   | /lms/classes/:id/students/create      | Sim          | Cria pessoa e matricula na turma.                                                           | Param: `id` (número), Body: `CreateStudentAndEnrollDto`                                        | Dados da pessoa criada e matriculada.                                                  | Turma não encontrada, dados inválidos    |
| GET    | /lms/classes/:id/students/:personId  | Sim          | Obtém perfil do estudante na turma.                                                        | Param: `id` (número), `personId` (número)                                                      | Dados do estudante com contatos e status.                                              | Matrícula não encontrada                  |
| PATCH  | /lms/classes/:id/students/:personId  | Sim          | Atualiza perfil do estudante na turma.                                                     | Param: `id` (número), `personId` (número), Body: `UpdateStudentProfileDto`                      | Dados atualizados do estudante.                                                        | Matrícula não encontrada, dados inválidos |
| DELETE | /lms/classes/:id/students/:personId  | Sim          | Remove estudante da turma (status cancelado).                                              | Param: `id` (número), `personId` (número)                                                      | `{ success: true }`                                                                       | Matrícula não encontrada                  |

#### Sessões da turma

| Método | Path                                   | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|----------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/classes/:id/sessions             | Sim          | Lista sessões da turma.                                                                       | Param: `id` (número)                                                                             | Lista de sessões com dados detalhados.                                                 | Turma não encontrada                      |
| POST   | /lms/classes/:id/sessions             | Sim          | Cria sessão na turma.                                                                         | Param: `id` (número), Body: `CreateSessionDto`                                                  | Dados da sessão criada.                                                                 | Turma ou instrutor não encontrados, dados inválidos |
| PATCH  | /lms/classes/:id/sessions/:sessionId  | Sim          | Atualiza sessão.                                                                             | Param: `id` (número), `sessionId` (número), Body: `UpdateSessionDto`                            | Dados da sessão atualizada.                                                             | Sessão não encontrada, dados inválidos   |
| DELETE | /lms/classes/:id/sessions/:sessionId  | Sim          | Remove sessão.                                                                               | Param: `id` (número), `sessionId` (número), Query: `scope` = `single` ou `series`                | `{ success: true }`                                                                       | Sessão não encontrada                      |

#### Presença em sessões

| Método | Path                                           | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|------------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/classes/:id/sessions/:sessionId/attendance | Sim          | Obtém lista de presenças na sessão.                                                          | Param: `id` (número), `sessionId` (número)                                                      | Lista de presenças com dados do estudante e status de presença.                          | Sessão não encontrada                      |
| POST   | /lms/classes/:id/sessions/:sessionId/attendance | Sim          | Salva presenças.                                                                             | Param: `id` (número), `sessionId` (número), Body: `SaveAttendanceDto`                           | `{ success: true }`                                                                       | Sessão não encontrada                      |

### Cursos

| Método | Path                  | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|-----------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/courses          | Sim          | Lista cursos com paginação e filtros.                                                        | Query: `page`, `pageSize`, `search`, `status` (draft|published|archived), `level` (beginner|intermediate|advanced), `category` (slug) | Paginação com lista de cursos e dados resumidos.                                        | Status ou level inválidos                  |
| GET    | /lms/courses/stats    | Sim          | Estatísticas gerais dos cursos.                                                               | -                                                                                                 | KPIs como total, publicados, estudantes, etc.                                           | -                                        |
| GET    | /lms/courses/:id      | Sim          | Obtém curso pelo ID.                                                                          | Param: `id` (número)                                                                              | Dados detalhados do curso, incluindo módulos, aulas e instrutores.                      | Curso não encontrado                      |
| POST   | /lms/courses          | Sim          | Cria novo curso.                                                                             | Body: `CreateCourseDto`                                                                           | Dados do curso criado.                                                                   | Dados inválidos, slug duplicado           |
| PATCH  | /lms/courses/:id      | Sim          | Atualiza curso.                                                                              | Param: `id` (número), Body: `UpdateCourseDto`                                                   | Dados do curso atualizado.                                                              | Curso não encontrado, dados inválidos     |
| DELETE | /lms/courses/:id      | Sim          | Remove curso pelo ID.                                                                        | Param: `id` (número)                                                                              | `{ success: true }`                                                                       | Curso não encontrado                      |

### Estrutura do curso

| Método | Path                                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|----------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/courses/:id/structure                   | Sim          | Obtém estrutura do curso (módulos e aulas).                                                  | Param: `id` (número)                                                                              | Estrutura com sessões (módulos) e aulas detalhadas.                                      | Curso não encontrado                      |
| POST   | /lms/courses/:id/structure/sessions          | Sim          | Cria módulo (sessão) no curso.                                                               | Param: `id` (número), Body: `CreateCourseStructureSessionDto`                                   | Dados do módulo criado.                                                                  | Curso não encontrado, dados inválidos     |
| PATCH  | /lms/courses/:id/structure/sessions/:sessionId | Sim        | Atualiza módulo.                                                                             | Param: `id` (número), `sessionId` (número), Body: `UpdateCourseStructureSessionDto`             | Dados do módulo atualizado.                                                             | Módulo não encontrado                     |
| DELETE | /lms/courses/:id/structure/sessions/:sessionId | Sim        | Remove módulo.                                                                              | Param: `id` (número), `sessionId` (número)                                                     | `{ success: true }`                                                                       | Módulo não encontrado                     |
| POST   | /lms/courses/:id/structure/sessions/:sessionId/lessons | Sim | Cria aula no módulo.                                                                         | Param: `id` (número), `sessionId` (número), Body: `CreateCourseStructureLessonDto`             | Dados da aula criada.                                                                    | Módulo não encontrado, dados inválidos    |
| PATCH  | /lms/courses/:id/structure/sessions/:sessionId/lessons/:lessonId | Sim | Atualiza aula.                                                                             | Param: `id` (número), `sessionId` (número), `lessonId` (número), Body: `UpdateCourseStructureLessonDto` | Dados da aula atualizada.                                                                | Aula não encontrada                       |
| DELETE | /lms/courses/:id/structure/sessions/:sessionId/lessons/:lessonId | Sim | Remove aula.                                                                              | Param: `id` (número), `sessionId` (número), `lessonId` (número)                               | `{ success: true }`                                                                       | Aula não encontrada                       |

### Exames (tentativas)

| Método | Path                                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|----------------------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/exams/:id/attempt                        | Sim          | Obtém estado da tentativa de exame para usuário.                                              | Param: `id` (número), Query opcional: `studentId` (número)                                       | Estado atual da tentativa ou nulo.                                                      | Exame não encontrado                      |
| POST   | /lms/exams/:id/attempt/start                  | Sim          | Inicia tentativa de exame.                                                                   | Param: `id` (número), Body: `StartExamAttemptDto`                                                | Dados da tentativa iniciada.                                                           | Exame não encontrado                      |
| PATCH  | /lms/exams/:id/attempt/:attemptId/answers    | Sim          | Salva respostas da tentativa.                                                                | Param: `id` (número), `attemptId` (número), Body: `SaveExamAttemptAnswersDto`                    | Dados atualizados da tentativa.                                                       | Tentativa não encontrada                  |
| POST   | /lms/exams/:id/attempt/:attemptId/submit     | Sim          | Submete tentativa de exame.                                                                  | Param: `id` (número), `attemptId` (número), Body: `SubmitExamAttemptDto`                         | Resultado da submissão.                                                               | Tentativa não encontrada                  |

### Dashboard

| Método | Path            | Autenticação | Descrição                                                                                      | Params/Query/Body | Resposta                                                                                   | Erros Comuns |
|--------|-----------------|--------------|------------------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|--------------|
| GET    | /lms/dashboard  | Sim          | Obtém dados do dashboard do LMS com KPIs, gráficos, eventos, matrículas recentes e próximas turmas. | Header: `accept-language` (opcional) | Dados agregados para dashboard do LMS.                                                  | -            |

### Enterprise (Empresas)

| Método | Path                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/enterprise              | Sim          | Lista empresas com paginação e filtros.                                                      | Query: `page`, `pageSize`, `search`, `status`, `crmPersonId`                                     | Paginação com lista de empresas.                                                        | -                                        |
| POST   | /lms/enterprise              | Sim          | Cria nova empresa.                                                                           | Body: `CreateEnterpriseDto`                                                                       | Dados da empresa criada.                                                                | Dados inválidos                          |
| GET    | /lms/enterprise/:id          | Sim          | Obtém empresa pelo ID.                                                                       | Param: `id` (número)                                                                              | Dados da empresa.                                                                       | Empresa não encontrada                   |
| PATCH  | /lms/enterprise/:id          | Sim          | Atualiza empresa.                                                                            | Param: `id` (número), Body: `UpdateEnterpriseDto`                                               | Dados da empresa atualizada.                                                           | Empresa não encontrada                   |
| DELETE | /lms/enterprise/:id          | Sim          | Remove empresa pelo ID.                                                                      | Param: `id` (número)                                                                              | `{ success: true }`                                                                       | Empresa não encontrada                   |

#### Usuários da empresa

| Método | Path                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/enterprise/:id/users    | Sim          | Lista usuários da empresa com paginação e filtro.                                            | Param: `id` (número), Query: `page`, `pageSize`, `search`                                        | Paginação com lista de usuários.                                                        | Empresa não encontrada                   |
| POST   | /lms/enterprise/:id/users    | Sim          | Adiciona usuário à empresa.                                                                  | Param: `id` (número), Body: `AddEnterpriseUserDto`                                              | Dados do usuário adicionado.                                                           | Empresa não encontrada, dados inválidos  |
| PATCH  | /lms/enterprise/:id/users/:userId | Sim      | Atualiza usuário da empresa.                                                                 | Param: `id` (número), `userId` (número), Body: `UpdateEnterpriseUserDto`                        | Dados do usuário atualizado.                                                           | Usuário ou empresa não encontrados       |
| DELETE | /lms/enterprise/:id/users/:userId | Sim      | Remove usuário da empresa.                                                                   | Param: `id` (número), `userId` (número)                                                        | `{ success: true }`                                                                       | Usuário ou empresa não encontrados       |

#### Cursos da empresa

| Método | Path                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/enterprise/:id/courses  | Sim          | Lista cursos da empresa com paginação e filtro.                                              | Param: `id` (número), Query: `page`, `pageSize`, `search`                                        | Paginação com lista de cursos.                                                          | Empresa não encontrada                   |
| POST   | /lms/enterprise/:id/courses  | Sim          | Adiciona curso à empresa.                                                                    | Param: `id` (número), Body: `AddEnterpriseCourseDto`                                            | Dados do curso adicionado.                                                             | Empresa não encontrada, dados inválidos  |
| DELETE | /lms/enterprise/:id/courses/:courseId | Sim    | Remove curso da empresa.                                                                     | Param: `id` (número), `courseId` (número)                                                      | `{ success: true }`                                                                       | Curso ou empresa não encontrados         |

#### Turmas da empresa

| Método | Path                         | Autenticação | Descrição                                                                                      | Params/Query/Body                                                                                   | Resposta                                                                                   | Erros Comuns                              |
|--------|------------------------------|--------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|------------------------------------------|
| GET    | /lms/enterprise/:id/classes  | Sim          | Lista turmas da empresa com paginação e filtro.                                              | Param: `id` (número), Query: `page`, `pageSize`, `search`                                        | Paginação com lista de turmas.                                                          | Empresa não encontrada                   |
| POST   | /lms/enterprise/:id/classes  | Sim          | Adiciona turma à empresa.                                                                    | Param: `id` (número), Body: `AddEnterpriseClassGroupDto`                                        | Dados da turma adicionada.                                                             | Empresa não encontrada, dados inválidos  |
| DELETE | /lms/enterprise/:id/classes/:classGroupId | Sim | Remove turma da empresa.                                                                     | Param: `id` (número), `classGroupId` (número)                                                  | `{ success: true }`                                                                       | Turma ou empresa não encontrados         |

## 4. Regras de autenticação e autorização

- Existe o papel (`role`) `admin-lms` com permissão total para gestão do LMS.
- Autenticação e autorização são gerenciadas externamente, utilizando o papel `admin-lms` para operações administrativas.
- Regras específicas de acesso devem ser implementadas conforme a integração com o sistema de autenticação do HedHog.

## 5. Estruturas de request/response

### Exemplos principais de DTOs usados nos endpoints

- **CreateCertificateTemplateDto**

  ```ts
  {
    name: string; // obrigatório, max 255
    slug?: string; // opcional, max 255
    description?: string; // opcional
    templateContent: string; // obrigatório, JSON válido
    status?: 'draft' | 'active' | 'inactive'; // opcional
  }
  • CreateClassGroupDto

    {
      code: string; // obrigatório, max 50
      courseId: number; // obrigatório
      instructorId?: number; // opcional
      title: string; // obrigatório, max 255
      description?: string; // opcional
      deliveryMode: 'presential' | 'online' | 'hybrid'; // obrigatório
      status?: 'open' | 'ongoing' | 'completed' | 'cancelled'; // opcional
      startDate: string; // obrigatório, ISO8601
      endDate?: string; // opcional, ISO8601
      startTime?: string; // opcional, formato HH:mm
      endTime?: string; // opcional, formato HH:mm
      weekDays?: string; // opcional
      capacity?: number; // opcional, mínimo 1
      location?: string; // opcional
      virtualRoomUrl?: string; // opcional, URL
      sessionTemplate?: {
        title: string;
        description?: string;
        location?: string;
        meetingUrl?: string;
        color?: string; // formato #RRGGBB
        recurrence?: {
          frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
          interval?: number;
          until: string; // ISO8601
          daysOfWeek?: Array<'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU'>;
        };
      };
    }
  • EnrollStudentDto

    {
      personId: number; // obrigatório
    }
  • SaveAttendanceDto

    {
      attendance: Array<{
        studentId: number; // obrigatório
        present: boolean; // obrigatório
        justification?: string; // opcional
      }>;
    }
  • CreateCourseDto

    {
      code?: string; // opcional, max 32
      slug: string; // obrigatório, max 255
      title?: string; // opcional, max 255
      description?: string; // opcional
      requirements?: string; // opcional
      objectives?: string; // opcional
      targetAudience?: string; // opcional
      durationHours?: number; // opcional
      certificateWorkload?: number; // opcional
      level?: 'beginner' | 'intermediate' | 'advanced'; // opcional
      status?: 'draft' | 'published' | 'archived'; // opcional
      offeringType?: 'scheduled' | 'on_demand' | 'blended'; // opcional
      isFeatured?: boolean; // opcional
      hasCertificate?: boolean; // opcional
      isListed?: boolean; // opcional
      primaryColor?: string; // opcional, formato #RRGGBB
      primaryContrastColor?: string; // opcional, formato #RRGGBB
      secondaryColor?: string; // opcional, formato #RRGGBB
      secondaryContrastColor?: string; // opcional, formato #RRGGBB
      categorySlugs?: string[]; // opcional
      instructorIds?: number[]; // opcional
      logoFileId?: number; // opcional
      bannerFileId?: number; // opcional
    }
  • CreateCourseStructureLessonDto

    {
      codigo?: string; // opcional, max 32
      titulo: string; // obrigatório, max 255
      descricaoPublica?: string; // opcional
      descricaoPrivada?: string; // opcional
      tipo: 'video' | 'questao' | 'post' | 'exercicio'; // obrigatório
      duracao: number; // obrigatório, minutos
      videoProvedor?: 'youtube' | 'vimeo' | 'bunny' | 'custom'; // opcional
      videoUrl?: string; // opcional
      duracaoAutomatica?: boolean; // opcional
      transcricao?: string; // opcional
      exameVinculado?: number; // opcional
      conteudoPost?: string; // opcional
      instructorIds?: number[]; // opcional
      recursos?: Array<{
        nome: string; // obrigatório
        fileId?: number; // opcional
        tipo?: string; // opcional
        publico?: boolean; // opcional
      }>;
    }
  • CreateSessionDto

    {
      title: string; // obrigatório, max 255
      description?: string; // opcional
      sessionDate: string; // obrigatório, ISO8601
      startTime: string; // obrigatório, formato HH:mm
      endTime: string; // obrigatório, formato HH:mm
      location?: string; // opcional
      meetingUrl?: string; // opcional, max 500
      color?: string; // opcional, formato #RRGGBB
      status?: 'scheduled' | 'completed' | 'cancelled'; // opcional
      instructorId?: number; // opcional
      recurrence?: {
        frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
        interval?: number;
        until: string; // ISO8601
        daysOfWeek?: Array<'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU'>;
      }; // opcional
    }
  • StartExamAttemptDto

    {
      studentId?: number; // opcional
    }
  • SaveExamAttemptAnswersDto

    {
      answers: Array<{
        questionId: number;
        examOptionId?: number | null;
        answerText?: string | null;
        matchingPairs?: Array<{
          leftId: string;
          rightId: string;
        }>;
      }>;
    }
  • SubmitExamAttemptDto

    Extende SaveExamAttemptAnswersDto com:

    {
      force?: boolean; // opcional
    }
  • CreateEnterpriseDto

    {
      name: string; // obrigatório, max 255
      slug?: string; // opcional, max 255
      status?: 'active' | 'trial' | 'inactive' | 'suspended'; // opcional
      crmPersonId?: number | null; // opcional
      portalEnabled?: boolean; // opcional
      licenseLimit?: number | null; // opcional
      notes?: string; // opcional
    }
  • AddEnterpriseUserDto

    {
      userId: number; // obrigatório
      personId?: number | null; // opcional
      role: 'student' | 'hr_manager' | 'enterprise_admin' | 'viewer'; // obrigatório
      status?: 'active' | 'inactive' | 'pending'; // opcional
    }

6. Erros comuns

  • Violação de integridade referencial: ao inserir ou atualizar registros com chaves estrangeiras inválidas.
  • Duplicidade de registros únicos: como códigos únicos de certificado, slugs de cursos ou templates.
  • Status inválidos: ao definir valores fora dos enums para status de cursos, exames, matrículas, etc.
  • Campos obrigatórios ausentes: como títulos, slugs e chaves primárias.
  • Datas ou horários inválidos: datas mal formatadas ou horários inconsistentes (ex: hora fim antes da hora início).
  • Tentativa de matrícula duplicada: ao tentar matricular estudante já matriculado ativo.
  • Arquivo inválido no upload: ao enviar arquivo não-imagem para upload de background de template.
  • Entidades não encontradas: ao referenciar IDs inexistentes (curso, turma, sessão, usuário, etc).
  • Conflito de código: ao tentar criar ou atualizar turma com código já existente.

7. Banco de dados (tabelas YAML)

Abaixo estão as principais tabelas do módulo LMS com suas finalidades e detalhes.

certificate

  • Finalidade: Armazena certificados emitidos para estudantes em cursos, exames, grupos de aulas ou trilhas de aprendizagem.
  • Colunas:
    • id (PK)
    • verification_code (varchar 50, único): código para verificação do certificado.
    • student_id (FK para person.id, onDelete CASCADE)
    • course_enrollment_id (FK opcional para course_enrollment.id, onDelete SET NULL)
    • course_id (FK opcional para course.id, onDelete SET NULL)
    • exam_id (FK opcional para exam.id, onDelete SET NULL)
    • course_class_group_id (FK opcional para course_class_group.id, onDelete SET NULL)
    • learning_path_id (FK opcional para learning_path.id, onDelete SET NULL)
    • certificate_template_id (FK para certificate_template.id)
    • certificate_type (enum: course, exam, course_class_group, learning_path)
    • student_name (varchar 255)
    • course_name (varchar 255)
    • workload_hours (int)
    • issued_at (datetime)
    • completed_at (datetime)
    • final_score (int, nullable)
    • verification_url (varchar 500, nullable)
    • pdf_url (varchar 500, nullable)
    • created_at, updated_at
  • Defaults: timestamps automáticos.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: chaves estrangeiras com regras onDelete conforme descrito.
  • Índices: único em verification_code.

certificate_template

  • Finalidade: Modelos de certificados para emissão.
  • Colunas:
    • id (PK)
    • name (varchar 255)
    • slug (varchar 255, único)
    • description (text, nullable)
    • template_content (text)
    • status (enum: draft, active, inactive, default draft)
    • created_at, updated_at
  • Defaults: status default draft.
  • Nulabilidade: description nullable.
  • Integridade: -
  • Índices: único em slug.

course_class_group

  • Finalidade: Grupos de aulas de um curso.
  • Colunas:
    • id (PK)
    • course_id (FK para course.id, onDelete CASCADE)
    • title (varchar 255)
    • code (varchar 50, único)
    • description (text, nullable)
    • delivery_mode (enum: presential, online, hybrid)
    • status (enum: open, ongoing, completed, cancelled, default open)
    • start_date (datetime)
    • end_date (datetime, nullable)
    • start_time (varchar 5, nullable)
    • end_time (varchar 5, nullable)
    • week_days (text, nullable)
    • capacity (int, default 30)
    • location (text, nullable)
    • virtual_room_url (varchar 500, nullable)
    • created_at, updated_at
  • Defaults: status default open, capacity default 30.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: FK com onDelete CASCADE.
  • Índices: único em code.

course_class_session

  • Finalidade: Sessões específicas dentro de um grupo de aula.
  • Colunas:
    • id (PK)
    • course_class_group_id (FK para course_class_group.id, onDelete CASCADE)
    • title (varchar 255)
    • description (text, nullable)
    • session_date (datetime)
    • start_time (varchar 5)
    • end_time (varchar 5)
    • location (text, nullable)
    • meeting_url (varchar 500, nullable)
    • status (enum: scheduled, completed, cancelled, default scheduled)
    • recurrence_id (uuid, nullable)
    • recurrence_rule (text, nullable)
    • occurrence_index (int, nullable)
    • is_exception (boolean, default false)
    • parent_session_id (FK opcional para course_class_session.id, onDelete SET NULL)
    • created_at, updated_at
  • Defaults: status default scheduled, is_exception default false.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: FK com onDelete CASCADE.
  • Índices: combinação course_class_group_id + session_date.

course_enrollment

  • Finalidade: Matrículas de pessoas em cursos ou grupos de aula.
  • Colunas:
    • id (PK)
    • person_id (FK para person.id, onDelete CASCADE)
    • course_class_group_id (FK opcional para course_class_group.id, onDelete SET NULL)
    • course_id (FK para course.id, onDelete CASCADE)
    • status (enum: pending, active, completed, cancelled, paused, default active)
    • enrolled_at (datetime)
    • completed_at (datetime, nullable)
    • progress_percent (int, default 0)
    • final_score (int, nullable)
    • created_at, updated_at
  • Defaults: status default active, progress_percent default 0.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: FK com onDelete conforme descrito.
  • Índices: único em combinação person_id + course_class_group_id.

course

  • Finalidade: Cursos disponíveis no LMS.
  • Colunas:
    • id (PK)
    • title (varchar 255)
    • slug (varchar 255, único)
    • description (text, nullable)
    • short_description (varchar 500, nullable)
    • level (enum: beginner, intermediate, advanced, default beginner)
    • duration_hours (int, default 0)
    • status (enum: draft, published, archived, default draft)
    • primary_color, primary_contrast_color, secondary_color, secondary_contrast_color (varchar 9, nullable)
    • certificate_workload (int, nullable)
    • certificate_template_id (FK opcional para certificate_template.id, onDelete SET NULL)
    • requirements, objectives, target_audience (text, nullable)
    • created_at, updated_at
  • Defaults: level default beginner, duration_hours default 0, status default draft.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: FK para certificate_template com onDelete SET NULL.
  • Índices: único em slug.

instructor

  • Finalidade: Instrutores cadastrados no LMS.
  • Colunas:
    • id (PK)
    • person_id (FK único para person.id, onDelete CASCADE)
    • status (enum: active, inactive, default active)
    • can_teach_courses (boolean, default true)
    • created_at, updated_at
  • Defaults: status default active, can_teach_courses default true.
  • Integridade: FK único com onDelete CASCADE.
  • Índices: único em person_id.

learning_path

  • Finalidade: Trilhas de aprendizagem compostas por cursos e exames.
  • Colunas:
    • id (PK)
    • title (varchar 255)
    • slug (varchar 255, único)
    • description (text, nullable)
    • short_description (varchar 500, nullable)
    • level (enum: beginner, intermediate, advanced, default beginner)
    • duration_hours (int, default 0)
    • status (enum: draft, active, archived, default draft)
    • primary_color, primary_contrast_color, secondary_color, secondary_contrast_color (varchar 9, nullable)
    • created_at, updated_at
  • Defaults: level default beginner, duration_hours default 0, status default draft.
  • Nulabilidade: campos opcionais indicados.
  • Integridade: -
  • Índices: único em slug.

learning_path_enrollment

  • Finalidade: Matrículas em trilhas de aprendizagem.
  • Colunas:
    • id (PK)
    • learning_path_id (FK para learning_path.id, onDelete CASCADE)
    • person_id (FK para person.id, onDelete CASCADE)
    • status (enum: active, completed, cancelled, default active)
    • progress_percent (int, default 0)
    • enrolled_at (datetime)
    • completed_at (datetime, nullable)
    • created_at, updated_at
  • Defaults: status default active, progress_percent default 0.
  • Nulabilidade: completed_at opcional.
  • Integridade: FK com onDelete CASCADE.
  • Índices: único em combinação learning_path_id + person_id.

8. Regras de negócio relevantes

  • Certificados são vinculados a estudantes e podem estar associados a diferentes tipos de atividades (curso, exame, grupo de aula, trilha).
  • Cursos, exames e trilhas possuem status que controlam sua visibilidade e disponibilidade.
  • Matrículas e inscrições possuem status que refletem o progresso e situação do aluno.
  • Avaliações e tentativas de exame são controladas para permitir múltiplas tentativas e registrar resultados detalhados.
  • Instrutores podem ter papéis distintos (líder ou assistente) em aulas e sessões.
  • Trilhas de aprendizagem são compostas por passos ordenados que podem ser cursos ou exames, podendo ser obrigatórios ou opcionais.
  • Progresso em aulas e cursos é monitorado para permitir acompanhamento detalhado do aluno.
  • Imagens e arquivos são organizados por tipo e podem ser marcados como primários para exibição.
  • Turmas possuem capacidade máxima e status que impactam matrículas e ocupação.
  • Sessões podem ser recorrentes com regras de recorrência definidas e exceções.
  • Presença em sessões é registrada individualmente com possibilidade de justificativas.
  • Ao criar ou atualizar templates de certificado, o conteúdo deve ser JSON válido.
  • Slugs de templates são únicos e gerados automaticamente se não fornecidos.
  • Ao matricular estudantes, verifica-se se já existe matrícula ativa para evitar duplicidade.
  • Atualizações em séries de sessões podem ser aplicadas a uma única sessão ou a toda a série.
  • Empresas (enterprises) gerenciam usuários, cursos, turmas e leads com papéis e status específicos.
  • Dashboard agrega dados e estatísticas para monitoramento do LMS.

9. Guia rápido de uso (exemplos)

Como o módulo é consumido via APIs internas do HedHog, os exemplos abaixo ilustram chamadas típicas usando Prisma ORM.

Criar um novo curso

const novoCurso = await prisma.course.create({
  data: {
    title: 'Introdução ao HedHog LMS',
    slug: 'introducao-hedhog-lms',
    description: 'Curso básico para entender o LMS HedHog',
    level: 'beginner',
    duration_hours: 10,
    status: 'draft',
  },
});

Matricular um estudante em uma turma

const matricula = await prisma.course_enrollment.create({
  data: {
    person_id: estudanteId,
    course_class_group_id: turmaId,
    course_id: cursoId,
    status: 'active',
    enrolled_at: new Date(),
  },
});

Registrar presença em uma sessão de aula

const presenca = await prisma.course_class_attendance.upsert({
  where: {
    course_class_session_id_student_id: {
      course_class_session_id: sessaoId,
      student_id: estudanteId,
    },
  },
  update: { present: true },
  create: {
    course_class_session_id: sessaoId,
    student_id: estudanteId,
    present: true,
  },
});

Emitir um certificado

const certificado = await prisma.certificate.create({
  data: {
    verification_code: gerarCodigoUnico(),
    student_id: estudanteId,
    course_id: cursoId,
    certificate_template_id: templateId,
    certificate_type: 'course',
    student_name: nomeEstudante,
    course_name: nomeCurso,
    workload_hours: cargaHoraria,
    issued_at: new Date(),
    completed_at: dataConclusao,
    final_score: notaFinal,
    verification_url: urlVerificacao,
    pdf_url: urlPdf,
  },
});

Criar uma turma (class group)

const turma = await prisma.course_class_group.create({
  data: {
    code: 'TURMA001',
    course_id: cursoId,
    title: 'Turma de Exemplo',
    delivery_mode: 'online',
    status: 'open',
    start_date: new Date('2024-07-01'),
    capacity: 30,
  },
});

Criar sessão em turma

const sessao = await prisma.course_class_session.create({
  data: {
    course_class_group_id: turma.id,
    title: 'Sessão 1',
    session_date: new Date('2024-07-02'),
    start_time: '09:00',
    end_time: '11:00',
    status: 'scheduled',
  },
});

Para mais detalhes sobre integração e uso, consulte a documentação geral do HedHog e os serviços que consomem o módulo @hed-hog/lms.