Uma API RESTful robusta, segura e moderna para gerenciamento de tarefas (To-Do List) desenvolvida com Node.js 22, Express 5 e MongoDB.
- Visão Geral
- Funcionalidades
- Destaques Técnicos
- Tecnologias Utilizadas
- Documentação dos Endpoints
- Estrutura de Pastas
- Como Executar o Projeto
- Scripts Disponíveis
- Autor
🔗 Acesse a API rodando online no Render: https://todo-list-backend-chcc.onrender.com
🩺 Health Check (Ping): https://todo-list-backend-chcc.onrender.com/ping
O Node To-Do List API é um serviço backend completo projetado para gerenciar tarefas e autenticação de usuários de forma altamente segura. A aplicação conta com suporte a cadastro e login tradicional com criptografia de senha via Bcrypt, login social via Google OAuth 2.0, controle de sessão por cookies HTTP-Only (evitando vulnerabilidades XSS no cliente), e um CRUD completo de tarefas isoladas por usuário utilizando MongoDB e Mongoose.
- 🔐 Autenticação Dupla: Cadastro e login com e-mail/senha ou login social via Google OAuth 2.0.
- 🛡️ Sessões em Cookies HTTP-Only: Armazenamento seguro de tokens JWT em cookies com flags
httpOnly,secureesameSite: none. - 🔑 Criptografia com Bcrypt: Hash de alta segurança para senhas armazenadas no banco de dados.
- 📋 Gerenciamento Completo de Tarefas (CRUD): Criação, listagem, atualização de descrição e status (
Pending,In Progress,Completed) e exclusão de tarefas. - 🔒 Isolamento e Segurança de Dados: Cada usuário possui acesso exclusivo às suas próprias tarefas via middleware de autenticação (
AuthMiddleware). - 🌐 CORS Flexível: Configurado para integração segura com aplicações frontend em ambientes de desenvolvimento e produção.
- Cookies HTTP-Only para JWT: Diferente da abordagem comum de armazenar tokens no
localStorage, os tokens JWT são trafegados via cookieshttpOnly, mitigando vulnerabilidades como ataques XSS. - Integração Nativa com Google OAuth 2.0: Utilização da biblioteca oficial
google-auth-librarypara verificar e validar os tokens de ID emitidos pelo Google no frontend. - Modo Watcher Nativo do Node 22: Uso das flags nativas
--watche--env-fileno Node.js para recarregamento dinâmico sem necessidade de bibliotecas externas comonodemon. - Mongoose Schemas & Indexação: Modelagem otimizada das coleções (
usuariosetarefas) com indexação no campouserIdpara garantir consultas rápidas no banco de dados.
| Tecnologia | Descrição |
|---|---|
| Node.js (v22+) | Ambiente de execução JavaScript no servidor |
| Express.js (v5) | Framework web para criação de APIs RESTful |
| MongoDB & Mongoose | Banco de dados NoSQL e ODM para modelagem de dados |
| JSON Web Token (JWT) | Geração e verificação de tokens de autenticação |
| Google Auth Library | Verificação e integração com login do Google |
| Bcryptjs | Hash de senhas para segurança de usuários |
| Cookie Parser | Middleware para manipulação de cookies HTTP nas requisições |
| Render | Plataforma de hospedagem e deploy da API em produção |
| Método | Endpoint | Descrição | Requer Autenticação |
|---|---|---|---|
GET |
/ping |
Verifica se a API está funcionando | ❌ |
| Método | Endpoint | Descrição | Corpo da Requisição (JSON) |
|---|---|---|---|
POST |
/auth/register |
Cadastra um novo usuário | { "name": "Nome", "email": "user@email.com", "password": "password123" } |
POST |
/auth/login |
Realiza login tradicional | { "email": "user@email.com", "password": "password123" } |
POST |
/auth/google |
Realiza login via Google OAuth | { "token": "<GOOGLE_ID_TOKEN>" } |
POST |
/auth/logout |
Encerra a sessão e limpa o cookie | (Nenhum) |
ℹ️ As rotas de login e registro definem o cookie HTTP-only
tokene retornam o nome do usuário:{ "name": "<Nome do Usuário>" }.
🔒 Todas as rotas de tarefas exigem o cookie de autenticação
token.
| Método | Endpoint | Descrição | Corpo da Requisição (JSON) |
|---|---|---|---|
GET |
/tasks |
Retorna todas as tarefas do usuário logado | (Nenhum) |
POST |
/tasks |
Cria uma nova tarefa | { "description": "Estudar Node.js", "status": "Pending" } |
PUT |
/tasks/:id |
Atualiza uma tarefa existente por ID | { "description": "Estudar Node.js v22", "status": "Completed" } |
DELETE |
/tasks/:id |
Remove uma tarefa por ID | (Nenhum) |
'Pending'(Padrão)'In Progress''Completed'
Node_ToDo-List/
├── src/
│ ├── config/
│ │ └── dbconfig.js # Conexão com o banco de dados MongoDB
│ ├── controllers/
│ │ ├── AuthController.js # Lógica de autenticação (registro, login, google e logout)
│ │ └── TasksController.js# Lógica das operações CRUD de tarefas
│ ├── middleware/
│ │ └── AuthMiddleware.js # Middleware de proteção de rotas via JWT Cookie
│ ├── models/
│ │ ├── UsersModel.js # Schema de Usuário (Mongoose)
│ │ └── TasksModel.js # Schema de Tarefa (Mongoose)
│ └── routes/
│ ├── AuthRoutes.js # Rotas da API de autenticação
│ └── TasksRoutes.js # Rotas da API de tarefas
├── .env # Variáveis de ambiente
├── .gitignore # Arquivos ignorados pelo Git
├── package.json # Dependências e scripts do projeto
├── server.js # Ponto de entrada (Entrypoint) da aplicação Express
└── README.md # Documentação do projeto
Certifique-se de ter o Node.js (versão 22 ou superior) e o npm instalados na sua máquina.
-
Clonar o repositório:
git clone https://github.com/MrHuguitos/Node_ToDo-List.git
-
Acessar a pasta do projeto:
cd Node_ToDo-List -
Instalar as dependências:
npm install
-
Configurar as Variáveis de Ambiente: Crie um arquivo
.envna raiz do projeto baseado no.env.example:PORT=5000 MONGODB_URI=mongodb+srv://<usuario>:<senha>@<cluster>.mongodb.net/To-Do_List JWT_SECRET=seu_jwt_secret_aqui FRONTEND_URL=http://localhost:5173 GOOGLE_CLIENT_ID=seu_google_client_id_aqui
-
Executar a aplicação no modo de desenvolvimento:
npm run dev
-
Testar a API:
Acesse no seu navegador ou cliente HTTP (Postman/Insomnia) o endpointhttp://localhost:5000/ping.
No repositório do projeto, você pode executar:
npm run dev: Inicia o servidor local de desenvolvimento com o watcher nativo do Node.js (node --watch --env-file=.env server.js).npm start: Executa o servidor em ambiente de produção (node server.js).
Desenvolvido por Hugo Araujo (@MrHuguitos).
Se você gostou deste projeto, sinta-se à vontade para deixar uma ⭐️ no repositório!