Versão: v1
Base URL: https://studyfoxapi.onrender.com/api/v1
Repositório: github.com/salsapunk/StudyFoxAPI
Linguagem: Go · Framework: Gin · Banco de dados: PostgreSQL
A StudyFox API é uma REST API desenvolvida em Go para o projeto StudyFox (AV2 de Front-End II). Ela permite gerenciar usuários, matérias e tarefas acadêmicas, com autenticação via JWT armazenado em cookie.
| Tecnologia | Finalidade |
|---|---|
| Go + Gin | Framework Web HTTP |
| PostgreSQL + pgx | Banco de dados relacional |
| JWT (golang-jwt/jwt) | Autenticação |
| bcrypt | Hash de senhas |
A API utiliza JWT em cookie. Após o login, o servidor define um cookie Authorization com validade de 30 dias. Todas as rotas protegidas exigem esse cookie.
Cookie: Authorization=<jwt_token>
O cookie é configurado com HttpOnly, Secure e SameSite=None.
Todas as respostas seguem o padrão:
Sucesso:
{
"success": true,
"data": <conteúdo>
}Erro:
{
"success": false,
"error": {
"message": "descrição do erro"
}
}| Campo | Tipo | JSON | Obrigatório |
|---|---|---|---|
| Matricula | int | matricula_usuario |
X (gerado) |
| string | email |
✅ | |
| Senha | string | senha |
✅ |
| Tema | string | tema |
X |
| Campo | Tipo | JSON | Obrigatório |
|---|---|---|---|
| Codigo | int | codigo_materia |
X (gerado) |
| Nome | string | nome |
✅ |
| Matricula | int | matricula_usuario |
✅ |
| Campo | Tipo | JSON | Obrigatório |
|---|---|---|---|
| Id | int | id_tarefa |
X (gerado) |
| Nome | string | nome |
✅ |
| Prazo | pgtype.Date |
prazo |
X |
| Anotacao | string | anotacao |
X |
| Codigo | int | codigo_materia |
✅ |
| Status | int | status |
X |
⚠️ Formato deprazo: o campo é serializado como uma string simples no formato"YYYY-MM-DD"(ex.:"2025-07-15"), ounullquando não definido. O parser aceita exclusivamente esse formato — enviar um objeto ou um datetime completo (2025-07-15T00:00:00Z) causa erro de bind no body.
Cadastra um novo usuário.
Autenticação: Não requerida
Body:
{
"email": "user@email.com",
"senha": "minhasenha123"
}Resposta de sucesso (200):
{
"success": true,
"data": 42
}data é a matrícula gerada para o novo usuário.
Autentica o usuário e define o cookie JWT.
Autenticação: Não requerida
Body:
{
"email": "user@email.com",
"senha": "minhasenha123"
}Resposta de sucesso (200):
{
"success": true,
"data": "Login executed successfully"
}O cookie Authorization é definido automaticamente na resposta.
Valida o token JWT e retorna os dados do usuário autenticado.
Autenticação: ✅ Requerida
Resposta de sucesso (200):
{
"success": true,
"data": {
"matricula_usuario": 42,
"email": "user@email.com",
"senha": "",
"tema": "dark"
}
}Altera o e-mail do usuário autenticado.
Autenticação: ✅ Requerida
Body:
{
"email": "novo@email.com"
}Resposta de sucesso (200):
{
"success": true,
"data": "Email do usuário atualizado"
}Altera a senha do usuário autenticado.
Autenticação: ✅ Requerida
Body:
{
"senha": "novasenha456"
}Resposta de sucesso (200):
{
"success": true,
"data": "Senha do usuário atualizada"
}Altera o tema (preferência visual) do usuário autenticado.
Autenticação: ✅ Requerida
Body:
{
"tema": "escuro"
}Resposta de sucesso (200):
{
"success": true,
"data": "Tema do usuário atualizada"
}Remove permanentemente a conta do usuário autenticado.
Autenticação: ✅ Requerida
Resposta de sucesso (200):
{
"success": true,
"data": "Usuário deletado"
}Cria uma nova matéria para o usuário autenticado.
Autenticação: ✅ Requerida
Body:
{
"nome": "Cálculo I"
}Resposta de sucesso (200):
{
"success": true,
"data": 7
}data é o código gerado para a matéria.
Lista todas as matérias do usuário autenticado.
Autenticação: ✅ Requerida
Resposta de sucesso (200):
{
"success": true,
"data": [
{
"codigo_materia": 7,
"nome": "Cálculo I",
"matricula_usuario": 42
},
{
"codigo_materia": 8,
"nome": "Estrutura de Dados",
"matricula_usuario": 42
}
]
}Retorna uma matéria específica pelo código.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
Resposta de sucesso (200):
{
"success": true,
"data": {
"codigo_materia": 7,
"nome": "Cálculo I",
"matricula_usuario": 42
}
}Altera o nome de uma matéria.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
Body:
{
"nome": "Cálculo II"
}Resposta de sucesso (200):
{
"success": true,
"data": "Nome da matéria atualizado"
}Remove uma matéria e todas as suas tarefas (via cascade no banco).
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
Resposta de sucesso (200):
{
"success": true,
"data": "Matéria deletada"
}Cria uma nova tarefa em uma matéria.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
Body:
{
"nome": "Lista 1",
"anotacao": "Exercícios de limites",
"prazo": "2025-07-15"
}Resposta de sucesso (200):
{
"success": true,
"data": 101
}data é o ID gerado para a tarefa.
⚠️ Nota de implementação: ao contrário dos demais endpoints, este retorna502 Bad Gateway(em vez de400) quando o parâmetro:codigonão é um número válido ou o body é malformado. Isso é uma inconsistência conhecida no handler atual, não uma escolha documentada de design — trate502aqui como um sinal de requisição inválida, não de erro no servidor upstream.
Lista todas as tarefas de uma matéria.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
Resposta de sucesso (200):
{
"success": true,
"data": [
{
"id_tarefa": 101,
"nome": "Lista 1",
"anotacao": "Exercícios de limites",
"prazo": "2025-07-15",
"codigo_materia": 7,
"status": 0
}
]
}Retorna uma tarefa específica.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
id |
int | ID da tarefa |
Resposta de sucesso (200):
{
"success": true,
"data": {
"id_tarefa": 101,
"nome": "Lista 1",
"anotacao": "Exercícios de limites",
"prazo": "2025-07-15",
"codigo_materia": 7,
"status": 0
}
}Altera o nome de uma tarefa.
Autenticação: ✅ Requerida
Body:
{ "nome": "Lista 2" }Resposta de sucesso (200):
{ "success": true, "data": "Nome da tarefa atualizada" }Altera o prazo de uma tarefa.
Autenticação: ✅ Requerida
Body:
{ "prazo": "2025-08-01" }Resposta de sucesso (200):
{ "success": true, "data": "Prazo da tarefa atualizada" }Altera a anotação de uma tarefa.
Autenticação: ✅ Requerida
Body:
{ "anotacao": "Revisar capítulo 3 antes de resolver" }Resposta de sucesso (200):
{ "success": true, "data": "Anotação da tarefa atualizada" }Altera o status de uma tarefa.
Autenticação: ✅ Requerida
Body:
{ "status": 1 }Resposta de sucesso (200):
{ "success": true, "data": "Status da tarefa atualizada" }Remove uma tarefa específica.
Autenticação: ✅ Requerida
Parâmetros de rota:
| Parâmetro | Tipo | Descrição |
|---|---|---|
codigo |
int | Código da matéria |
id |
int | ID da tarefa |
Resposta de sucesso (200):
{ "success": true, "data": "Tarefa deletada" }Verifica se a API está online e o token é válido.
Autenticação: ✅ Requerida
Resposta de sucesso (200):
{ "message": "pong" }| Método | Rota | Auth | Descrição |
|---|---|---|---|
| POST | /signup |
X | Cadastrar usuário |
| POST | /login |
X | Login |
| GET | /validate |
✅ | Validar token |
| GET | /ping |
✅ | Health check |
| PUT | /email |
✅ | Alterar e-mail |
| PUT | /senha |
✅ | Alterar senha |
| PUT | /tema |
✅ | Alterar tema |
| DELETE | /usuario |
✅ | Deletar conta |
| POST | /materia |
✅ | Criar matéria |
| GET | /materias |
✅ | Listar matérias |
| GET | /materia/:codigo |
✅ | Ver matéria |
| PUT | /materia/:codigo |
✅ | Renomear matéria |
| DELETE | /materia/:codigo |
✅ | Deletar matéria |
| POST | /materia/:codigo/tarefa |
✅ | Criar tarefa |
| GET | /materia/:codigo/tarefas |
✅ | Listar tarefas |
| GET | /materia/:codigo/tarefa/:id |
✅ | Ver tarefa |
| PUT | /materia/:codigo/tarefa/:id/nome |
✅ | Renomear tarefa |
| PUT | /materia/:codigo/tarefa/:id/prazo |
✅ | Alterar prazo |
| PUT | /materia/:codigo/tarefa/:id/anotacao |
✅ | Alterar anotação |
| PUT | /materia/:codigo/tarefa/:id/status |
✅ | Alterar status |
| DELETE | /materia/:codigo/tarefa/:id |
✅ | Deletar tarefa |
| Código | Situação |
|---|---|
| 200 | Operação realizada com sucesso |
| 400 | Dados inválidos ou ausentes no body |
| 401 | Token ausente, inválido ou expirado |
| 500 | Erro interno no servidor |
| 502 | (apenas em POST /materia/:codigo/tarefa) :codigo inválido ou body malformado — inconsistência conhecida, ver nota no endpoint |
| Variável | Descrição |
|---|---|
DATABASE_URL |
String de conexão PostgreSQL |
SECRET |
Chave secreta para assinar os JWTs |
PORT |
Porta em que o servidor vai escutar |
ALLOWED_ORIGIN |
Origens permitidas para CORS (separadas por vírgula) |
# Clone o repositório
git clone https://github.com/salsapunk/StudyFoxAPI.git
cd StudyFoxAPI
# Configure as variáveis de ambiente
export DATABASE_URL="postgres://user:password@localhost:5432/nomedobanco"
export SECRET="seu_segredo_aqui"
export PORT="8080"
export ALLOWED_ORIGIN="http://localhost:3000"
# Execute
go run ./cmd/api/StudyFoxAPI/
├── cmd/
│ └── api/
│ └── main.go # Entrypoint: rotas, CORS, pool de conexões
├── internal/
│ ├── handler/
│ │ └── handler.go # Handlers HTTP (controllers)
│ ├── model/
│ │ └── model.go # Modelos, queries SQL, helpers de resposta
│ ├── repository/ # Acesso ao banco de dados
│ └── service/ # Regras de negócio
├── go.mod
└── go.sum