📘 This project is also available in English: README.en.md
Esta es una API REST desarrollada en Node.js con Express y PostgreSQL que permite realizar operaciones CRUD sobre un recurso llamado "productos".
- Arquitectura RESTful: Diseñada siguiendo principios REST.
- Base de datos: PostgreSQL con Sequelize ORM.
- Validaciones: Implementadas con express-validator.
- Manejo de errores: Middleware personalizado para gestión de errores.
- Pruebas automatizadas: Test unitarios con Jest y Supertest.
- Integración continua: Configuración de GitHub Actions para ejecutar pruebas automáticamente.
- Documentación: Endpoints y estructura documentados.
- Node.js (v14 o superior)
- PostgreSQL (v12 o superior)
- npm o yarn
productos-api/
├── .github/ # Configuración de GitHub Actions
│ └── workflows/ # Flujos de trabajo para CI
├── src/
│ ├── config/ # Configuración de la base de datos
│ ├── controllers/ # Controladores
│ ├── middleware/ # Middleware personalizado
│ ├── models/ # Modelos de datos
│ ├── routes/ # Rutas de la API
│ ├── validators/ # Validadores
│ ├── app.js # Configuración de Express
│ └── server.js # Punto de entrada
├── tests/ # Pruebas unitarias
├── .env # Variables de entorno
├── .env.example # Ejemplo de variables de entorno
├── .gitignore # Archivos a ignorar por Git
├── jest.config.js # Configuración de Jest
├── package.json # Dependencias y scripts
└── README.md # Documentación del proyecto
-
Clonar el repositorio:
git clone <url-del-repositorio> cd productos-api
-
Instalar dependencias:
npm install
-
Configurar variables de entorno:
cp .env.example .env
Edita el archivo
.envcon tus configuraciones. -
Crea la base de datos en PostgreSQL con la siguiente estructura:
`CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT NOT NULL, price NUMERIC(10,2) NOT NULL, available_quantity INTEGER NOT NULL, created_at TIMESTAMP WITH TIME ZONE, updated_at TIMESTAMP WITH TIME ZONE NOT NULL );`
-
Iniciar el servidor:
npm run dev
| Método | URL | Descripción |
|---|---|---|
| POST | /api/productos | Crear un nuevo producto |
| GET | /api/productos | Obtener todos los productos |
| GET | /api/productos/:id | Obtener un producto por ID |
| PUT | /api/productos/:id | Actualizar un producto existente |
| DELETE | /api/productos/:id | Eliminar un producto |
curl -X POST http://localhost:3000/api/productos \
-H "Content-Type: application/json" \
-d '{
"name": "Smartphone XYZ",
"description": "High-end smartphone with excellent features",
"price": 599.99,
"available_quantity": 50
}'curl -X GET http://localhost:3000/api/productoscurl -X GET http://localhost:3000/api/productos/1curl -X PUT http://localhost:3000/api/productos/1 \
-H "Content-Type: application/json" \
-d '{
"price": 549.99,
"available_quantity": 45
}'curl -X DELETE http://localhost:3000/api/productos/1# Para sistemas Unix/Linux/macOS:
npm test
# Para sistemas Windows:
npm run test:windowsEste proyecto está configurado con GitHub Actions para ejecutar pruebas automáticamente en cada push o pull request a las ramas main/master. Puedes ver los resultados en la pestaña "Actions" del repositorio.
- name: String, requerido, entre 3 y 100 caracteres.
- description: String, requerido, mínimo 10 caracteres.
- price: Número, requerido, valor positivo.
- available_quantity: Entero, requerido, valor positivo.
- Middleware de error con registro seguro (sin exponer stack traces o rutas internas)
- Respuestas de error estructuradas y consistentes
- Validación estricta de entrada de datos