API REST para gerenciamento de tarefas com autenticação JWT e banco de dados SQLite.
- Instale as dependências:
npm install- O arquivo
.envjá está configurado, mas você pode ajustar se necessário:
JWT_SECRET=your-secret-key-change-in-production
PORT=3000
- Inicie o servidor:
npm startPara desenvolvimento com auto-reload:
npm run devO servidor estará rodando em http://localhost:3000
Um usuário fake é criado automaticamente quando o servidor inicia pela primeira vez:
- Username:
admin - Password:
admin123
POST /api/auth/register
Content-Type: application/json
{
"username": "usuario",
"password": "senha123"
}Resposta de sucesso (201):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 2,
"username": "usuario"
}POST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}Resposta de sucesso (200):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 1,
"username": "admin"
}Todos os endpoints de tarefas requerem autenticação. Inclua o token no header:
Authorization: Bearer <seu-token>
GET /api/tasks
Authorization: Bearer <token>Resposta de sucesso (200):
[
{
"id": 1,
"titulo": "Minha primeira tarefa",
"done": false
},
{
"id": 2,
"titulo": "Tarefa concluída",
"done": true
}
]POST /api/tasks
Authorization: Bearer <token>
Content-Type: application/json
{
"titulo": "Nova tarefa",
"done": false
}Resposta de sucesso (201):
{
"id": 3,
"titulo": "Nova tarefa",
"done": false
}PUT /api/tasks/:id
Authorization: Bearer <token>
Content-Type: application/json
{
"titulo": "Tarefa atualizada",
"done": true
}Você pode atualizar apenas um campo:
{
"done": true
}ou
{
"titulo": "Novo título"
}Resposta de sucesso (200):
{
"id": 1,
"titulo": "Tarefa atualizada",
"done": true
}curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'curl -X POST http://localhost:3000/api/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-d '{"titulo":"Minha tarefa","done":false}'curl -X GET http://localhost:3000/api/tasks \
-H "Authorization: Bearer SEU_TOKEN_AQUI"curl -X PUT http://localhost:3000/api/tasks/1 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-d '{"titulo":"Tarefa atualizada","done":true}'const baseURL = 'http://localhost:3000';
async function login() {
const response = await fetch(`${baseURL}/api/auth/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'admin',
password: 'admin123'
})
});
const data = await response.json();
localStorage.setItem('token', data.token);
return data.token;
}
async function getTasks(token) {
const response = await fetch(`${baseURL}/api/tasks`, {
headers: {
'Authorization': `Bearer ${token}`
}
});
return await response.json();
}
async function createTask(token, titulo, done = false) {
const response = await fetch(`${baseURL}/api/tasks`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ titulo, done })
});
return await response.json();
}
async function updateTask(token, taskId, updates) {
const response = await fetch(`${baseURL}/api/tasks/${taskId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(updates)
});
return await response.json();
}
async function exemplo() {
const token = await login();
console.log('Token:', token);
const tasks = await getTasks(token);
console.log('Tarefas:', tasks);
const newTask = await createTask(token, 'Nova tarefa', false);
console.log('Tarefa criada:', newTask);
const updated = await updateTask(token, newTask.id, { done: true });
console.log('Tarefa atualizada:', updated);
}-
Login:
- Método:
POST - URL:
http://localhost:3000/api/auth/login - Body (raw JSON):
{ "username": "admin", "password": "admin123" } - Copie o
tokenda resposta
- Método:
-
Criar Tarefa:
- Método:
POST - URL:
http://localhost:3000/api/tasks - Headers:
Authorization: Bearer <seu-token>Content-Type: application/json
- Body (raw JSON):
{ "titulo": "Minha tarefa", "done": false }
- Método:
-
Listar Tarefas:
- Método:
GET - URL:
http://localhost:3000/api/tasks - Headers:
Authorization: Bearer <seu-token>
- Método:
-
Editar Tarefa:
- Método:
PUT - URL:
http://localhost:3000/api/tasks/1 - Headers:
Authorization: Bearer <seu-token>Content-Type: application/json
- Body (raw JSON):
{ "titulo": "Tarefa atualizada", "done": true }
- Método:
id(INTEGER PRIMARY KEY)username(TEXT UNIQUE)password(TEXT - hash bcrypt)created_at(DATETIME)
id(INTEGER PRIMARY KEY)user_id(INTEGER - FOREIGN KEY)titulo(TEXT)done(INTEGER - 0 ou 1)created_at(DATETIME)
200- Sucesso201- Criado com sucesso400- Requisição inválida401- Não autenticado403- Token inválido/expirado404- Recurso não encontrado409- Conflito (usuário já existe)500- Erro interno do servidor
- O token JWT expira em 24 horas
- Cada usuário só pode ver e editar suas próprias tarefas
- O campo
doneé armazenado como INTEGER (0 ou 1) no banco, mas retornado como boolean (true/false) na API - O banco de dados SQLite é criado automaticamente como
tasks.dbna raiz do projeto