Primer commit del sistema separado falta mejorar mucho
This commit is contained in:
159
shared/utils/helpers.php
Executable file
159
shared/utils/helpers.php
Executable 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;
|
||||
}
|
||||
Reference in New Issue
Block a user