🇪🇸 Español | 🇬🇧 English below
EPSDC API es una API REST desarrollada en PHP puro como evolución del sistema web EPSDC Noel Rodríguez. Expone la lógica de negocio del sistema de distribución de gas a través de endpoints HTTP bien definidos, permitiendo desacoplar el backend del frontend y sentar las bases para integraciones con aplicaciones móviles u otros clientes.
La API comparte los modelos de datos del sistema original (gestión de solicitudes, inventario, entregas, usuarios) pero añade una capa de seguridad robusta con autenticación JWT, cifrado RSA de payloads, CSRF, Rate Limiting y soporte completo a CORS.
La API sigue un patrón de enrutamiento centralizado desde un único index.php (Front Controller), que despacha cada petición a una clase *Src según el módulo en la URL. Cada *Src hereda de una clase base abstracta Src que centraliza la autenticación JWT, la verificación de permisos por módulo y el registro de bitácora.
EPSDC-API/
│
├── index.php # Front Controller — parsea la URL y despacha al módulo correcto
│
├── 📁 src/ # Controladores de la API (uno por módulo/recurso)
│ ├── loginSrc.php # Autenticación: login y creación de cuenta
│ ├── solicitudSrc.php # Solicitudes de gas (~22KB, endpoint más complejo)
│ ├── entregaSrc.php # Gestión de entregas a comunidades (~27KB)
│ ├── recepcionSrc.php # Recepciones de gas en almacén
│ ├── usuarioSrc.php # Gestión de usuarios del sistema
│ ├── estadisticasSrc.php # Métricas y estadísticas operativas
│ ├── asistenciaSrc.php # Control de asistencia de choferes (~12KB)
│ ├── periodoSrc.php # Gestión de períodos de distribución
│ ├── recuperarSrc.php # Recuperación de contraseña por email
│ └── ... # +9 módulos adicionales (almacén, comunidades, etc.)
│
├── 📁 class/ # Modelos de datos y lógica de negocio
│ ├── Src.php # Clase base abstracta: JWT, permisos y bitácora
│ ├── solicitud.php # Modelo más robusto (~53KB de lógica SQL/negocio)
│ ├── entrega.php # Entregas, asignaciones y PDF
│ ├── usuario.php # Gestión completa de usuarios (~15KB)
│ ├── correo.php # Servicio de correos con PHPMailer (~12KB)
│ ├── recepcion.php # Recepciones y stock de almacén
│ ├── conexion/ # Gestión de conexiones PDO (multi-base de datos)
│ └── ... # +20 modelos adicionales
│
├── 📁 helpers/ # Utilidades transversales
│ ├── JWTHelper.php # Generación y validación de tokens JWT (HS256)
│ ├── csrf.php # Protección CSRF para endpoints mutantes
│ ├── RateLimiter.php # Limitador de tasa de peticiones (Symfony Cache)
│ ├── LoginAttemptLimiter.php # Protección anti-fuerza bruta en login
│ ├── WsHelper.php # Helper para enviar notificaciones por WebSocket
│ └── config.php # Constantes globales (timezone, rutas, claves JWT)
│
└── .htaccess # Rewrite rules: enruta todo al Front Controller
La API implementa múltiples capas de seguridad de forma independiente y complementaria:
- Access Token (corta duración): requerido en el header
Authorization: Bearer <token>en cada petición autenticada. - Refresh Token (larga duración): permite renovar el access token sin re-autenticarse.
- CSRF Token (via JWT separado): protege los endpoints de mutación (POST, PUT, PATCH, DELETE).
Los payloads de las peticiones mutantes (POST, PUT, PATCH, DELETE) deben enviarse cifrados con la clave pública RSA del servidor. El servidor descifra el cuerpo con openssl_private_decrypt antes de procesarlo. Esto protege los datos sensibles incluso en redes no seguras.
// Cuerpo de una petición cifrada
{
"encrypted": "<base64 del payload cifrado con RSA-OAEP>"
}- CSRF tokens en todas las operaciones que modifican datos
- Rate Limiting por IP usando Symfony Cache
- LoginAttemptLimiter: bloqueo temporal tras múltiples intentos fallidos de login
- CORS configurable con detección dinámica de origen
- Permisos granulares por módulo, verificados en la clase base
Srcen cada petición
Todos los endpoints (excepto login y recuperar) requieren un Access Token JWT válido en el header Authorization.
| Módulo | Ruta base | Métodos | Descripción |
|---|---|---|---|
| Login | /login |
POST | Autenticación y creación de cuenta |
| Recuperar | /recuperar |
POST | Recuperación de contraseña por email |
| Solicitud | /solicitud |
GET, POST | Gestión de solicitudes de gas |
| Entrega | /entrega |
GET, POST, PUT, PATCH | Control de entregas a comunidades |
| Recepción | /recepcion |
GET, POST | Recepciones de gas en almacén |
| Almacén | /almacen |
GET | Stock e inventario |
| Usuario | /usuario |
GET, POST, PUT | Gestión de usuarios |
| Vocero | /vocero |
GET, POST, PUT | Voceros comunales |
| Estadísticas | /estadisticas |
GET | Métricas y dashboards |
| Asistencia | /asistencia |
GET, POST | Control de asistencia de choferes |
| Período | /periodo |
GET, POST, PUT | Períodos de distribución |
| Comunidad | /comunidad |
GET | Comunidades registradas |
| Empleado | /empleado |
GET | Empleados del sistema |
| Cilindro | /cilindro |
GET | Tipos de cilindros |
| Estado | /estado |
GET | Estados de las solicitudes |
| Municipio | /municipio |
GET | Municipios |
| Parroquia | /parroquia |
GET | Parroquias |
| Asignación | /asignacion |
GET, POST, PUT | Asignaciones de equipos |
| Capa | Tecnología |
|---|---|
| Backend | PHP 8.x |
| Base de Datos | MySQL + PDO (multi-base: epsdc_principal + epsdc_control) |
| Autenticación | JWT (firebase/php-jwt 6.10) con HS256 |
| Cifrado de Payloads | OpenSSL RSA-OAEP (clave pública/privada) |
| Correo Electrónico | PHPMailer 6.9 |
| Generación de PDF | FPDF 1.86 |
| Caché / Rate Limiting | Symfony Cache 7.3 |
| WebSocket (cliente) | textalk/websocket 1.6 |
| Variables de Entorno | vlucas/phpdotenv 5.6 |
| Autoloading | Composer PSR-4 |
| Enrutamiento | Front Controller manual + Apache .htaccess |
El sistema opera con dos bases de datos MySQL independientes:
| Base de Datos | Variable | Propósito |
|---|---|---|
epsdc_principal |
DB_MAIN_* |
Datos operativos: solicitudes, entregas, inventario, usuarios |
epsdc_control |
DB_CONTROL_* |
Datos de control: caché, rate limiting, intentos de login |
- PHP 8.0 o superior con extensiones:
openssl,pdo_mysql,json - MySQL 5.7+ o MariaDB
- Composer
- Servidor web con soporte de
mod_rewrite(Apache) o configuración equivalente (Nginx)
# 1. Clonar el repositorio
git clone https://github.com/Gusthere/EPSDC-API.git
cd EPSDC-API
# 2. Instalar dependencias PHP
composer install
# 3. Configurar variables de entorno
cp .env.example .env
# Editar .env con tus credenciales# Base de datos principal
DB_MAIN_NAME="epsdc_principal"
DB_MAIN_HOST="localhost"
DB_MAIN_USER="root"
DB_MAIN_PASSWORD=""
# Base de datos de control (rate limiting, caché)
DB_CONTROL_NAME="epsdc_control"
DB_CONTROL_HOST="localhost"
DB_CONTROL_USER="root"
DB_CONTROL_PASSWORD=""
# Correo electrónico (PHPMailer)
MAIL_HOST="smtp.gmail.com"
MAIL_USERNAME="tu@gmail.com"
MAIL_PASSWORD="app_password"
MAIL_SMTP_SECURE="STARTTLS"
# Zona horaria
TIMEZONE="America/Caracas"
# Ruta base de la API (ej: "/" si está en la raíz)
BASE_PATH="/"
# Claves JWT (usar strings largos y aleatorios en producción)
JWT_KEY="clave_csrf_secreta"
JWT_ACCESS="clave_access_token_secreta"
JWT_REFRESH="clave_refresh_token_secreta"# 4. Importar las bases de datos
# Importar los archivos SQL desde /database/ a tu servidor MySQL
# 5. Generar par de claves RSA para cifrado de payloads
mkdir key
openssl genrsa -out key/private.pem 2048
openssl rsa -in key/private.pem -pubout -out key/public.pem
# 6. Acceder a la API
# http://localhost/EPSDC-API/loginPOST /login
Content-Type: application/json
{
"encrypted": "<payload RSA-OAEP cifrado con clave pública>"
}Respuesta exitosa:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}GET /solicitud
Authorization: Bearer <access_token>Esta API es una extensión del sistema web original:
EPSDC Noel Rodríguez — Sistema web MVC en PHP para la gestión integral de distribución de gas.
Gustavo Heredia
- GitHub: @Gusthere
Wilker Alburjas
- GitHub: @Wilker2504
Jhon Arrieche
- GitHub: @Kaygrem
EPSDC API is a REST API built in pure PHP as an evolution of the EPSDC Noel Rodríguez web system. It exposes the gas distribution business logic through well-defined HTTP endpoints, decoupling the backend from the frontend and laying the groundwork for mobile app integrations and other clients.
The API shares the data models from the original system (request management, inventory, deliveries, users) while adding a robust security layer with JWT authentication, RSA payload encryption, CSRF protection, Rate Limiting, and full CORS support.
The API follows a centralized routing pattern from a single index.php (Front Controller), which dispatches each request to a *Src class based on the URL module. Each *Src inherits from an abstract base class Src that centralizes JWT authentication, per-module permission checks, and audit log registration.
EPSDC-API/
│
├── index.php # Front Controller — parses URL and dispatches to the correct module
│
├── 📁 src/ # API controllers (one per module/resource)
│ ├── loginSrc.php # Authentication: login and account creation
│ ├── solicitudSrc.php # Gas supply requests (~22KB, most complex endpoint)
│ ├── entregaSrc.php # Delivery management (~27KB)
│ ├── recepcionSrc.php # Gas warehouse receptions
│ ├── usuarioSrc.php # System user management
│ ├── estadisticasSrc.php # Operational metrics and statistics
│ ├── asistenciaSrc.php # Driver attendance tracking (~12KB)
│ └── ... # +10 additional modules
│
├── 📁 class/ # Data models and business logic
│ ├── Src.php # Abstract base class: JWT auth, permissions, audit log
│ ├── solicitud.php # Heaviest model (~53KB of SQL/business logic)
│ ├── entrega.php # Deliveries, assignments, and PDF generation
│ ├── usuario.php # Full user management (~15KB)
│ ├── correo.php # Email service via PHPMailer (~12KB)
│ ├── conexion/ # Multi-database PDO connection management
│ └── ... # +20 additional models
│
├── 📁 helpers/ # Cross-cutting utilities
│ ├── JWTHelper.php # JWT token generation and validation (HS256)
│ ├── csrf.php # CSRF protection for mutating endpoints
│ ├── RateLimiter.php # Rate limiting per IP (Symfony Cache)
│ ├── LoginAttemptLimiter.php # Anti-brute-force login protection
│ ├── WsHelper.php # WebSocket notification broadcast helper
│ └── config.php # Global constants (timezone, paths, JWT keys)
│
└── .htaccess # Rewrite rules: routes everything to the Front Controller
The API implements multiple security layers independently and complementarily:
- Access Token (short-lived): required in the
Authorization: Bearer <token>header for every authenticated request. - Refresh Token (long-lived): allows renewing the access token without re-authenticating.
- CSRF Token (separate JWT): protects mutating endpoints (POST, PUT, PATCH, DELETE).
Payloads for mutating requests (POST, PUT, PATCH, DELETE) must be encrypted with the server's RSA public key. The server decrypts the body using openssl_private_decrypt before processing. This protects sensitive data even on insecure networks.
// Body of an encrypted request
{
"encrypted": "<base64 of RSA-OAEP encrypted payload>"
}- CSRF tokens on all data-modifying operations
- Rate Limiting per IP using Symfony Cache
- LoginAttemptLimiter: temporary lockout after multiple failed login attempts
- CORS with dynamic origin detection
- Granular per-module permissions verified in the base
Srcclass on every request
All endpoints (except login and recuperar) require a valid JWT Access Token in the Authorization header.
| Module | Base Route | Methods | Description |
|---|---|---|---|
| Login | /login |
POST | Authentication and account creation |
| Recover | /recuperar |
POST | Password recovery via email |
| Request | /solicitud |
GET, POST | Gas supply request management |
| Delivery | /entrega |
GET, POST, PUT, PATCH | Delivery management |
| Reception | /recepcion |
GET, POST | Gas warehouse receptions |
| Warehouse | /almacen |
GET | Stock and inventory |
| User | /usuario |
GET, POST, PUT | User management |
| Representative | /vocero |
GET, POST, PUT | Community representatives |
| Statistics | /estadisticas |
GET | Metrics and dashboards |
| Attendance | /asistencia |
GET, POST | Driver attendance tracking |
| Period | /periodo |
GET, POST, PUT | Distribution periods |
| Community | /comunidad |
GET | Registered communities |
| Employee | /empleado |
GET | System employees |
| Cylinder | /cilindro |
GET | Cylinder types |
| Status | /estado |
GET | Request statuses |
| Municipality | /municipio |
GET | Municipalities |
| Parish | /parroquia |
GET | Parishes |
| Assignment | /asignacion |
GET, POST, PUT | Teams assignments |
| Layer | Technology |
|---|---|
| Backend | PHP 8.x |
| Database | MySQL + PDO (multi-DB: epsdc_principal + epsdc_control) |
| Authentication | JWT (firebase/php-jwt 6.10) with HS256 |
| Payload Encryption | OpenSSL RSA-OAEP (public/private key pair) |
| Email Service | PHPMailer 6.9 |
| PDF Generation | FPDF 1.86 |
| Cache / Rate Limiting | Symfony Cache 7.3 |
| WebSocket (client) | textalk/websocket 1.6 |
| Environment Variables | vlucas/phpdotenv 5.6 |
| Autoloading | Composer PSR-4 |
| Routing | Manual Front Controller + Apache .htaccess |
The system operates with two independent MySQL databases:
| Database | Variable | Purpose |
|---|---|---|
epsdc_principal |
DB_MAIN_* |
Operational data: requests, deliveries, inventory, users |
epsdc_control |
DB_CONTROL_* |
Control data: cache, rate limiting, login attempts |
- PHP 8.0 or higher with extensions:
openssl,pdo_mysql,json - MySQL 5.7+ or MariaDB
- Composer
- Web server with
mod_rewritesupport (Apache) or equivalent (Nginx)
# 1. Clone the repository
git clone https://github.com/Gusthere/EPSDC-API.git
cd EPSDC-API
# 2. Install PHP dependencies
composer install
# 3. Configure environment variables
cp .env.example .env
# Edit .env with your credentials
# 4. Import the databases
# Import the SQL files from /database/ into your MySQL server
# 5. Generate RSA key pair for payload encryption
mkdir key
openssl genrsa -out key/private.pem 2048
openssl rsa -in key/private.pem -pubout -out key/public.pem
# 6. Access the API
# http://localhost/EPSDC-API/loginPOST /login
Content-Type: application/json
{
"encrypted": "<RSA-OAEP encrypted payload with public key>"
}Successful response:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}GET /solicitud
Authorization: Bearer <access_token>This API is an extension of the original web system:
EPSDC Noel Rodríguez — MVC web system in PHP for comprehensive gas distribution management.
Gustavo Heredia
- GitHub: @Gusthere
Wilker Alburjas
- GitHub: @Wilker2504
Jhon Arrieche
- GitHub: @Kaygrem
Proyecto de Ingeniería de Software para la obtención del título de Ingeniero en Sistemas en Venezuela 🇻🇪
Software Engineering project for the obtention of the title of Systems Engineer in Venezuela 🇻🇪