API RESTful para gestión de productos con soporte multi-divisa.
- Laravel 11.x
- PHP 8.2+
- MySQL 8.0+
- PHPUnit para testing
# 1. Instalar dependencias
composer install
# 2. Configurar entorno
cp .env.example .env
php artisan key:generate
# 3. Configurar base de datos en .env
DB_DATABASE=beos_20260106
DB_USERNAME=root
DB_PASSWORD=
# 4. Ejecutar migraciones (creará la BD si confirma con 'yes')
php artisan migrate
# 5. Ejecutar seeder
php artisan db:seed
# 6. Iniciar servidor
php artisan servephp artisan testInterfaz interactiva: http://localhost:8000/api/documentation
- Postman:
postman_collection.json - Insomnia:
insomnia_collection.json
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/products |
Listar productos |
| POST | /api/products |
Crear producto |
| GET | /api/products/{id} |
Obtener producto |
| PUT | /api/products/{id} |
Actualizar producto |
| DELETE | /api/products/{id} |
Eliminar producto |
| GET | /api/products/{id}/prices |
Listar precios |
| POST | /api/products/{id}/prices |
Crear precio en divisa |
app/
├── Http/
│ ├── Controllers/Api/
│ │ ├── ProductController.php
│ │ └── ProductPriceController.php
│ ├── Requests/
│ │ ├── StoreProductRequest.php
│ │ ├── UpdateProductRequest.php
│ │ └── StoreProductPriceRequest.php
│ └── Resources/
│ ├── ProductResource.php
│ ├── ProductPriceResource.php
│ └── CurrencyResource.php
└── Models/
├── Product.php
├── ProductPrice.php
└── Currency.php
database/
├── migrations/ (3 tablas: currencies, products, product_prices)
├── seeders/ (datos de ejemplo)
└── factories/ (generación de datos para tests)
- CRUD completo de productos
- Gestión de precios multi-divisa
- Validación con Form Requests
- Transformación con API Resources
- Soft Deletes
- Paginación
- Filtros y búsqueda
- Eager loading (prevención N+1)
- Transacciones de BD
- Manejo de errores
- Testing completo
Tablas:
currencies- Catálogo de divisas (USD, EUR, MXN, COP, ARS)products- Productos con precio baseproduct_prices- Precios por divisa
Relaciones:
- Product → Currency (belongsTo)
- Product → ProductPrice[] (hasMany)
- ProductPrice → Currency (belongsTo)
Se utiliza Form Requests para separar la lógica de validación del controlador.
API Resources proporcionan una capa de transformación consistente para las respuestas JSON.
Eager loading en las relaciones para prevenir el problema N+1 de consultas.
- Validación estricta de inputs
- Eloquent previene SQL injection
- Mass assignment protection
- Foreign key constraints