Evidencia AA2-EV01 Backend desarrollado con Node.js, Express y MongoDB.
Sistema de Gestión de Recetas de Cocina desarrollado como una API RESTful para la empresa ficticia Sabores del Mundo S.A.S.
La aplicación permite administrar recetas internacionales mediante operaciones CRUD, almacenando la información en MongoDB y exponiéndola a través de una API REST construida con Express.
El proyecto fue desarrollado utilizando una arquitectura MVC, buenas prácticas de desarrollo, documentación mediante JSDoc y variables de entorno administradas con la nueva funcionalidad nativa de Node.js (process.loadEnvFile()).
Actualmente Sabores del Mundo S.A.S. almacena sus recetas en documentos de Word y hojas de cálculo de Excel.
Esta metodología presenta varios inconvenientes:
- dificultad para buscar recetas
- clasificación poco eficiente
- duplicación de información
- actualización manual de ingredientes
- difícil mantenimiento
- poco control sobre tiempos de preparación
- imposibilidad de integrarse fácilmente con otras aplicaciones
Se desarrolló una API REST que centraliza toda la información de las recetas utilizando MongoDB.
La solución permite:
- crear recetas
- consultar recetas
- actualizar recetas
- eliminar recetas
- validar los datos antes de almacenarlos
- organizar la información mediante una arquitectura escalable
- Node.js
- Express
- MongoDB
- Mongoose
- Morgan
- Nodemon
- JavaScript ES Modules (ESM)
- JSDoc
El proyecto utiliza el patrón MVC.
Cliente
│
HTTP REST
│
Routes
│
Controllers
│
Models
│
MongoDB (Mongoose)
│
Base de datos
- API RESTful
- Arquitectura MVC
- MongoDB Atlas
- Validaciones mediante Mongoose
- Scripts para creación del esquema
- Seed de datos iniciales
- Variables de entorno
- Manejo de errores
- Respuestas HTTP consistentes
- Código documentado con JSDoc
Software necesario:
- Node.js 24 o superior
- MongoDB Atlas
- npm
- Git
Clonar el repositorio
git clone https://github.com/carlosandresalzate/lab-sena-API.gitEntrar al proyecto
cd lab-sena-APIInstalar dependencias
npm installCrear un archivo llamado
.env
con el siguiente contenido:
PORT=5000
SERVER_DB=cluster.xxxxxxxxx.mongodb.net
USER_DB=usuario
PASS_DB=contraseña| Variable | Descripción |
|---|---|
| PORT | Puerto donde se ejecutará la API |
| SERVER_DB | Dirección del servidor MongoDB Atlas |
| USER_DB | Usuario de la base de datos |
| PASS_DB | Contraseña del usuario de MongoDB |
La aplicación carga automáticamente el archivo mediante:
process.loadEnvFile(".env");sin necesidad de utilizar dotenv.
Modo desarrollo
npm run devModo producción
npm start| Script | Descripción |
|---|---|
| npm start | Ejecuta la API |
| npm run dev | Ejecuta la API con Nodemon |
| npm run seed | Inserta recetas de ejemplo |
| npm run seed:force | Reemplaza completamente los datos (elimina) |
| npm run create-db | Ejecuta el script de creación de la base de datos |
| npm run schema | Ejecuta el JSON Schema en MongoDB |
| npm run help | Muestra ayuda de los scripts |
Script utilizado durante el desarrollo para:
- crear la base de datos
- crear la colección recetas
Define el esquema JSON de MongoDB mediante:
- validaciones
- tipos de datos
- campos obligatorios
- restricciones
.
├── scripts/
│ ├── data/
│ │ └── recetas.seed.js
│ ├── 01-create-db.js
│ ├── 02-schema.js
│ ├── recetas.help.js
│ └── seed.js
│
├── src/
│ ├── config/
│ │ └── database.js
│ │
│ ├── controllers/
│ │ └── receta.controller.js
│ │
│ ├── models/
│ │ └── receta.model.js
│ │
│ ├── routes/
│ │ └── receta.routes.js
│ │
│ ├── schema/
│ │ └── receta.schema.js
│ │
│ ├── app.js
│ └── server.js
│
├── .env
├── .gitignore
├── LICENSE
├── package.json
└── README.md
Contiene todo el código fuente de la aplicación.
o Administra la conexión con MongoDB.
Recibe las solicitudes HTTP y genera las respuestas correspondientes.
Implementa la lógica de acceso a la base de datos.
Define todos los endpoints disponibles.
Contiene los modelos de Mongoose utilizados por la aplicación.
Incluye herramientas auxiliares para desarrollo:
- creación de la base
- esquema
- carga de datos
- ayuda
Cada receta contiene:
{
"nombre": "",
"descripcion": "",
"categoria": "",
"paisOrigen": "",
"ingredientes": [],
"tiempoPreparacion": 0,
"porciones": 0,
"dificultad": "",
"pasos": [],
"vegetariana": false
}GET /api/recetas
GET /api/recetas/:id
POST /api/recetas
PUT /api/recetas/:id
DELETE /api/recetas/:id
DELETE /api/recetas
POST /api/recetas
Content-Type: application/json{
"nombre": "Pizza Margarita",
"descripcion": "Pizza italiana tradicional",
"categoria": "Plato Principal",
"paisOrigen": "Italia",
"ingredientes": [
{
"nombre": "Harina",
"cantidad": "500",
"unidad": "gramos"
}
],
"tiempoPreparacion": 40,
"porciones": 4,
"dificultad": "Facil",
"pasos": ["Preparar la masa", "Hornear"],
"vegetariana": true
}La API devuelve respuestas consistentes.
Éxito
{
"success": true,
"message": "Operación realizada correctamente.",
"data": {}
}Error
{
"success": false,
"message": "No se encontró la receta."
}DeleteAll
{
"success": true,
"message": "Todas las recetas fueron eliminadas correctamente",
"data": {
"deletedCount": 12
}
}| Código | Significado |
|---|---|
| 200 | OK |
| 201 | Created |
| 204 | No Content |
| 400 | Bad Request |
| 404 | Not Found |
| 500 | Internal Server Error |
El proyecto incluye un conjunto de recetas iniciales.
Para cargarlas:
npm run seedPara reemplazarlas completamente:
npm run seed:forceTodo el proyecto se encuentra documentado mediante JSDoc, incluyendo:
- clases
- funciones
- métodos
- parámetros
- tipos de retorno
En el desarrollo de la evidencia me vi con la necesidad de agregar algunas a futuro, las listo aquí como parte de mi bitácora.
- Autenticación mediante JWT.
- Gestión de usuarios y roles.
- Búsqueda avanzada por filtros.
- Paginación de resultados.
- Documentación automática con Swagger/OpenAPI.
- Validaciones utilizando express-validator.
- Pruebas unitarias e integración.
- Contenerización con Docker.
- Pipeline de integración continua (CI/CD).
Desarrollado como evidencia académica del SENA.
Proyecto: Sistema de Gestión de Recetas de Cocina
Cliente ficticio: Sabores del Mundo S.A.S.
Este proyecto se distribuye bajo la licencia GNU General Public License v3.0 o posterior (GPL-3.0-or-later).
Consulte el archivo LICENSE para obtener el texto completo de la licencia.