Proyecto para gestión de eventos y venta de tickets con prevención de sobreventa, QR para validación y dashboard con métricas.
- Front online: https://event-tickets1.netlify.app/ Configurar
VITE_API_URL. - API: Laravel 11 con endpoints REST bajo
/api.
- Frontend: React 18+/19, TypeScript, Vite, React Router, TanStack Query, Vitest + React Testing Library, Playwright (E2E)
- Backend: Laravel 11, SQLite/MySQL/PostgreSQL, PHPUnit, Larastan (nivel 8), PHP-CS-Fixer/Pint, L5-Swagger (OpenAPI)
- Calidad: Conventional Commits (commitlint + Husky), ESLint + Prettier
- Node 18+ (recomendado 20+), npm
- PHP 8.2+
- Composer
- SQLite (incluido) o MySQL/PostgreSQL
- Ir a
backende instalar dependencias:
cd backend
composer install- Copiar
.envy configurar DB (por defecto SQLite ya está preparado endatabase/database.sqlite):
php artisan key:generate- Migrar y sembrar datos de ejemplo:
php artisan migrate --seed- Levantar el servidor local:
php artisan serve
# API disponible en http://localhost:8000- Ir a
fronte instalar dependencias:
cd front
npm install- Crear
.envy configurar la URL de la API (incluye el prefijo/api):
echo VITE_API_URL=http://localhost:8000/api > .env.local- Levantar el front en desarrollo:
npm run dev
# App en http://localhost:5173npm run dev: servidor de desarrollo Vitenpm run build: build de producciónnpm run lint: ESLintnpm run test: tests unitarios (Vitest)npm run test:coverage: coberturanpm run test:e2e: E2E (Playwright)
php artisan testocomposer test: tests (PHPUnit)npm run lint: ESLint para assets del backend (Inertia/Vite)npm run format/npm run format:check: Prettier sobreresources/vendor/bin/pint: formateo PHP (Pint)vendor/bin/php-cs-fixer fix: formateo PHP (PHP-CS-Fixer)vendor/bin/phpstan analyse --memory-limit=1G: análisis estático (Larastan, nivel 8)
Base de la API: http://localhost:8000/api
-
POST
/events: crear evento- Body:
{ "name": string, "date": YYYY-MM-DD, "capacity": number } - Respuestas:
201éxito;422validación
- Body:
-
GET
/events: listar eventos- Query opcionales:
search,page,pageSize
- Query opcionales:
-
GET
/events/{id}: detalle de evento -
GET
/events/{id}/sales: métricas rápidas del evento- Ejemplo de respuesta:
{ event, tickets_sold, capacity, occupancy_percentage }
- Ejemplo de respuesta:
-
POST
/orders: comprar tickets (1..10)- Body:
{ "event_id": number, "buyer_name": string, "buyer_email": string, "quantity": 1..10, "idempotency_key": string } - Respuestas:
201creado;422sin stock;423locked por idempotencia en curso
- Body:
-
(Opcional) GET
/orders/status: estado poridempotency_key(actualmente501no implementado)
- Anotaciones
@OApresentes en controladores y modelos - Generar docs:
php artisan l5-swagger:generate- UI:
http://localhost:8000/api/documentation
- Locking por idempotencia: cada compra usa
Cache::lock("order_lock_{idempotency_key}"). Si el lock no se adquiere, se devuelve423 Lockedevitando dobles procesos para la misma orden. - Transacción de base de datos: el job
ProcessTicketOrdercorre dentro deDB::transaction(...), validando(tickets_sold + quantity) <= capacitycon una lectura fresca del evento. - Constraints:
orders.qr_codeesuniquey las relaciones usan FK. Los hooks del modeloOrdersincronizantickets_soldal crear/eliminar/restaurar. - Idempotencia: respuestas cacheadas por
idempotency_keycuando aplica. El front debe enviar siempre unaidempotency_keyúnica por intento.
Ubicación: backend/tests/Feature/
ConcurrencyTest.php: 150 requests, verifica límite de stock, duplicados y consistencia detickets_sold.AdvancedConcurrencyTest.php: transacciones paralelas, cancelaciones simultáneas, cantidades variables.RealProcessConcurrencyTest.php: usa procesos reales víapcntl(se omite si la extensión no está disponible).
Ejecutar tests de backend:
cd backend
php artisan test
# o
composer testE2E (frontend):
cd front
npm run test:e2eEndpoints de soporte:
GET /dashboard/sales– ventas por mes (últimos 6 meses)GET /dashboard/rejected-users– órdenes canceladas por mesGET /dashboard/top-events– top 5 eventos por ventasGET /dashboard/user-stats– compradores únicos por mes
La UI del front consume estas métricas y visualiza gráficos/tablas.
- Configurar variable de entorno
VITE_API_URLapuntando a una API accesible https://event-tickets-production.up.railway.app/ - Build:
npm run build
- Configurar PHP 8.2+,
.env, base de datos y cache (Redis recomendado para locks en producción) - Migrar y seed:
php artisan migrate --seed - Opcional: colas para jobs (Redis/Database),
php artisan queue:work
- Commits: Conventional Commits. Commitlint + Husky en el repo (crear hook
commit-msgsi no existe). - Linter/Formatting:
- Front/Back assets: ESLint + Prettier
- PHP: Pint / PHP-CS-Fixer
- Análisis estático: Larastan nivel ≥8
- Env var del front debe incluir el prefijo
/api: ejemploVITE_API_URL=http://localhost:8000/api. - Algunos tests de concurrencia real requieren la extensión
pcntl.