Skip to content

Geovanni-dev/gym-app-api

Repository files navigation

🏋️ Gym API

📋 Sobre

API para gestão de rotinas de academia, permitindo a geração de treinos automáticos, controle de biblioteca de exercícios e acompanhamento de evolução de carga (PR). O projeto conta com validação de dados via Zod, autenticação via JWT, proteção contra spam com Rate Limit e envio de e-mails com Brevo. Recentemente integrada a um frontend em React, disponível em: gym-app-frontend.


🚀 Instalação e Execução

Execução Local

# 1. Clone o repositório
git clone [https://github.com/Geovanni-dev/gym-app-api.git](https://github.com/Geovanni-dev/gym-app-api.git)

# 2. Instale as dependências
npm install

# 3. Configure o arquivo .env
# Crie um arquivo .env na raiz com as seguintes chaves:
PORT=3000
DATABASE_URL=mongodb://127.0.0.1:27017/workout-api
JWT_SECRET=sua_chave_secreta

# Configurações de E-mail (Brevo API)
BREVO_API_KEY=xkeysib-sua_chave_v3
BREVO_EMAIL=geovanni3344@gmail.com

# Configurações de Upload de Imagens (Cloudinary)
CLOUDINARY_CLOUD_NAME=seu_cloud_name
CLOUDINARY_API_KEY=sua_api_key
CLOUDINARY_API_SECRET=sua_api_secret

# Configurações de CORS e Frontend
CLIENT_URL=[https://gym-superfrango.vercel.app](https://gym-superfrango.vercel.app),http://localhost:5173

# 4. Inicie o servidor
npm start

🐳 Execução via Docker

Você pode subir a API rapidamente usando o Docker, garantindo o mesmo ambiente de execução da produção.

# 1. Certifique-se de que o seu arquivo .env está configurado na raiz do projeto.

# 2. Construa a imagem e inicie o container em segundo plano
docker compose up -d

# Para visualizar os logs em tempo real:
docker compose logs -f

# Para derrubar o container:
docker compose down

🗂️ Arquitetura do Projeto

gym-app-api/
├── src/
│   ├── configs/
│   │   └── cloudinary.js
│   ├── data/
│   │   └── exercises.js
│   ├── exercises/
│   │   ├── controllers/
│   │   └── routes/
│   ├── middleware/
│   │   ├── authMiddleware.js
│   │   └── rateLimit.js
│   ├── models/
│   │   ├── Exercise.js
│   │   ├── User.js
│   │   ├── Workout.js
│   │   ├── WorkoutHistory.js
│   │   └── WorkoutPlan.js
│   ├── services/
│   │   └── emailService.js
│   ├── users/
│   │   ├── controllers/
│   │   └── routes/
│   ├── workoutPlans/
│   │   ├── controllers/
│   │   └── routes/
│   └── workouts/
│       ├── controllers/
│       │   ├── workoutController.js
│       │   └── workoutHistoryController.js
│       └── routes/
├── .dockerignore
├── .env.example
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── package.json
└── server.js

📡 Guia de Endpoints & Payloads

⚠️ Rotas marcadas com 🔒 exigem o Header: Authorization: Bearer <seu_token_jwt>

🔐 Autenticação e Usuário (/users)

Rota Método Auth Payload (Body) Descrição
/register POST {"name": "Geo", "email": "a@a.com", "password": "123"} Cria nova conta
/verify-email POST {"email": "a@a.com", "code": "123456"} Valida o e-mail
/login POST {"email": "a@a.com", "password": "123"} Retorna o Token JWT
/forgot-password POST {"email": "a@a.com"} Envia código de recuperação
/reset-password POST {"code": "123456", "email": "a@a.com", "password": "nova_senha"} Define nova senha

📋 Planos de Treino (/workout-plans)

Rota Método Auth Payload (Body) Descrição
/ POST 🔒 {"name": "Meu Treino", "days": [{"name": "Segunda", "exercises": [{"name": "Supino", "sets": 4, "reps": "10", "weight": 60}]}]} Cria um novo plano
/ GET 🔒 Nenhum Lista todos os planos do usuário
/:planId DELETE 🔒 Nenhum Exclui um plano
/:planId/name PUT 🔒 {"name": "Novo Nome"} Altera o nome do plano
/:planId/reorder PUT 🔒 {"daysOrder": ["Segunda", "Terça", "Quarta"]} Reordena os dias
/:planId/day POST 🔒 {"name": "Quinta", "exercises": []} Adiciona um dia ao plano
/:planId/day/:dayName DELETE 🔒 Nenhum Remove um dia
/:planId/day/:dayName PUT 🔒 {"name": "Novo Nome do Dia"} Renomeia um dia

Exercícios nos Planos

Rota Método Auth Payload (Body) Descrição
/:planId/exercise POST 🔒 {"dayName": "Segunda", "name": "Leg Press", "sets": 4, "reps": "12", "weight": 80} Adiciona exercício a um dia
/:planId/:day/:exerciseName PUT 🔒 {"name": "Novo Nome", "sets": 5, "reps": "8", "weight": 100} Edita um exercício
/:planId/:day/:exerciseName DELETE 🔒 Nenhum Remove um exercício
/:planId/:day/:exerciseName/weight PUT 🔒 {"weight": 90} Atualiza apenas o peso

Compartilhamento

Rota Método Auth Descrição
/copy/:shareCode POST 🔒 Copia um plano público usando código (ex: XXXX-XXXX-XXXX)

🏋️ Treinos (/workouts)

Rota Método Auth Payload (Body) Descrição
/generate POST 🔒 {"goal": "hipertrofia", "days": 4} Gera treino automático
/log POST 🔒 {"exercises": [{"name": "Supino", "sets": [{"reps": 12, "weight": 60}]}]} Registra execução
/history GET 🔒 Nenhum Histórico completo
/history/:exercise GET 🔒 Nenhum Histórico por exercício
/pr GET 🔒 Nenhum Recorde pessoal (?exercise=Supino)
/my-workouts GET 🔒 Nenhum Meus planos

📚 Exercícios (/exercises)

Rota Método Auth Payload (Body) Descrição
/ POST {"name": "Leg Press", "muscle": "Pernas"} Cadastra exercício
/ GET Nenhum Lista todos os exercícios

🛠 Tecnologias

  • Node.js & Express — Ambiente de execução e framework web
  • MongoDB & Mongoose — Banco de dados NoSQL e modelagem de dados
  • Bcrypt.js — Hash de senhas para segurança
  • JSON Web Token (JWT) — Autenticação baseada em tokens
  • Axios & Brevo API — Disparo de e-mails via API REST para verificação e recuperação de senha
  • Cloudinary — Upload e armazenamento de imagens de perfil
  • Zod — Validação de schemas e integridade dos dados recebidos pela API
  • Express Rate Limit — Proteção contra spam e ataques de força bruta
  • Docker — Containerização para padronização de ambientes e deploy

🌐 Deploy no Render

O projeto está hospedado no Render (plataforma cloud gratuita).

  • ✅ Deploy gratuito e simples
  • ✅ Integração direta com GitHub
  • ✅ Suporte nativo a Node.js
  • ✅ SSL automático (HTTPS)

📄 Licença

MIT © Geovani Rodrigues

About

API para gestão de treinos. Este projeto foi desenvolvido com o propósito de compor meu portfólio e consolidar habilidades em Node.js, Express e MongoDB, com ênfase em lógica de negócios e autenticação JWT. A partir dessa base, implementei novas funcionalidades e construí um frontend dedicado do zero em React, motivado por uma necessidade pessoal.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors