Files
bookmarkly2/api/search.php
T

110 lines
3.5 KiB
PHP

<?php
require_once '../include/init.php';
require_once '../include/auth.php';
// Set content type to JSON
header('Content-Type: application/json');
// Check if user is logged in
if (!isset($_SESSION['user_id'])) {
echo json_encode(['error' => '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()]);
}
?>