Skip to content

omar49511/event-tickets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Event Tickets – Fullstack (Laravel 11 + React 18+)

Proyecto para gestión de eventos y venta de tickets con prevención de sobreventa, QR para validación y dashboard con métricas.

Demo

Stack

  • 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

Instalación rápida

Requisitos

  • Node 18+ (recomendado 20+), npm
  • PHP 8.2+
  • Composer
  • SQLite (incluido) o MySQL/PostgreSQL

Backend (Laravel)

  1. Ir a backend e instalar dependencias:
cd backend
composer install
  1. Copiar .env y configurar DB (por defecto SQLite ya está preparado en database/database.sqlite):
php artisan key:generate
  1. Migrar y sembrar datos de ejemplo:
php artisan migrate --seed
  1. Levantar el servidor local:
php artisan serve
# API disponible en http://localhost:8000

Frontend (React)

  1. Ir a front e instalar dependencias:
cd front
npm install
  1. Crear .env y configurar la URL de la API (incluye el prefijo /api):
echo VITE_API_URL=http://localhost:8000/api > .env.local
  1. Levantar el front en desarrollo:
npm run dev
# App en http://localhost:5173

Scripts

Front (front/)

  • npm run dev: servidor de desarrollo Vite
  • npm run build: build de producción
  • npm run lint: ESLint
  • npm run test: tests unitarios (Vitest)
  • npm run test:coverage: cobertura
  • npm run test:e2e: E2E (Playwright)

Back (backend/)

  • php artisan test o composer test: tests (PHPUnit)
  • npm run lint: ESLint para assets del backend (Inertia/Vite)
  • npm run format / npm run format:check: Prettier sobre resources/
  • 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)

API

Base de la API: http://localhost:8000/api

  • POST /events: crear evento

    • Body: { "name": string, "date": YYYY-MM-DD, "capacity": number }
    • Respuestas: 201 éxito; 422 validación
  • GET /events: listar eventos

    • Query opcionales: search, page, pageSize
  • 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 }
  • POST /orders: comprar tickets (1..10)

    • Body: { "event_id": number, "buyer_name": string, "buyer_email": string, "quantity": 1..10, "idempotency_key": string }
    • Respuestas: 201 creado; 422 sin stock; 423 locked por idempotencia en curso
  • (Opcional) GET /orders/status: estado por idempotency_key (actualmente 501 no implementado)

OpenAPI (Swagger)

  • Anotaciones @OA presentes en controladores y modelos
  • Generar docs:
php artisan l5-swagger:generate
  • UI: http://localhost:8000/api/documentation

Anti-sobreventa: diseño y garantías

  • Locking por idempotencia: cada compra usa Cache::lock("order_lock_{idempotency_key}"). Si el lock no se adquiere, se devuelve 423 Locked evitando dobles procesos para la misma orden.
  • Transacción de base de datos: el job ProcessTicketOrder corre dentro de DB::transaction(...), validando (tickets_sold + quantity) <= capacity con una lectura fresca del evento.
  • Constraints: orders.qr_code es unique y las relaciones usan FK. Los hooks del modelo Order sincronizan tickets_sold al crear/eliminar/restaurar.
  • Idempotencia: respuestas cacheadas por idempotency_key cuando aplica. El front debe enviar siempre una idempotency_key única por intento.

Tests de concurrencia (≥100 req simultáneos)

Ubicación: backend/tests/Feature/

  • ConcurrencyTest.php: 150 requests, verifica límite de stock, duplicados y consistencia de tickets_sold.
  • AdvancedConcurrencyTest.php: transacciones paralelas, cancelaciones simultáneas, cantidades variables.
  • RealProcessConcurrencyTest.php: usa procesos reales vía pcntl (se omite si la extensión no está disponible).

Ejecutar tests de backend:

cd backend
php artisan test
# o
composer test

E2E (frontend):

cd front
npm run test:e2e

Dashboard

Endpoints de soporte:

  • GET /dashboard/sales – ventas por mes (últimos 6 meses)
  • GET /dashboard/rejected-users – órdenes canceladas por mes
  • GET /dashboard/top-events – top 5 eventos por ventas
  • GET /dashboard/user-stats – compradores únicos por mes

La UI del front consume estas métricas y visualiza gráficos/tablas.


Despliegue

Front (Vercel/Netlify/Render)

Back (Render/EC2/Forge/Docker)

  • 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

Convenciones y calidad

  • Commits: Conventional Commits. Commitlint + Husky en el repo (crear hook commit-msg si no existe).
  • Linter/Formatting:
    • Front/Back assets: ESLint + Prettier
    • PHP: Pint / PHP-CS-Fixer
    • Análisis estático: Larastan nivel ≥8

Notas

  • Env var del front debe incluir el prefijo /api: ejemplo VITE_API_URL=http://localhost:8000/api.
  • Algunos tests de concurrencia real requieren la extensión pcntl.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages