'success']); } else { echo json_encode(['status' => 'error', 'message' => 'Nieprawidłowe hasło']); } exit; } // 0. SPRAWDZENIE SESJI (Opcjonalne dla list, wymagane dla add) function isAuthorized() { return !empty($_SESSION['prototype_auth']); } // 0.5 SPRAWDZENIE STANU AUTORYZACJI (GET) - dla frontendowego odtworzenia sesji if ($_SERVER['REQUEST_METHOD'] === 'GET' && $action === 'check_auth') { if (isAuthorized()) { echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'error', 'message' => 'Brak sesji']); } exit; } // 1. POBIERANIE KOMENTARZY (GET) if ($_SERVER['REQUEST_METHOD'] === 'GET' && $action === 'list') { $pagePath = $_GET['page_path'] ?? ''; if (!$pagePath) { echo json_encode(['status' => 'error', 'message' => 'Brak ścieżki pliku']); exit; } try { $stmt = $pdo->prepare("SELECT * FROM prototype_comments WHERE page_path = ? ORDER BY created_at DESC"); $stmt->execute([$pagePath]); $comments = $stmt->fetchAll(); // XSS PROTECTION: Escaping danych przed wysłaniem foreach ($comments as &$c) { $c['author'] = htmlspecialchars($c['author'] ?? '', ENT_QUOTES, 'UTF-8'); $c['comment'] = htmlspecialchars($c['comment'] ?? '', ENT_QUOTES, 'UTF-8'); // Selector musi zostać oryginalny, bo JS go używa do querySelector! // $c['dom_selector'] = htmlspecialchars($c['dom_selector'] ?? '', ENT_QUOTES, 'UTF-8'); } echo json_encode(['status' => 'success', 'data' => $comments]); } catch (PDOException $e) { echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); } exit; } // 2. DODAWANIE KOMENTARZA (POST) if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'add') { // Wymagana autoryzacja if (!isAuthorized()) { echo json_encode(['status' => 'error', 'message' => 'Brak autoryzacji. Odśwież stronę i podaj hasło.']); exit; } // Odczyt danych JSON z body requestu $input = json_decode(file_get_contents('php://input'), true); $pagePath = $input['page_path'] ?? ''; $selector = $input['selector'] ?? ''; $comment = $input['comment'] ?? ''; $author = $input['author'] ?? 'Anonim'; // Możesz tu potem wpiąć sesję użytkownika if (!$pagePath || !$selector || !$comment) { echo json_encode(['status' => 'error', 'message' => 'Brakuje danych']); exit; } try { $stmt = $pdo->prepare("INSERT INTO prototype_comments (page_path, dom_selector, author, comment) VALUES (?, ?, ?, ?)"); $stmt->execute([$pagePath, $selector, $author, $comment]); echo json_encode(['status' => 'success', 'id' => $pdo->lastInsertId()]); } catch (PDOException $e) { echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); } exit; } // 3. ROZWIĄZYWANIE KOMENTARZA (POST) if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'resolve') { if (!isAuthorized()) { echo json_encode(['status' => 'error', 'message' => 'Brak autoryzacji']); exit; } $input = json_decode(file_get_contents('php://input'), true); $id = $input['id'] ?? 0; if (!$id) { echo json_encode(['status' => 'error', 'message' => 'Brak ID']); exit; } try { // Zmieniamy flagę is_resolved na 1 $stmt = $pdo->prepare("UPDATE prototype_comments SET is_resolved = 1 WHERE id = ?"); $stmt->execute([$id]); echo json_encode(['status' => 'success']); } catch (PDOException $e) { echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); } exit; } // 4. USUWANIE KOMENTARZA (POST) if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'delete') { if (!isAuthorized()) { echo json_encode(['status' => 'error', 'message' => 'Brak autoryzacji']); exit; } $input = json_decode(file_get_contents('php://input'), true); $id = $input['id'] ?? 0; if (!$id) { echo json_encode(['status' => 'error', 'message' => 'Brak ID']); exit; } try { $stmt = $pdo->prepare("DELETE FROM prototype_comments WHERE id = ?"); $stmt->execute([$id]); echo json_encode(['status' => 'success']); } catch (PDOException $e) { echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); } exit; } ?>