Primer commit del sistema separado falta mejorar mucho

This commit is contained in:
nickpons666
2025-12-30 01:18:46 -06:00
commit 1679c73e52
2384 changed files with 472342 additions and 0 deletions

159
shared/utils/helpers.php Executable file
View File

@@ -0,0 +1,159 @@
<?php
/**
* Archivo de configuración compartido
* Carga variables de entorno y proporciona funciones helper
*/
// Cargar variables de entorno si aún no están cargadas
if (!isset($_ENV['DB_HOST'])) {
if (file_exists(__DIR__ . '/../../.env')) {
$lines = file(__DIR__ . '/../../.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos(trim($line), '#') === 0) continue;
if (strpos($line, '=') === false) continue;
list($key, $value) = explode('=', $line, 2);
$_ENV[trim($key)] = trim($value);
}
}
}
// Timezone
date_default_timezone_set($_ENV['TIME_ZONE_ENVIOS'] ?? 'America/Mexico_City');
/**
* Obtener variable de entorno
*/
function env($key, $default = null) {
return $_ENV[$key] ?? getenv($key) ?: $default;
}
/**
* Registrar log en archivo
*/
function logToFile($filename, $message, $level = 'INFO') {
$logDir = __DIR__ . '/../../logs/';
$logFile = $logDir . $filename;
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[{$timestamp}] [{$level}] {$message}\n";
file_put_contents($logFile, $logMessage, FILE_APPEND);
}
/**
* Sanitizar HTML para prevenir XSS
*/
function sanitizeHTML($html) {
return htmlspecialchars($html, ENT_QUOTES, 'UTF-8');
}
/**
* Validar email
*/
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
/**
* Generar token aleatorio
*/
function generateRandomToken($length = 32) {
return bin2hex(random_bytes($length / 2));
}
/**
* Formatear bytes a tamaño legible
*/
function formatBytes($bytes, $precision = 2) {
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
$bytes /= 1024;
}
return round($bytes, $precision) . ' ' . $units[$i];
}
/**
* Respuesta JSON
*/
function jsonResponse($data, $statusCode = 200) {
http_response_code($statusCode);
header('Content-Type: application/json');
echo json_encode($data);
exit;
}
/**
* Verifica si el usuario autenticado tiene un permiso específico.
* @param string $permissionName El nombre del permiso a verificar (ej. 'crear_plantillas', 'gestionar_usuarios').
* @param string $platform El módulo al que aplica el permiso (ej. 'discord', 'telegram', 'global').
* @return bool True si el usuario tiene el permiso, false en caso contrario.
*/
function hasPermission($permissionName, $platform = 'global') {
$userData = JWTAuth::getUserData(); // Obtener datos del usuario logueado
// Si no hay datos de usuario o no está autenticado, no tiene permisos
if (!$userData || !isset($userData->userId)) {
return false;
}
// Los administradores tienen todos los permisos
if (isset($userData->rol) && $userData->rol === 'Admin') {
return true;
}
// Si el usuario no es Admin, verificar permisos específicos
// Los permisos se cargan en el JWT al iniciar sesión
if (isset($userData->permissions) && is_array($userData->permissions)) {
foreach ($userData->permissions as $perm) {
// Un permiso 'manage_templates' global debería dar acceso a 'manage_templates' en cualquier plataforma
// Un permiso 'manage_templates_discord' solo en Discord
if ($perm === $permissionName || $perm === $permissionName . '_' . $platform) {
return true;
}
}
}
return false;
}
/**
* Dividir texto en múltiples mensajes según límite de caracteres
*/
function splitMessage($text, $maxLength = 2000) {
if (strlen($text) <= $maxLength) {
return [$text];
}
$messages = [];
$lines = explode("\n", $text);
$currentMessage = '';
foreach ($lines as $line) {
if (strlen($currentMessage) + strlen($line) + 1 > $maxLength) {
if ($currentMessage) {
$messages[] = trim($currentMessage);
$currentMessage = '';
}
// Si una línea sola es muy larga, dividirla
if (strlen($line) > $maxLength) {
$chunks = str_split($line, $maxLength);
foreach ($chunks as $chunk) {
$messages[] = $chunk;
}
} else {
$currentMessage = $line . "\n";
}
} else {
$currentMessage .= $line . "\n";
}
}
if ($currentMessage) {
$messages[] = trim($currentMessage);
}
return $messages;
}