Un sistema de gestión de contenido (CMS) para club deportivo, construido con Laravel 12.x, PHP 8.2, MySQL 8.1 y desplegado mediante Docker + Docker Compose, con Caddy como servidor web.
- Descripción del proyecto
- Funcionalidades
- Lógica de negocio
- Instalación y puesta en marcha
- Ejemplos de uso de la API
- Comandos útiles para desarrollo
- Documentación y herramientas
- Autenticación y autorización
- Arquitectura técnica
- Contribución
- Contacto
Este proyecto proporciona una API REST para la gestión completa de un club deportivo. Consta de dos áreas principales:
- Panel de gestión: Control de acceso, usuarios, permisos y administración general de la aplicación.
- Gestión de club polideportivo: CRUD de socios, pistas, reservas, y lógica de negocio para el sistema de reservas.
- CRUD de Usuarios: Registro, login, logout y gestión de roles/permisos.
- Autenticación OAuth2 con Laravel Passport
- Roles:
adminyuser
- CRUD de Deportes: (Tenis, Pádel, Fútbol, Baloncesto...)
- CRUD de Pistas: Cada pista asociada a un único deporte
- CRUD de Socios: Gestión de datos de los miembros del club
- CRUD de Reservas: Un socio reserva una pista para una franja horaria
- Buscador de Pistas: Dada una fecha, deporte y socio, devuelve las pistas disponibles
- Listado de Reservas del Día: Dada una fecha, devuelve todas las reservas confirmadas
- Reservas disponibles entre las 08:00 y las 22:00 de lunes a domingo en franjas de 1 hora
- No se permiten dos reservas de la misma pista en la misma franja horaria
- Un socio no puede reservar más de 2 pistas simultáneamente y un máximo de 3 reservas por día
- Docker ≥ 20.10
- Docker Compose ≥ 1.29
- Git ≥ 2.30
-
Clonar el repositorio:
git clone https://github.com/CleanMatyx/api_club_cms.git cd api_club_cms -
Arranca los contenedores:
docker compose up -dServicios levantados:
club_cms_webserver(Caddy puertos 80/443)club_cms_php(PHP-FPM 8.2)club_cms_database(MySQL 8.1)
-
Acceder al contenedor PHP:
docker compose exec -it club_cms_php sh -
Instalar dependencias:
composer install -
Crear y poblar la base de datos:
php artisan migrate:fresh --seed -
Configurar Laravel Passport:
php artisan passport:client --personal- Presiona Enter para aceptar el nombre por defecto "Laravel"
- Presiona Enter nuevamente para el provider "users"
- API Documentation: http://localhost/api/documentation
- Health Check: Hacer una petición GET a http://localhost/api/v1/sports
http://localhost/api/v1
Ver ejemplos de autenticación
POST /auth/login
Content-Type: application/json
{
"email": "admin@admin.com",
"password": "admin"
}
Respuesta:
{
"ok": true,
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
}
POST /auth/logout
Authorization: Bearer {token}
Respuesta:
{
"ok": true,
"message": "Sesión cerrada correctamente"
}
Ver ejemplos de gestión de deportes
GET /sports
Authorization: Bearer {token}
Respuesta:
{
"ok": true,
"sports": [
{
"id": 1,
"name": "Tenis",
"description": "Deporte de raqueta"
},
{
"id": 2,
"name": "Pádel",
"description": "Deporte de pala"
}
],
"page": 1,
"total_pages": 1,
"total_sports": 2
}
POST /sports
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Fútbol",
"description": "Deporte de equipo con balón"
}
Ver ejemplos de gestión de pistas
GET /courts
Authorization: Bearer {token}
POST /courts
Authorization: Bearer {token}
Content-Type: application/json
{
"sport_id": 1,
"name": "Pista Central",
"location": "Zona Norte del club"
}
Ver ejemplos de gestión de socios
GET /members
Authorization: Bearer {token}
POST /members
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Juan Pérez",
"email": "juan@email.com",
"phone": "+34 123 456 789",
"membership_date": "2024-01-01",
"status": "active"
}
Ver ejemplos de gestión de reservas
POST /reservations
Authorization: Bearer {token}
Content-Type: application/json
{
"member_id": 1,
"court_id": 1,
"date": "2024-12-25",
"hour": "14:00"
}
GET /reservations
Authorization: Bearer {token}
Ver ejemplo de búsqueda de disponibilidad
POST /courts/search?sport_name=tenis&date=25/12/2024&member_id=1
Authorization: Bearer {token}
Respuesta:
{
"ok": true,
"available_hours": [
{
"id": 1,
"name": "Pista Central",
"hours_free": [8, 9, 10, 11, 15, 16, 17],
"hours_reserved": [12, 13, 14]
}
]
}
# Acceder al contenedor PHP
docker compose exec -it club_cms_php sh
# Acceder a MySQL
docker compose exec -it club_cms_database mysql -u root -p
# Limpiar rutas
docker compose exec -it club_cms_php php artisan route:clear
# Listar rutas
docker compose exec -it club_cms_php php artisan route:list
# Refrescar base de datos con seeders
docker compose exec -it club_cms_php php artisan migrate:fresh --seed
# Detener contenedores
docker-compose down
# Detener y eliminar volúmenes
docker-compose down -v
- Swagger UI: http://localhost/api/documentation
- Especificación OpenAPI:
storage/api-docs/api-docs.json
- Colección Postman:
ClubCMS.postman_collection.json - Esquema ER:
er-diagram.pdf
El sistema incluye seeders con datos de ejemplo:
- Usuario admin:
admin@admin.com/admin - Deportes: Tenis, Pádel, Fútbol, Baloncesto
- Pistas de ejemplo para cada deporte
- Socios de prueba
- Reservas de ejemplo
- Admin: Acceso completo a todas las funcionalidades
- User: Acceso al CRUD de miembros, reservas, obtener pistas y deportes.
- Todos los endpoints requieren autenticación excepto
/auth/loginy/auth/register - Endpoints de creación/edición/eliminación requieren rol
admin - Las reservas pueden ser creadas por cualquier usuario autenticado
- Backend: Laravel 12.x con PHP 8.2
- Base de datos: MySQL 8.1
- Autenticación: Laravel Passport (OAuth2)
- Contenedores: Docker + Docker Compose
- Servidor web: Caddy
- Documentación: Swagger/OpenAPI
├── Caddyfile # Configuración Caddy
├── dockerfile # Imagen Docker de la aplicación
├── docker-compose.yml # Orquestación de servicios
└── club_cms/ # Aplicación Laravel
├── app/
│ ├── Http/Controllers/ # Controladores de la API
│ ├── Models/ # Modelos Eloquent
│ └── OpenApi/ # Anotaciones Swagger
├── database/
│ ├── migrations/ # Migraciones de BD
│ └── seeders/ # Datos de prueba
├── routes/api.php # Rutas de la API
└── storage/api-docs/ # Documentación generada
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Añadir nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
- GitHub: CleanMatyx
- Email: mtsbrr07@gmail.com