Pular para o conteúdo principal

Endpoints

Esta lista foi montada a partir dos controllers do backend.

Formato comum de erros

Todos os erros são retornados em JSON. O backend encapsula a mensagem humana, um código de erro estável e eventuais mensagens de validação por campo.

{
"error": "ValidationError",
"message": "Campos obrigatórios não informados",
"code": "VALIDATION_FAILED",
"fields": {
"title": ["não pode ser vazio"],
"email": ["formato inválido"]
},
"traceId": "6f3c1f52a4b6"
}
  • 400: erros de validação (VALIDATION_FAILED), corpos malformados (BAD_REQUEST).
  • 401/403: credenciais ausentes ou sem permissão (UNAUTHORIZED, FORBIDDEN).
  • 404: recurso não encontrado (NOT_FOUND).
  • 409: conflitos de estado (CONFLICT).
  • 422: falhas de semântica específicas do domínio (UNPROCESSABLE_ENTITY).
  • 500: falha inesperada no backend (INTERNAL_ERROR), sempre com traceId para correlação.

ExerciseController

Base path: /api/modules/{moduleId}/lessons/{lessonId}/exercises

GET /api/modules/{moduleId}/lessons/{lessonId}/exercises (list)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.
lessonIdpathintegerSimIdentificador da aula.
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
difficultyqueryintegerNãoFiltra pela dificuldade cadastrada.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/modules/12/lessons/1/exercises?page=1&pageSize=10

Respostas

StatusDescriçãoPayload
200Lista paginada de exercícios da aula.Ver exemplo abaixo.
404Módulo ou aula não encontrados.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 99, "moduleId": 12, "lessonId": 1, "title": "Two Sum", "difficulty": 1, "link": "https://..." }
],
"page": 1,
"pageSize": 10,
"total": 23
}

POST /api/modules/{moduleId}/lessons/{lessonId}/exercises (create)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.
lessonIdpathintegerSimIdentificador da aula.

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringSimNome exibido para o exercício.
difficultyintegerNãoNível de dificuldade (0–2).
linkstringNãoURL para o enunciado/código.
  • Exemplo de requisição:
{
"title": "Two Sum",
"difficulty": 1,
"link": "https://..."
}

Respostas

StatusDescriçãoPayload
201Exercício criado.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
404Módulo ou aula não encontrados.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 101, "moduleId": 12, "lessonId": 1, "title": "Two Sum", "difficulty": 1, "link": "https://..." }

LessonController

Base path: /api/modules/{moduleId}/lessons

GET /api/modules/{moduleId}/lessons (list)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/modules/12/lessons?page=1&pageSize=10

Respostas

StatusDescriçãoPayload
200Lista paginada de aulas.Ver exemplo abaixo.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 5, "moduleId": 12, "title": "Aula 01", "videoUrl": "https://youtube.com/...", "position": 1 }
],
"page": 1,
"pageSize": 10,
"total": 8
}

POST /api/modules/{moduleId}/lessons (create)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringSimNome da aula.
videoUrlstringNãoURL para o vídeo.
positionintegerNãoOrdem dentro do módulo.
  • Exemplo de requisição:
{
"title": "Aula 01",
"videoUrl": "https://youtube.com/...",
"position": 1
}

Respostas

StatusDescriçãoPayload
201Aula criada.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 6, "moduleId": 12, "title": "Aula 01", "videoUrl": "https://youtube.com/...", "position": 1 }

ExtraMaterialController

Base path: /api/modules/{moduleId}/materials

GET /api/modules/{moduleId}/materials (list)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/modules/12/materials?page=1&pageSize=10

Respostas

StatusDescriçãoPayload
200Materiais extras paginados.Ver exemplo abaixo.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 3, "moduleId": 12, "title": "Slides", "url": "https://..." }
],
"page": 1,
"pageSize": 10,
"total": 4
}

POST /api/modules/{moduleId}/materials (create)

ParâmetroLocalTipoObrigatórioDescrição
moduleIdpathintegerSimIdentificador do módulo pai.

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringSimNome do material.
urlstringSimLink direto para o material.
  • Exemplo de requisição:
{
"title": "Slides",
"url": "https://..."
}

Respostas

StatusDescriçãoPayload
201Material criado.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 4, "moduleId": 12, "title": "Slides", "url": "https://..." }

ModuleController

Base path: /api/modules

GET /api/modules (list)

ParâmetroLocalTipoObrigatórioDescrição
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
searchquerystringNãoFiltra por título do módulo.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/modules?page=1&pageSize=10&search=introducao

Respostas

StatusDescriçãoPayload
200Lista paginada de módulos.Ver exemplo abaixo.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 12, "title": "Introdução", "notes": "...", "lessonsCount": 8, "exercisesCount": 23 }
],
"page": 1,
"pageSize": 10,
"total": 14
}

GET /api/modules/{id} (get)

ParâmetroLocalTipoObrigatórioDescrição
idpathintegerSimIdentificador do módulo.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/modules/12

Respostas

StatusDescriçãoPayload
200Detalhe do módulo.Ver exemplo abaixo.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{ "id": 12, "title": "Introdução", "notes": "Texto opcional", "lessonsCount": 8, "exercisesCount": 23 }

