=== Checking existing working endpoint pattern === middleware/auth.php exists: NO config/helper.php exists: NO === dashboard/stats.php (WORKING) === prepare("SELECT COUNT(*) as total, SUM(status = 'sent' OR status = 'delivered') as sent, SUM(status = 'pending') as pending, SUM(status = 'failed') as failed FROM messages WHERE user_id = ?"); $stmt->execute([$user['id']]); $stats = $stmt->fetch(); // Weekly chart data $weekly = []; for ($i = 6; $i >= 0; $i--) { $date = date('Y-m-d', strtotime("-$i days")); $dayName = date('D', strtotime("-$i days")); $stmt = $db->prepare("SELECT SUM(status = 'sent' OR status = 'delivered') as sent, SUM(status = 'failed') as failed, SUM(status = 'pending') as pending FROM messages WHERE user_id = ? AND DATE(created_at) = ?"); $stmt->execute([$user['id'], $date]); $row = $stmt->fetch(); $weekly[] = [ 'day' => $dayName, 'sent' => (int)($row['sent'] ?? 0), 'failed' => (int)($row['failed'] ?? 0), 'pending' => (int)($row['pending'] ?? 0), ]; } // Top devices $stmt = $db->prepare("SELECT d.id, d.name, d.status, d.last_active, COUNT(m.id) as sms_today FROM devices d LEFT JOIN messages m ON d.id = m.device_id AND DATE(m.created_at) = CURDATE() WHERE d.user_id = ? GROUP BY d.id ORDER BY sms_today DESC LIMIT 5"); $stmt->execute([$user['id']]); // Recent messages $stmt2 = $db->prepare("SELECT message_id, phone_number, message, status, created_at FROM messages WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt2->execute([$user['id']]); success([ 'total_sms' => (int)($stats['total'] ?? 0), 'sent' => (int)($stats['sent'] ?? 0), 'pending' => (int)($stats['pending'] ?? 0), 'failed' => (int)($stats['failed'] ?? 0), 'weekly_chart' => $weekly, 'top_devices' => $stmt->fetchAll(), 'recent_messages' => $stmt2->fetchAll(), ]); === END === === Current devices/add.php === prepare("SELECT id FROM devices WHERE user_id = ? AND name = ?"); $check->execute([$user["id"], $name]); if ($check->fetch()) { error("Device with this name already exists", 400); } $token = !empty($inputToken) ? $inputToken : "DEV-" . strtoupper(bin2hex(random_bytes(10))); $stmt = $db->prepare("INSERT INTO devices (user_id, name, token, phone_number, status, created_at) VALUES (?, ?, ?, ?, 'offline', NOW())"); $stmt->execute([$user["id"], $name, $token, $phone]); $deviceId = $db->lastInsertId(); logActivity($user["id"], "device_added", "Added device: $name"); success([ "device" => [ "id" => (int)$deviceId, "device_name" => $name, "device_token" => $token, "phone_number" => $phone, "status" => "offline", ] ]); === END === === Current devices/list.php === prepare("SELECT id, name AS device_name, token AS device_token, COALESCE(device_model, model) AS device_model, phone_number, status, battery_level, signal_strength, is_charging, total_sms_sent, total_sms_failed, last_active, created_at, android_version, sim_slot FROM devices WHERE user_id = ? ORDER BY created_at DESC"); $stmt->execute([$user["id"]]); $devices = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($devices as &$d) { $d["battery_level"] = (int)($d["battery_level"] ?? 0); $d["signal_strength"] = (int)($d["signal_strength"] ?? 0); $d["is_charging"] = (bool)($d["is_charging"] ?? false); $d["total_sms_sent"] = (int)($d["total_sms_sent"] ?? 0); $d["total_sms_failed"] = (int)($d["total_sms_failed"] ?? 0); } unset($d); success(["devices" => $devices]); === END === === DONE — check the patterns above, then I'll write the fix === DELETE this file now!