API ASP.NET Core para a plataforma de cursos. Ela atende:
- Site Web: catalogo, autenticacao, pedidos e pagamento.
- Aplicativo Mobile: cursos liberados e progresso.
- Administracao: produtos, pedidos, alunos e cupons.
Base local:
http://localhost:5000/api
Todas as datas retornadas pela API usam UTC e os valores monetarios usam numeros decimais.
As rotas protegidas usam JWT:
Authorization: Bearer <access-token>POST /auth/cadastrar
Content-Type: application/json{
"nome": "Aluno Teste",
"email": "aluno@example.com",
"senha": "senha-segura",
"cpf": "52998224725",
"phone": "(11) 99999-9999"
}POST /auth/login
Content-Type: application/json{
"email": "aluno@example.com",
"senha": "senha-segura"
}Retorna accessToken, refreshToken, expiresIn e os dados do usuario.
POST /auth/refresh
Content-Type: application/json{
"refreshToken": "<refresh-token>"
}POST /auth/logout
Authorization: Bearer <access-token>PUT /auth/perfil
Authorization: Bearer <access-token>
Content-Type: application/jsonGET /me
Authorization: Bearer <access-token>GET /me/courses
Authorization: Bearer <access-token>O curso deve estar associado a uma matricula do usuario.
GET /me/courses/{courseId}/progress
Authorization: Bearer <access-token>PUT /me/courses/{courseId}/progress
Authorization: Bearer <access-token>
Content-Type: application/json{
"percent": 45,
"completedLessonId": 12
}O campo percent deve estar entre 0 e 100.
Os cursos ainda sao representados pela entidade Product. Para listar somente
cursos, use tipo=course.
GET /products
GET /products?tipo=courseGET /products/{id}Requer a role Admin.
POST /products
Authorization: Bearer <admin-token>
Content-Type: application/json{
"nome": "Curso de Primeiros Socorros",
"preco": 450.00,
"tipoProduto": "course",
"estoque": 20,
"description": "Curso introdutorio de primeiros socorros.",
"image": "https://example.com/curso.jpg",
"category": "Saude",
"date": "15/04/2026",
"location": "Online",
"instructor": "Instrutor Teste"
}As propriedades aceitas para atualizacao sao as mesmas da criacao. A remocao
usa DELETE /products/{id} e tambem requer Admin.
Todas as rotas de pedidos exigem autenticacao.
POST /orders
Authorization: Bearer <access-token>
Content-Type: application/json{
"itens": [
{
"produtoId": 5,
"quantidade": 1
}
],
"valorFrete": 0,
"paymentMethod": "pix",
"installments": null,
"promoCode": "MEDICO10"
}Formas de pagamento aceitas atualmente:
pixcredit_carddebit_card
O pedido e criado com paymentStatus=pending. O estoque/vagas e reservado,
mas a matricula ainda nao e criada.
GET /orders/my
Authorization: Bearer <access-token>GET /orders/{orderId}
Authorization: Bearer <access-token>O usuario somente pode consultar os proprios pedidos.
GET /orders/{orderId}/payment
Authorization: Bearer <access-token>POST /orders/{orderId}/cancel
Authorization: Bearer <access-token>Pedidos pagos, concluidos ou ja cancelados nao podem ser cancelados por esta rota.
POST /payments/webhook
Content-Type: application/json
X-Webhook-Signature: <assinatura>{
"eventId": "event-123",
"paymentId": "payment-123",
"orderId": 10,
"status": "paid"
}Status aceitos:
paidrefusedcancelledrefunded
Quando o status for paid, a API:
- Atualiza o pagamento.
- Marca o pedido como
processing. - Cria a matricula do curso.
- Libera o acesso na area do aluno.
Eventos repetidos de pagamento aprovado nao criam matriculas duplicadas.
A assinatura deve ser configurada conforme o gateway escolhido em
Payments:WebhookSecret.
GET /promocodes/validate?code=MEDICO10Requerem a role Admin:
GET /promocodes
GET /promocodes/{id}
POST /promocodes
PUT /promocodes/{id}
DELETE /promocodes/{id}POST /promocodes/{id}/use
Authorization: Bearer <access-token>No fluxo normal de compra, o cupom e aplicado durante a criacao do pedido.
Todas as rotas exigem a role Admin:
GET /students
GET /students/{id}
POST /students
PUT /students/{id}
DELETE /students/{id}Sucesso:
200 OK: consulta ou atualizacao concluida.201 Created: recurso criado.204 No Content: operacao concluida sem corpo.
Erros mais comuns:
400 Bad Request: dados invalidos ou regra de negocio violada.401 Unauthorized: token ausente, invalido ou expirado.403 Forbidden: usuario sem a role necessaria.404 Not Found: recurso inexistente ou inacessivel.409 Conflict: dados duplicados, como e-mail ou cupom.
Formato atual:
{
"message": "Descricao do erro"
}login
-> guardar accessToken e refreshToken
-> listar /products?tipo=course
-> criar /orders
-> consultar /orders/{id}/payment
-> aguardar webhook paid
-> listar /me/courses
-> atualizar progresso
O cliente deve renovar o access token em /auth/refresh quando ele expirar.
O arquivo backend/openapi.yaml descreve uma versao futura. As rotas
implementadas atualmente usam:
| Contrato alvo | Implementacao atual |
|---|---|
/auth/register |
/auth/cadastrar |
PUT /me |
PUT /auth/perfil |
/courses |
/products?tipo=course |
/admin/courses |
/products com role Admin |
/admin/orders |
/orders com role Admin |
/admin/students |
/students com role Admin |
/admin/promocodes |
/promocodes com role Admin |
Ao desenvolver os clientes, use as rotas implementadas acima ou altere o backend para seguir o contrato OpenAPI antes de gerar SDKs.
Executar a API:
dotnet run --project backend/backend.csprojExecutar os testes automatizados:
dotnet test backend.Tests/backend.Tests.csprojO projeto de testes valida criacao de pedido, pagamento aprovado, matricula idempotente, cancelamento com devolucao de estoque e aplicacao de cupom.