Un servidor REST completo desarrollado con Node.js, Express y MongoDB que implementa un sistema robusto de gestión de usuarios con autenticación JWT y autorización basada en roles.
- Características
- Tecnologías
- Instalación
- Configuración
- Uso
- API Endpoints
- Estructura del Proyecto
- Modelo de Datos
- Autenticación
- Contribuir
- Licencia
- 🔐 Autenticación JWT - Sistema seguro de autenticación con tokens
- 👥 Gestión de Usuarios - CRUD completo para usuarios
- 🛡️ Autorización por Roles - Sistema de permisos (Admin, User, Seller)
- 🔒 Encriptación de Contraseñas - Usando bcrypt para máxima seguridad
- ✅ Validación de Datos - Validaciones robustas con express-validator
- 🌐 CORS Habilitado - Configurado para desarrollo y producción
- 📁 Archivos Estáticos - Servidor de archivos públicos
- 🏗️ Arquitectura MVC - Código bien organizado y escalable
- Node.js - Entorno de ejecución de JavaScript
- Express.js - Framework web minimalista y flexible
- MongoDB - Base de datos NoSQL
- Mongoose - ODM para MongoDB
- bcrypt - Hashing de contraseñas
- jsonwebtoken - Implementación de JWT
- express-validator - Validación y sanitización de datos
- cors - Control de acceso entre orígenes
- dotenv - Gestión de variables de entorno
- Node.js (v14 o superior)
- MongoDB (local o Atlas)
- npm o yarn
-
Clonar el repositorio
git clone https://github.com/jeanc4rl02/node-coffee.git cd node-coffee -
Instalar dependencias
npm install
-
Configurar variables de entorno
cp .env.example .env # Editar el archivo .env con tus configuraciones -
Iniciar el servidor
npm start
Crear un archivo .env en la raíz del proyecto:
# Puerto del servidor
PORT=8080
# Base de datos
MONGODB_CNN=mongodb://localhost:27017/coffee_db
# O para MongoDB Atlas:
# MONGODB_CNN=mongodb+srv://username:password@cluster.mongodb.net/coffee_db
# JWT Secret
JWT_SECRET=tu_jwt_secret_aqui
# Entorno
NODE_ENV=developmentnpm startNODE_ENV=production npm startEl servidor estará disponible en http://localhost:8080
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123"
}Respuesta:
{
"user": {
"uid": "user_id",
"name": "Usuario",
"email": "user@example.com",
"role": "USER_ROLE",
"status": true
},
"token": "jwt_token_here"
}GET /api/v1/users
Authorization: Bearer {token}POST /api/v1/users
Content-Type: application/json
{
"name": "Nuevo Usuario",
"email": "nuevo@example.com",
"password": "password123",
"role": "USER_ROLE"
}PUT /api/v1/users/{id}
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Nombre Actualizado",
"email": "actualizado@example.com"
}DELETE /api/v1/users/{id}
Authorization: Bearer {token}Requiere rol ADMIN_ROLE o SELLER_ROLE
| Código | Descripción |
|---|---|
| 200 | OK - Operación exitosa |
| 201 | Created - Recurso creado |
| 400 | Bad Request - Error en la solicitud |
| 401 | Unauthorized - Token inválido o faltante |
| 403 | Forbidden - Permisos insuficientes |
| 404 | Not Found - Recurso no encontrado |
| 500 | Internal Server Error - Error del servidor |
node-coffee/
├── 📄 app.js # Punto de entrada
├── 📁 controllers/ # Lógica de negocio
│ ├── auth.controller.js # Controlador de autenticación
│ └── user.controller.js # Controlador de usuarios
├── 📁 database/ # Configuración de BD
│ └── config.js # Conexión a MongoDB
├── 📁 helpers/ # Funciones auxiliares
│ └── db-validators.js # Validadores de BD
├── 📁 middlewares/ # Middlewares personalizados
│ ├── validate-fields.js # Validación de campos
│ ├── validate-jwt.js # Validación de JWT
│ └── validate-roles.js # Validación de roles
├── 📁 models/ # Modelos de datos
│ ├── server.js # Configuración del servidor
│ ├── user.models.js # Modelo de usuario
│ └── role.models.js # Modelo de roles
├── 📁 public/ # Archivos estáticos
├── 📁 routes/ # Definición de rutas
│ ├── auth.routes.js # Rutas de autenticación
│ └── user.routes.js # Rutas de usuarios
├── 📄 package.json # Dependencias y scripts
└── 📄 README.md # Documentación
{
name: String, // Nombre del usuario (min: 3 caracteres)
email: String, // Email único
password: String, // Contraseña encriptada (min: 6 caracteres)
img: String, // URL de imagen de perfil
role: String, // ADMIN_ROLE | USER_ROLE | SELLER_ROLE
status: Boolean, // true (activo) | false (inactivo)
google: Boolean // true si es cuenta de Google
}{
role: String // Nombre del rol
}- Expiración: Configurable en variables de entorno
- Algoritmo: HS256
- Payload: Contiene el ID del usuario
// Validación de JWT
validateJWT
// Validación de roles específicos
hasRole('ADMIN_ROLE', 'SELLER_ROLE')
// Validación de campos
validateFields| Rol | Permisos |
|---|---|
| ADMIN_ROLE | Acceso completo (CRUD usuarios) |
| SELLER_ROLE | Lectura y eliminación de usuarios |
| USER_ROLE | Solo lectura de su propia información |
# Ejecutar tests (cuando estén implementados)
npm testcurl -X POST http://localhost:8080/api/v1/users \
-H "Content-Type: application/json" \
-d '{
"name": "Juan Pérez",
"email": "juan@example.com",
"password": "123456",
"role": "USER_ROLE"
}'curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "juan@example.com",
"password": "123456"
}'Las contribuciones son bienvenidas. Para contribuir:
- Fork el proyecto
- Crear una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -m 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abrir un Pull Request
- Usar ES6+ features
- Seguir las convenciones de nombres
- Documentar funciones complejas
- Incluir validaciones apropiadas
Este proyecto está bajo la Licencia ISC. Ver el archivo LICENSE para más detalles.
Jean Carlos Carrillo - @jeanc4rl02
⭐ ¡No olvides darle una estrella al proyecto si te fue útil!