154 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Modules\Admin\App\Services;
 | 
						|
 | 
						|
use Illuminate\Support\Facades\Cache;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use Illuminate\Support\Facades\Redis;
 | 
						|
 | 
						|
class SessionManagerService
 | 
						|
{
 | 
						|
    private string $driver;
 | 
						|
 | 
						|
    public function __construct(string $driver = null)
 | 
						|
    {
 | 
						|
        $this->driver = $driver ?? config('session.driver');
 | 
						|
    }
 | 
						|
 | 
						|
    public function getSessionStats(string $driver = null): array
 | 
						|
    {
 | 
						|
        $driver = $driver ?? $this->driver;
 | 
						|
 | 
						|
        if (!$this->isSupportedDriver($driver))
 | 
						|
            return $this->response('warning', 'Driver no soportado o no configurado.', ['session_count' => 0]);
 | 
						|
 | 
						|
        try {
 | 
						|
            switch ($driver) {
 | 
						|
                case 'redis':
 | 
						|
                    return $this->getRedisStats();
 | 
						|
 | 
						|
                case 'database':
 | 
						|
                    return $this->getDatabaseStats();
 | 
						|
 | 
						|
                case 'file':
 | 
						|
                    return $this->getFileStats();
 | 
						|
 | 
						|
                default:
 | 
						|
                    return $this->response('warning', 'Driver no reconocido.', ['session_count' => 0]);
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return $this->response('danger', 'Error al obtener estadísticas: ' . $e->getMessage(), ['session_count' => 0]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function clearSessions(string $driver = null): array
 | 
						|
    {
 | 
						|
        $driver = $driver ?? $this->driver;
 | 
						|
 | 
						|
        if (!$this->isSupportedDriver($driver)) {
 | 
						|
            return $this->response('warning', 'Driver no soportado o no configurado.');
 | 
						|
        }
 | 
						|
 | 
						|
        try {
 | 
						|
            switch ($driver) {
 | 
						|
                case 'redis':
 | 
						|
                    return $this->clearRedisSessions();
 | 
						|
 | 
						|
                case 'memcached':
 | 
						|
                    Cache::getStore()->flush();
 | 
						|
                    return $this->response('success', 'Se eliminó la memoria caché de sesiones en Memcached.');
 | 
						|
 | 
						|
                case 'database':
 | 
						|
                    DB::table('sessions')->truncate();
 | 
						|
                    return $this->response('success', 'Se eliminó la memoria caché de sesiones en la base de datos.');
 | 
						|
 | 
						|
                case 'file':
 | 
						|
                    return $this->clearFileSessions();
 | 
						|
 | 
						|
                default:
 | 
						|
                    return $this->response('warning', 'Driver no reconocido.');
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return $this->response('danger', 'Error al limpiar las sesiones: ' . $e->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    private function getRedisStats()
 | 
						|
    {
 | 
						|
        $prefix = config('cache.prefix'); // Asegúrate de agregar el sufijo correcto si es necesario
 | 
						|
        $keys = Redis::connection('sessions')->keys($prefix . '*');
 | 
						|
 | 
						|
        return $this->response('success', 'Se ha recargado la información de la caché de Redis.', ['session_count' => count($keys)]);
 | 
						|
    }
 | 
						|
 | 
						|
    private function getDatabaseStats(): array
 | 
						|
    {
 | 
						|
        $sessionCount = DB::table('sessions')->count();
 | 
						|
 | 
						|
        return $this->response('success', 'Se ha recargado la información de la base de datos.', ['session_count' => $sessionCount]);
 | 
						|
    }
 | 
						|
 | 
						|
    private function getFileStats(): array
 | 
						|
    {
 | 
						|
        $cachePath = config('session.files');
 | 
						|
        $files = glob($cachePath . '/*');
 | 
						|
 | 
						|
        return $this->response('success', 'Se ha recargado la información de sesiones de archivos.', ['session_count' => count($files)]);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Limpia sesiones en Redis.
 | 
						|
     */
 | 
						|
    private function clearRedisSessions(): array
 | 
						|
    {
 | 
						|
        $prefix = config('cache.prefix', '');
 | 
						|
        $keys = Redis::connection('sessions')->keys($prefix . '*');
 | 
						|
 | 
						|
        if (!empty($keys)) {
 | 
						|
            Redis::connection('sessions')->flushdb();
 | 
						|
 | 
						|
            // Simulate cache clearing delay
 | 
						|
            sleep(1);
 | 
						|
 | 
						|
            return $this->response('success', 'Se eliminó la memoria caché de sesiones en Redis.');
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->response('info', 'No se encontraron claves para eliminar en Redis.');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Limpia sesiones en archivos.
 | 
						|
     */
 | 
						|
    private function clearFileSessions(): array
 | 
						|
    {
 | 
						|
        $cachePath = config('session.files');
 | 
						|
        $files = glob($cachePath . '/*');
 | 
						|
 | 
						|
        if (!empty($files)) {
 | 
						|
            foreach ($files as $file) {
 | 
						|
                unlink($file);
 | 
						|
            }
 | 
						|
 | 
						|
            return $this->response('success', 'Se eliminó la memoria caché de sesiones en archivos.');
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->response('info', 'No se encontraron sesiones en archivos para eliminar.');
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    private function isSupportedDriver(string $driver): bool
 | 
						|
    {
 | 
						|
        return in_array($driver, ['redis', 'memcached', 'database', 'file']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Genera una respuesta estandarizada.
 | 
						|
     */
 | 
						|
    private function response(string $status, string $message, array $data = []): array
 | 
						|
    {
 | 
						|
        return array_merge(compact('status', 'message'), $data);
 | 
						|
    }
 | 
						|
}
 |