'Not authenticated']); exit; } $query = $_GET['q'] ?? ''; $current_user_id = $_SESSION['user_id']; $current_user_role = $_SESSION['role'] ?? null; if (strlen($query) < 2) { echo json_encode(['results' => []]); exit; } try { // Build query to get all visible bookmarks for the user $sql = " SELECT b.id, b.title, b.url, b.icon, b.is_favorite, c.name as category_name, t.name as tab_name FROM bookmarks b JOIN categories c ON b.category_id = c.id JOIN tabs t ON c.tab_id = t.id WHERE ( b.title LIKE :query OR b.url LIKE :query OR c.name LIKE :query ) "; $params = [':query' => '%' . $query . '%']; // Add visibility restrictions based on user role if ($current_user_role === 'admin') { // Admin sees all bookmarks except those explicitly hidden $sql .= " AND NOT EXISTS ( SELECT 1 FROM user_tab_visibility utv WHERE utv.tab_id = t.id AND utv.user_id = :user_id )"; } else { // Regular users see public tabs, their own tabs, or tabs they have access to $sql .= " AND ( t.user_id IS NULL OR t.user_id = :user_id OR EXISTS ( SELECT 1 FROM tab_viewer_access tva WHERE tva.tab_id = t.id AND tva.user_id = :user_id ) )"; $sql .= " AND NOT EXISTS ( SELECT 1 FROM user_tab_visibility utv WHERE utv.tab_id = t.id AND utv.user_id = :user_id )"; } $params[':user_id'] = $current_user_id; $sql .= " ORDER BY b.is_favorite DESC, c.name ASC, b.title ASC LIMIT 20"; $stmt = $pdo->prepare($sql); $stmt->execute($params); $results = $stmt->fetchAll(); // Format results $formatted_results = []; foreach ($results as $bookmark) { // Build icon source URL $icon_src = 'include/images/default-icon.png'; if (!empty($bookmark['icon'])) { if (file_exists($bookmark['icon']) && strpos($bookmark['icon'], 'data/images/custom/') === 0) { $icon_src = $bookmark['icon']; } elseif (filter_var($bookmark['icon'], FILTER_VALIDATE_URL)) { $icon_src = $bookmark['icon']; } elseif (!empty($settings['favicon_extractor_url'])) { $base_url = rtrim($settings['favicon_extractor_url'], '/'); $domain = $bookmark['icon']; $icon_src = "{$base_url}/favicon/{$domain}?larger=true"; } } $formatted_results[] = [ 'id' => $bookmark['id'], 'title' => $bookmark['title'], 'url' => $bookmark['url'], 'icon' => $icon_src, 'category' => $bookmark['category_name'], 'tab' => $bookmark['tab_name'], 'is_favorite' => (bool)$bookmark['is_favorite'] ]; } echo json_encode(['results' => $formatted_results]); } catch (Exception $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } ?>