POST /api/modules (create)

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringSimNome do módulo.
notesstringNãoAnotações ou descrição longa.
  • Exemplo de requisição:
{
"title": "Introdução",
"notes": "Texto opcional (pode ser grande)"
}

Respostas

StatusDescriçãoPayload
201Módulo criado.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 12, "title": "Introdução", "notes": "Texto opcional" }

PUT /api/modules/{id} (update)

ParâmetroLocalTipoObrigatórioDescrição
idpathintegerSimIdentificador do módulo.

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringNãoNome do módulo.
notesstringNãoAnotações ou descrição longa.
  • Exemplo de requisição:
{
"title": "Introdução (atualizado)",
"notes": "Atualizando apontamentos"
}

Respostas

StatusDescriçãoPayload
200Módulo atualizado.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
404Módulo não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{ "id": 12, "title": "Introdução (atualizado)", "notes": "Atualizando apontamentos" }

DELETE /api/modules/{id} (delete)

ParâmetroLocalTipoObrigatórioDescrição
idpathintegerSimIdentificador do módulo.
  • Corpo: vazio.
  • Exemplo de requisição:
DELETE /api/modules/12

Respostas

StatusDescriçãoPayload
204Remoção bem-sucedida.Corpo vazio.
404Módulo não encontrado.Formato de erro comum.
409Conflito ao excluir (referências).Formato de erro comum.
500Falha inesperada.Formato de erro comum.

PostController

Base path: /api/posts

GET /api/posts (list)

ParâmetroLocalTipoObrigatórioDescrição
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
tagquerystringNãoFiltra por tag.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/posts?page=1&pageSize=10&tag=news

Respostas

StatusDescriçãoPayload
200Lista paginada de posts.Ver exemplo abaixo.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 1, "title": "Primeiro post", "tag": "news", "coverImageUrl": "https://...", "mainText": "Conteúdo do post" }
],
"page": 1,
"pageSize": 10,
"total": 3
}

GET /api/posts/{id} (get)

ParâmetroLocalTipoObrigatórioDescrição
idpathintegerSimIdentificador do post.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/posts/1

Respostas

StatusDescriçãoPayload
200Detalhe do post.Ver exemplo abaixo.
404Post não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 200:

{ "id": 1, "title": "Primeiro post", "tag": "news", "coverImageUrl": "https://...", "mainText": "Conteúdo do post" }

POST /api/posts (create)

Corpo (JSON)

CampoTipoObrigatórioDescrição
titlestringSimTítulo do post.
tagstringNãoCategoria ou rótulo.
coverImageUrlstringNãoImagem de capa.
mainTextstringSimConteúdo principal.
  • Exemplo de requisição:
{
"title": "Primeiro post",
"tag": "news",
"coverImageUrl": "https://...",
"mainText": "Conteúdo do post"
}

Respostas

StatusDescriçãoPayload
201Post criado.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 2, "title": "Primeiro post", "tag": "news", "coverImageUrl": "https://...", "mainText": "Conteúdo do post" }

DELETE /api/posts/{id} (delete)

ParâmetroLocalTipoObrigatórioDescrição
idpathintegerSimIdentificador do post.
  • Corpo: vazio.
  • Exemplo de requisição:
DELETE /api/posts/1

Respostas

StatusDescriçãoPayload
204Remoção bem-sucedida.Corpo vazio.
404Post não encontrado.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

RegistrationController

Base path: /api/registrations

POST /api/registrations (create)

Corpo (JSON)

CampoTipoObrigatórioDescrição
namestringSimNome completo.
emailstringSimE-mail de contato.
whatsappstringNãoTelefone/WhatsApp.
institutionstringNãoUniversidade ou organização.
  • Exemplo de requisição:
{
"name": "Fulano",
"email": "fulano@email.com",
"whatsapp": "+55 45 99999-9999",
"institution": "UNIOESTE"
}

Respostas

StatusDescriçãoPayload
201Inscrição criada.Ver exemplo abaixo.
400/422Erro de validação.Formato de erro comum.
409Inscrição duplicada.Formato de erro comum.
500Falha inesperada.Formato de erro comum.

Payload 201:

{ "id": 7, "name": "Fulano", "email": "fulano@email.com", "whatsapp": "+55 45 99999-9999", "institution": "UNIOESTE" }

GET /api/registrations (list)

ParâmetroLocalTipoObrigatórioDescrição
pagequeryintegerNãoPágina (default 1).
pageSizequeryintegerNãoTamanho da página (default 10).
institutionquerystringNãoFiltra por instituição.
  • Corpo: vazio.
  • Exemplo de requisição:
GET /api/registrations?page=1&pageSize=10

Respostas

StatusDescriçãoPayload
200Lista paginada de inscrições.Ver exemplo abaixo.
500Falha inesperada.Formato de erro comum.

Payload 200:

{
"items": [
{ "id": 7, "name": "Fulano", "email": "fulano@email.com", "whatsapp": "+55 45 99999-9999", "institution": "UNIOESTE" }
],
"page": 1,
"pageSize": 10,
"total": 120
}