API RESTful para gerenciamento de tarefas construída com Node.js e Supabase, incluindo sistema completo de autenticação.
Base URL: https://taskmanagerapi-production-ad12.up.railway.app/api/
- Node.js
- Express
- Supabase (Banco de dados PostgreSQL + Auth)
- Joi (Validação)
- Dotenv (Variáveis de ambiente)
- Frontend HTML/CSS/JavaScript vanilla
- Railway (Deploy)
git clone https://github.com/lucaspanzera1/TaskManagerAPI.git
cd TaskManagerAPI
npm install
- Crie uma conta no Supabase
- Crie um novo projeto
- No SQL Editor, crie as tabelas necessárias com o seguinte SQL:
-- Tabela de tarefas
CREATE TABLE tarefas (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
titulo TEXT NOT NULL,
descricao TEXT,
status TEXT NOT NULL DEFAULT 'pendente',
prioridade TEXT NOT NULL DEFAULT 'media',
data_vencimento DATE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE
);
-- Tabela de perfis de usuários
CREATE TABLE profiles (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Índices para melhorar a performance
CREATE INDEX idx_tarefas_status ON tarefas(status);
CREATE INDEX idx_tarefas_prioridade ON tarefas(prioridade);
CREATE INDEX idx_tarefas_data_vencimento ON tarefas(data_vencimento);
CREATE INDEX idx_tarefas_user_id ON tarefas(user_id);
CREATE INDEX idx_profiles_username ON profiles(username);
CREATE INDEX idx_profiles_email ON profiles(email);
- Configure as políticas RLS (Row Level Security):
-- Habilitar RLS nas tabelas
ALTER TABLE tarefas ENABLE ROW LEVEL SECURITY;
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
-- Políticas para tarefas - usuário só pode ver suas próprias tarefas
CREATE POLICY "Usuários podem ver suas próprias tarefas" ON tarefas
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Usuários podem inserir suas próprias tarefas" ON tarefas
FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Usuários podem atualizar suas próprias tarefas" ON tarefas
FOR UPDATE USING (auth.uid() = user_id);
CREATE POLICY "Usuários podem deletar suas próprias tarefas" ON tarefas
FOR DELETE USING (auth.uid() = user_id);
-- Políticas para profiles
CREATE POLICY "Usuários podem ver seu próprio perfil" ON profiles
FOR SELECT USING (auth.uid() = id);
CREATE POLICY "Usuários podem inserir seu próprio perfil" ON profiles
FOR INSERT WITH CHECK (auth.uid() = id);
- Copie a URL e a Chave da API do seu projeto Supabase
Renomeie o arquivo .env.example
para .env
e preencha as variáveis:
SUPABASE_URL=sua_url_do_supabase
SUPABASE_KEY=sua_chave_do_supabase
PORT=3000
Instale o pacote CORS se ainda não estiver instalado:
npm install cors
Adicione o middleware CORS ao seu servidor:
// No arquivo server.js
const express = require('express');
const cors = require('cors');
const app = express();
// Habilitar CORS
app.use(cors());
// Resto do seu código...
Para ambiente de desenvolvimento, desative a confirmação de e-mail:
- Acesse o painel do Supabase
- Vá para
Authentication > Settings
- Desative "Enable email confirmations"
# Modo desenvolvimento
npm run dev
# Modo produção
npm start
O projeto utiliza Supabase Auth com username, email e password. Todas as rotas da API são protegidas por autenticação JWT.
- Cria um novo usuário no Supabase Auth usando
email
epassword
- Cria um registro na tabela
profiles
associandoid
,username
eemail
- Recebe
username
epassword
- Busca o e-mail correspondente na tabela
profiles
- Faz login usando
email + password
com Supabase Auth - Retorna token JWT para autenticação nas próximas requisições
Todas as rotas de tarefas (/api/tarefas
) são protegidas pelo middleware authMiddleware
, que:
- Valida o token JWT no cabeçalho
Authorization: Bearer <token>
- Retorna erro
401 Unauthorized
se o token for inválido - Permite acesso apenas às tarefas do usuário autenticado
Crie a seguinte estrutura de pastas dentro do projeto:
frontend/
├── css/
│ └── styles.css
├── js/
│ └── app.js
├── index.html ← Página principal (protegida)
└── auth.html ← Página de login/registro
No arquivo frontend/js/app.js
, certifique-se de configurar a URL correta da API:
// URL da API em produção
const API_BASE_URL = 'https://taskmanagerapi-production-ad12.up.railway.app/api';
// Para desenvolvimento local, use:
// const API_BASE_URL = 'http://localhost:3000/api';
Nova página que contém duas abas:
- Login: realiza autenticação via Supabase com
username
esenha
- Registro: cria novo usuário na Supabase com
username
,email
esenha
Ambas interagem com a API /api/login
e /api/signup
.
Arquivo HTML principal com a estrutura da interface do usuário. Agora protegido por autenticação com verificação automática de token no <head>
:
<script>
const token = localStorage.getItem('token');
if (!token) {
window.location.href = 'auth.html';
}
</script>
Se o usuário não estiver autenticado, ele é redirecionado imediatamente para auth.html
.
Estilos CSS para todos os componentes da interface, incluindo elementos de autenticação e a nova página auth.html
.
Código JavaScript para gerenciar a comunicação com a API, autenticação e manipulação da interface. Inclui:
- Verificação automática de token antes de cada requisição
- Redirecionamento automático para
auth.html
em caso de token inválido (erro 401) - Armazenamento seguro do token JWT no
localStorage
- Certifique-se de que a API esteja rodando (produção: já está online)
- Abra o arquivo
auth.html
no navegador (página inicial de login)- Para desenvolvimento, recomenda-se usar o Live Server do VSCode ou similar
- Após autenticação bem-sucedida, o usuário será redirecionado automaticamente para
index.html
index.html
está protegido por autenticação. Usuários não autenticados serão automaticamente redirecionados para auth.html
.
- Página
auth.html
com duas abas:- Login: Formulário para entrar com username e password
- Registro: Formulário para cadastro com username, email e password
- Proteção automática:
index.html
verifica autenticação antes de carregar - Gerenciamento de tokens: Armazenamento automático no
localStorage
- Redirecionamento inteligente: Usuários não autenticados são redirecionados para
auth.html
- Verificação contínua: Token validado a cada requisição à API
- Logout automático: Redirecionamento em caso de token expirado (erro 401)
- Lista todas as tarefas do usuário autenticado
- Exibe detalhes como título, descrição, status, prioridade e data de vencimento
- Cada tarefa é representada por um card com ações de editar e excluir
- Permite filtrar tarefas por status (todos, pendente, em andamento, concluída)
- Os filtros são botões na parte superior da interface
- Formulário com campos para todos os atributos necessários
- Validação básica dos campos obrigatórios
- Feedback de sucesso/erro ao usuário
- Carrega os dados da tarefa selecionada no formulário
- Permite modificar qualquer atributo
- Atualiza a visualização após salvar as alterações
- Confirmação antes da exclusão
- Remove a tarefa da visualização após confirmação
- Feedback de sucesso/erro ao usuário
- Baixe e instale o Postman
- Crie uma nova coleção (Collection) para organizar suas requisições
- Adicione as requisições abaixo para testar cada funcionalidade da API
https://taskmanagerapi-production-ad12.up.railway.app/api/
- Método: GET
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/
- Descrição: Verifica se a API está online
- Resposta esperada:
{ "message": "API de Gerenciamento de Tarefas", "versao": "1.0.0", "status": "online" }
- Método: POST
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/signup
- Descrição: Cadastrar um novo usuário
- Headers:
Content-Type: application/json
- Body (raw JSON):
{ "email": "usuario@email.com", "password": "123456", "username": "usuario123" }
- Resposta esperada (status 201):
{ "success": true, "message": "Usuário cadastrado com sucesso", "user": { "id": "uuid...", "email": "usuario@email.com", "username": "usuario123" } }
- Método: POST
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/login
- Descrição: Realizar login e obter token JWT
- Headers:
Content-Type: application/json
- Body (raw JSON):
{ "username": "usuario123", "password": "123456" }
- Resposta esperada (status 200):
{ "token": "eyJhbGciOiJIUzI1NiIsInR...", "user": { "id": "uuid...", "email": "usuario@email.com", "username": "usuario123" } }
- Método: GET
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas
- Descrição: Retorna todas as tarefas do usuário autenticado
- Headers:
Authorization: Bearer {token}
- Parâmetros opcionais:
status
(query): Filtrar por status (pendente, em_andamento, concluida)- Exemplo:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas?status=pendente
- Método: GET
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas/{id}
- Descrição: Retorna uma tarefa específica pelo ID
- Headers:
Authorization: Bearer {token}
- Exemplo:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas/550e8400-e29b-41d4-a716-446655440000
- Método: POST
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas
- Headers:
Content-Type: application/json
Authorization: Bearer {token}
- Body (raw JSON):
{ "titulo": "Comprar mantimentos", "descricao": "Ir ao supermercado e comprar itens da lista", "status": "pendente", "prioridade": "alta", "data_vencimento": "2023-12-31" }
- Resposta esperada (status 201):
{ "success": true, "message": "Tarefa criada com sucesso", "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "user_id": "uuid...", "titulo": "Comprar mantimentos", "descricao": "Ir ao supermercado e comprar itens da lista", "status": "pendente", "prioridade": "alta", "data_vencimento": "2023-12-31", "created_at": "2023-05-12T12:00:00.000Z" } }
- Método: PUT
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas/{id}
- Headers:
Content-Type: application/json
Authorization: Bearer {token}
- Body (raw JSON):
{ "titulo": "Comprar mantimentos - atualizado", "descricao": "Ir ao supermercado e comprar itens atualizados da lista", "status": "em_andamento", "prioridade": "media", "data_vencimento": "2023-12-31" }
- Resposta esperada (status 200):
{ "success": true, "message": "Tarefa atualizada com sucesso", "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "user_id": "uuid...", "titulo": "Comprar mantimentos - atualizado", "descricao": "Ir ao supermercado e comprar itens atualizados da lista", "status": "em_andamento", "prioridade": "media", "data_vencimento": "2023-12-31", "created_at": "2023-05-12T12:00:00.000Z", "updated_at": "2023-05-12T14:30:00.000Z" } }
- Método: DELETE
- URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/tarefas/{id}
- Headers:
Authorization: Bearer {token}
- Descrição: Remove uma tarefa específica pelo ID
- Resposta esperada (status 200):
{ "success": true, "message": "Tarefa excluída com sucesso" }
- Execute a requisição #0 para verificar se a API está online
- Execute a requisição #1 para cadastrar um novo usuário
- Execute a requisição #2 para fazer login e obter o token JWT
- Use o token obtido nas próximas requisições (adicione no cabeçalho Authorization)
- Execute a requisição #5 para criar uma nova tarefa (guarde o ID retornado)
- Execute a requisição #3 para listar todas as tarefas e confirmar que sua tarefa foi criada
- Execute a requisição #4 com o ID da tarefa criada para obter detalhes específicos
- Execute a requisição #6 com o ID da tarefa para atualizá-la
- Execute novamente a requisição #4 para verificar se as atualizações foram aplicadas
- Execute a requisição #7 para excluir a tarefa
- Execute a requisição #3 para confirmar que a tarefa foi removida
- Abra o arquivo
frontend/auth.html
em um navegador - Teste de Proteção: Tente acessar
index.html
diretamente - você será redirecionado paraauth.html
-
Cadastro:
- Clique na aba "Registro"
- Preencha username, email e password
- Clique em "Cadastrar"
- Verifique se o usuário é criado e redirecionado para login
-
Login:
- Na aba "Login", insira username e password criados
- Clique em "Entrar"
- Verifique se o token é armazenado e o usuário é redirecionado para
index.html
- Agora em
index.html
(autenticado):- Crie uma nova tarefa preenchendo o formulário e clicando em "Salvar"
- Verifique se a tarefa aparece na lista
- Filtre as tarefas por status usando os botões de filtro
- Edite uma tarefa clicando no botão "Editar", modificando os campos e salvando
- Exclua uma tarefa clicando no botão "Excluir" e confirmando a ação
-
Teste de Token Expirado:
- Limpe o localStorage no navegador (F12 > Application > Local Storage)
- Recarregue
index.html
- você será redirecionado paraauth.html
-
Teste de Logout (se implementado):
- Clique no botão de logout
- Verifique se o token é removido e o usuário é redirecionado para
auth.html
- ✅ Usuários não autenticados não conseguem acessar
index.html
- ✅ Login e registro funcionam com a API de autenticação
- ✅ O frontend está completamente integrado com autenticação Supabase
- ✅ Tokens são gerenciados automaticamente
- ✅ Redirecionamento automático funciona corretamente
- Implementar refresh tokens para maior segurança
- Adicionar paginação para listar tarefas
- Implementar busca por texto nas tarefas
- Adicionar testes automatizados
- Implementar rate limiting para prevenir ataques
- Adicionar logs de auditoria
- Implementar recuperação de senha
- Implementar funcionalidades de logout: Adicionar botão de logout no
index.html
- Expiração automática de token: Implementar verificação periódica de validade
- Exibir informações do usuário: Mostrar nome do usuário logado na interface
- Adicionar paginação para lidar com muitas tarefas
- Implementar sistema de recuperação de senha
- Adicionar campo de busca para encontrar tarefas específicas
- Permitir ordenação das tarefas por diferentes critérios
- Melhorar responsividade para dispositivos móveis
- Adicionar animações e transições para melhorar UX
- Implementar notificações push para tarefas próximas ao vencimento
- Adicionar modo escuro/claro
.
├── src/
│ ├── config/
│ │ └── supabase.js
│ ├── controllers/
│ │ ├── authController.js
│ │ └── tarefaController.js
│ ├── middlewares/
│ │ └── authMiddleware.js
│ ├── models/
│ │ ├── authModel.js
│ │ └── tarefaModel.js
│ ├── routes/
│ │ ├── authRoutes.js
│ │ ├── tarefaRoutes.js
│ │ └── index.js
│ ├── validations/
│ │ ├── authValidation.js
│ │ └── tarefaValidation.js
│ └── server.js
├── frontend/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ └── app.js
│ ├── auth.html
│ └── index.html
├── .env
├── .env.example
├── package.json
└── README.md
- Tokens JWT têm prazo de validade. Implemente refresh tokens ou faça login novamente.
- Verifique se a confirmação de e-mail está desabilitada no desenvolvimento.
- Em produção, implemente fluxo de confirmação de e-mail.
- Verifique se o token está sendo enviado corretamente no cabeçalho Authorization.
- Confirme se o formato é:
Bearer <token>
.
Usuário não consegue acessar index.html
- Verifique se existe um token válido no localStorage do navegador
- Confirme se o usuário fez login corretamente em
auth.html
- Teste se a API de autenticação está respondendo corretamente
Redirecionamento não funciona
- Verifique se os arquivos
auth.html
eindex.html
estão no mesmo diretório - Confirme se o JavaScript de proteção está no
<head>
deindex.html
- Teste se o localStorage está habilitado no navegador
Formulários de login/registro não funcionam
- Verifique os logs do console para erros JavaScript
- Confirme se as URLs da API estão corretas no
app.js
- Certifique-se de estar usando a URL de produção:
https://taskmanagerapi-production-ad12.up.railway.app/api
Se você encontrar erros relacionados ao CORS ao tentar acessar a API pelo frontend, certifique-se de ter configurado corretamente o middleware CORS no backend.
- Verifique se está usando a URL correta de produção
- Confirme se a porta configurada no frontend (
app.js
) corresponde à URL de produção - Teste diretamente no navegador:
https://taskmanagerapi-production-ad12.up.railway.app/
Verifique os logs do console do navegador para identificar possíveis erros. Certifique-se de que todos os campos obrigatórios estão preenchidos e que o usuário está autenticado.
Confirme se a URL da API está correta no arquivo app.js
, se o token de autenticação está sendo enviado e se o formato dos dados retornados pela API corresponde ao esperado pelo frontend.
Se as tarefas não estão sendo filtradas corretamente por usuário, verifique se as políticas RLS estão configuradas corretamente no Supabase.
- Autenticação JWT: Tokens seguros para autenticação de usuários
- Row Level Security (RLS): Isolamento de dados por usuário no banco
- Validação de entrada: Joi para validação de dados
- CORS configurado: Controle de acesso entre origens
- Senhas criptografadas: Gerenciadas pelo Supabase Auth
- Deploy seguro: API hospedada no Railway com HTTPS
- Use HTTPS em produção (✅ Já implementado)
- Implemente rate limiting
- Configure logs de auditoria
- Mantenha dependências atualizadas
- Use variáveis de ambiente para dados sensíveis
A API está atualmente hospedada no Railway e pode ser acessada através da URL:
https://taskmanagerapi-production-ad12.up.railway.app/api/
Para rodar localmente, use:
npm run dev
E configure o frontend para usar http://localhost:3000/api
como base URL.
MIT
Desenvolvido por: Lucas Panzera
Repositório: https://github.com/lucaspanzera1/TaskManagerAPI
API Produção: https://taskmanagerapi-production-ad12.up.railway.app/api/