Este proyecto es una API REST desarrollada para el programa MasterChef Celebrity. La idea es que participantes, chefs profesionales y televidentes puedan compartir sus recetas en la plataforma del programa.
La API permite gestionar recetas de cocina con toda la información necesaria: ingredientes, pasos de preparación, nombre del chef y tipo de participante. Si la receta fue hecha por un participante del programa, también se registra en qué temporada apareció.
Funcionalidades principales:
- Crear recetas según el tipo de usuario (participante, chef o televidente)
- Consultar todas las recetas o buscar una específica
- Filtrar recetas por tipo de usuario o temporada
- Buscar recetas que contengan ciertos ingredientes
- Actualizar y eliminar recetas
- Node.js y Express para el backend
- MongoDB con Mongoose como base de datos
- Swagger para la documentación interactiva
- Jest y Supertest para las pruebas
- GitHub Actions para CI/CD
- Azure para el hosting
Requisitos previos:
- Node.js v18 o superior
- MongoDB (local o Atlas)
- npm
Pasos:
- Clonar el repositorio:
git clone https://github.com/SebasDuqueC/Masterchef-celebrity.git
cd Masterchef-celebrity- Instalar las dependencias:
npm install- Configurar las variables de entorno creando un archivo
.env:
PORT=3000
MONGODB_URI=mongodb://localhost:27017/masterchef-celebrity
NODE_ENV=developmentSi usas MongoDB Atlas, la URI se vería algo así:
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/masterchef-celebrityPara levantar el servidor en modo desarrollo:
npm run devO en modo producción:
npm startUna vez iniciado, puedes acceder a:
- API:
http://localhost:3000 - Documentación Swagger:
http://localhost:3000/api-docs
Ejecutar las pruebas:
npm testURL Base:
- Local:
http://localhost:3000 - Producción:
https://masterchef-celebrity-api-dgc0b0hgd8bhc6e3.eastus-01.azurewebsites.net
POST /api/recetas/televidenteRequest Body:
{
"titulo": "Pasta Carbonara",
"ingredientes": ["Pasta", "Huevos", "Queso parmesano", "Panceta", "Pimienta negra"],
"pasos": ["Cocinar la pasta", "Freír la panceta", "Mezclar huevos con queso", "Combinar todo"],
"nombreChef": "María González"
}Respuesta exitosa (201):
{
"success": true,
"message": "Receta de televidente creada exitosamente",
"data": {
"consecutivo": 1,
"titulo": "Pasta Carbonara",
"ingredientes": ["Pasta", "Huevos", "Queso parmesano", "Panceta", "Pimienta negra"],
"pasos": ["Cocinar la pasta", "Freír la panceta", "Mezclar huevos con queso", "Combinar todo"],
"chef": {
"nombre": "María González",
"tipo": "televidente"
}
}
}POST /api/recetas/participanteRequest Body:
{
"titulo": "Ceviche de Pescado",
"ingredientes": ["Pescado fresco", "Limón", "Cebolla", "Cilantro", "Ají"],
"pasos": ["Cortar el pescado en cubos", "Añadir limón", "Dejar marinar", "Agregar vegetales"],
"nombreChef": "Carlos Ramírez",
"temporada": 5
}Respuesta exitosa (201):
{
"success": true,
"message": "Receta de participante creada exitosamente",
"data": {
"consecutivo": 2,
"titulo": "Ceviche de Pescado",
"temporada": 5,
"chef": {
"nombre": "Carlos Ramírez",
"tipo": "participante"
}
}
}POST /api/recetas/chefRequest Body:
{
"titulo": "Risotto de Hongos",
"ingredientes": ["Arroz arborio", "Hongos", "Caldo de pollo", "Vino blanco", "Queso parmesano"],
"pasos": ["Sofreír la cebolla", "Tostar el arroz", "Agregar vino", "Añadir caldo gradualmente"],
"nombreChef": "Chef Jorge Rausch"
}GET /api/recetas
Devuelve un array con todas las recetas registradas.
GET /api/recetas/:consecutivo
Ejemplo: GET /api/recetas/1
Si no existe la receta, devuelve un 404:
{
"success": false,
"message": "No se encontró una receta con el consecutivo 999"
}GET /api/recetas/tipo/participantes- Solo recetas de participantesGET /api/recetas/tipo/televidentes- Solo recetas de televidentesGET /api/recetas/tipo/chefs- Solo recetas de chefs profesionales
GET /api/recetas/temporada/:temporada
Ejemplo: GET /api/recetas/temporada/5
GET /api/recetas/ingrediente/:ingrediente
Ejemplo: GET /api/recetas/ingrediente/pollo
La búsqueda no distingue mayúsculas/minúsculas.
PUT /api/recetas/:consecutivo
Puedes actualizar cualquier campo de la receta. Solo envías los campos que quieres cambiar.
DELETE /api/recetas/:consecutivo
La documentación interactiva está disponible en /api-docs cuando levantes el servidor. Ahí puedes probar todos los endpoints directamente desde el navegador.
- Local: http://localhost:3000/api-docs
- Producción: https://masterchef-celebrity-api-dgc0b0hgd8bhc6e3.eastus-01.azurewebsites.net/api-docs
El proyecto tiene configurado GitHub Actions para automatizar el proceso:
Rama develop: Cada vez que haces push o creas un pull request, se ejecutan automáticamente las pruebas para verificar que todo funcione bien.
Rama main: Cuando haces merge a main, además de ejecutar las pruebas, se despliega automáticamente la aplicación en Azure.
El proyecto incluye pruebas para validar:
- Que se puedan crear recetas correctamente
- Que la búsqueda por ingrediente funcione
- Que se devuelva error 404 cuando una receta no existe
├── .github/workflows/ # CI/CD con GitHub Actions
├── src/
│ ├── config/ # Configuración de MongoDB y Swagger
│ ├── controllers/ # Lógica de negocio
│ ├── models/ # Modelos de Mongoose
│ ├── routes/ # Definición de rutas
│ ├── app.js # Configuración de Express
│ └── server.js # Entrada de la aplicación
├── tests/ # Pruebas unitarias
└── package.json
Para desplegar en Azure necesitas configurar algunos secrets en GitHub:
AZURE_WEBAPP_NAME- Nombre de tu aplicación en AzureAZURE_WEBAPP_PUBLISH_PROFILE- Perfil de publicación que descargas de AzureMONGODB_URI- URI de MongoDB Atlas para producciónMONGODB_URI_TEST- URI de MongoDB para testing
Una vez configurados los secrets, solo necesitas hacer merge de develop a main y el despliegue se hace automáticamente.
Sebastián Duque - DOSW Company
Repositorio: https://github.com/SebasDuqueC/Masterchef-celebrity
Este proyecto fue desarrollado como parte del curso de Desarrollo Orientado a Servicios Web. Cualquier duda o sugerencia es bienvenida.