--- phase: 02-admin-panel-upgrade plan: 02 type: execute wave: 2 depends_on: ["02-01"] files_modified: - src/Services/WordPressService.php - src/Controllers/SiteController.php - templates/sites/dashboard.php - templates/sites/comments.php - config/routes.php autonomous: true delegation: off --- ## Goal Dodac do zarzadzania pojedyncza strona WordPress zdalna kontrole komentarzy: 1. Wlaczenie i wylaczenie mozliwosci komentowania na danym serwisie. 2. Pobranie listy komentarzy z danego serwisu. 3. Usuwanie komentarzy z poziomu BackPRO. ## Purpose BackPRO ma centralnie zarzadzac siecia stron zapleczowych. Komentarze sa ryzykiem moderacyjnym i spamowym, wiec operator powinien moc szybko wylaczyc komentowanie oraz usuwac niechciane komentarze bez logowania sie do kazdego panelu WordPress osobno. ## Output - Metody w `WordPressService` do statusu komentarzy, zmiany ustawien, listowania i usuwania komentarzy. - Akcje w `SiteController` dla panelu komentarzy i operacji POST. - Widok `/sites/{id}/comments` z tabela komentarzy, filtrami i akcja usuniecia. - Karta/status komentarzy na dashboardzie strony. - Nowe trasy w `config/routes.php`. ## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md ## Prior Work @.paul/phases/02-admin-panel-upgrade/02-01-PLAN.md ## Source Files @src/Services/WordPressService.php @src/Controllers/SiteController.php @templates/sites/dashboard.php @templates/sites/index.php @config/routes.php @src/Core/Controller.php ## AC-1: Status i przelaczanie komentowania ```gherkin Given uzytkownik jest zalogowany w BackPRO i ma skonfigurowany serwis WordPress z plikiem zdalnym BackPRO When przechodzi do dashboardu strony Then widzi aktualny status komentowania dla nowych wpisow And moze wlaczyc lub wylaczyc komentowanie z poziomu BackPRO And po akcji widzi komunikat sukcesu albo konkretny blad polaczenia ``` ## AC-2: Lista komentarzy z serwisu ```gherkin Given uzytkownik jest zalogowany i strona ma poprawne dane WordPress API When przechodzi do /sites/{id}/comments Then widzi liste komentarzy z WordPressa z autorem, trescia, data, statusem i linkiem do wpisu And moze filtrowac komentarze po statusie all/hold/approve/spam/trash And widok poprawnie obsluguje pusta liste i blad pobrania danych ``` ## AC-3: Usuwanie komentarzy ```gherkin Given uzytkownik widzi komentarz na liscie komentarzy strony When klika usun i potwierdza operacje Then BackPRO usuwa komentarz przez WordPress API And uzytkownik wraca do listy komentarzy z komunikatem wyniku And bledy 401/403/404 sa obsluzone czytelnym komunikatem ``` Task 1: Rozszerzyc WordPressService o operacje komentarzy src/Services/WordPressService.php Dodac publiczne metody: - getCommentSettings(array $site): array - Uzyc callRemoteService($site, 'get_comment_settings'). - Jezeli endpoint jest nieaktualny, wywolac ensureRemoteService(), odswiezyc site z bazy i ponowic probe. - Zwracac success, default_comment_status, comments_enabled, message. - setCommentsEnabled(array $site, bool $enabled): array - Uzyc callRemoteService($site, 'set_comment_settings', ['comments_enabled' => '1'/'0']). - Endpoint po stronie WordPress ma ustawiac option default_comment_status na open/closed. - Nie zmieniac masowo istniejacych postow w tym planie, zeby nie zaskoczyc uzytkownika utrata historii dyskusji. - getComments(array $site, string $status = 'all', int $page = 1, int $perPage = 20): array - Uzyc WP REST `wp/v2/comments` z auth z buildAuthOption(). - Parametry: status, page, per_page, orderby=date, order=desc, context=edit. - Zwracac success, comments, page, total_pages, total, message. - Dla 401/403 zwrocic komunikat o braku uprawnien aplikacyjnego hasla/API uzytkownika. - deleteComment(array $site, int $commentId): array - Uzyc WP REST DELETE `wp/v2/comments/{id}` z auth i query force=true. - 404 traktowac jako czytelny blad "komentarz nie istnieje" albo sukces idempotentny tylko jesli API jasno zwraca deleted=true. Zaktualizowac BACKPRO_REMOTE_SERVICE_VERSION do kolejnej wersji i tresc getBackproRemoteServiceContent(): - ping ma zwracac nowa wersje. - action=get_comment_settings zwraca default_comment_status i comments_enabled. - action=set_comment_settings waliduje comments_enabled i zapisuje update_option('default_comment_status', 'open'/'closed'). Zachowac istniejace fallbacki requestWp() i nie ruszac logiki publikacji, mediow, permalinkow ani indeksowania. php -l src/Services/WordPressService.php AC-1, AC-2 i AC-3 maja warstwe komunikacji z WordPressem. Task 2: Dodac akcje kontrolera i trasy komentarzy src/Controllers/SiteController.php, config/routes.php Dodac do SiteController: - comments(string $id): void - Auth::requireLogin(). - Pobrac Site::find(), obsluzyc brak strony. - Odczytac status z query `status` z whitelista: all, hold, approve, spam, trash. - Odczytac page jako int >= 1. - Wywolac WordPressService::getCommentSettings() oraz getComments(). - Renderowac `sites/comments` z site, commentSettings, commentsResult, selectedStatus, page. - updateCommentsEnabled(string $id): void - POST z polem enabled=1/0. - Wywolac setCommentsEnabled(). - Flash success/danger i redirect do `/sites/{id}/comments`. - deleteComment(string $id, string $commentId): void - Walidowac commentId > 0. - Wywolac deleteComment(). - Flash success/danger i redirect z zachowaniem statusu, jesli podany. Dodac trasy: - GET `/sites/{id}/comments` -> SiteController@comments - POST `/sites/{id}/comments/settings` -> SiteController@updateCommentsEnabled - POST `/sites/{id}/comments/{commentId}/delete` -> SiteController@deleteComment Kontroler ma zostac cienki: mapuje request, wywoluje WordPressService, ustawia flash i przekazuje dane do widoku. Nie wkladac logiki REST API do kontrolera. php -l src/Controllers/SiteController.php oraz php -l config/routes.php AC-1, AC-2 i AC-3 dostepne przez routing BackPRO. Task 3: Zbudowac UI komentarzy dla pojedynczej strony templates/sites/dashboard.php, templates/sites/comments.php Utworzyc `templates/sites/comments.php`: - Naglowek: nazwa strony, link powrotu do dashboardu i listy stron. - Karta "Komentowanie" z badge ON/OFF wedlug commentSettings. - Dwa formularze POST do `/sites/{id}/comments/settings`: wlacz i wylacz komentarze. - Krotka informacja, ze przelacznik dotyczy domyslnego komentowania nowych wpisow. - Filtry statusu jako linki: Wszystkie, Oczekujace, Zatwierdzone, Spam, Kosz. - Tabela komentarzy: autor, email/URL jesli dostepne, fragment tresci bez HTML, data, status, link do wpisu, akcja usun. - Usuwanie jako POST z `data-confirm`. - Paginacja na podstawie total_pages i aktualnej strony. - Wszystkie dane z WordPressa escape przez htmlspecialchars. Zaktualizowac `templates/sites/dashboard.php`: - Dodac karte lub przycisk "Komentarze" w sekcji zarzadzania strona. - Pokazac status komentowania, jesli SiteController::dashboard przekaze commentSettings. - Link do `/sites/{id}/comments`. Zaktualizowac SiteController::dashboard w ramach Task 2 lub tego taska: - pobrac commentSettings przez WordPressService i przekazac do widoku dashboardu. Nie tworzyc osobnego globalnego ekranu komentarzy dla wszystkich stron w tym planie. php -l templates/sites/dashboard.php oraz php -l templates/sites/comments.php AC-1, AC-2 i AC-3 maja kompletny interfejs w panelu strony. ## DO NOT CHANGE - src/Services/PublisherService.php - src/Models/Article.php - src/Models/Topic.php - migrations/* (brak zmian schematu bazy w tym planie) - templates/articles/* (komentarze dotycza zarzadzania strona, nie artykulow BackPRO) ## SCOPE LIMITS - Przelacznik komentowania dotyczy domyslnego komentowania nowych wpisow (`default_comment_status`), bez masowego zamykania komentarzy w istniejacych postach. - Nie dodawac moderacji approve/spam/unspam w tym planie; tylko lista i usuwanie. - Nie cache'owac komentarzy lokalnie w bazie BackPRO. - Nie dodawac nowych zaleznosci Composer. - Nie zmieniac sposobu przechowywania danych API/FTP stron. Before declaring plan complete: - [ ] php -l src/Services/WordPressService.php - [ ] php -l src/Controllers/SiteController.php - [ ] php -l config/routes.php - [ ] php -l templates/sites/dashboard.php - [ ] php -l templates/sites/comments.php - [ ] /sites/{id}/dashboard pokazuje wejscie do komentarzy i status ustawienia - [ ] /sites/{id}/comments pokazuje tabele albo czytelny blad pobrania - [ ] POST ustawienia komentowania zmienia default_comment_status na WordPressie - [ ] POST usuniecia komentarza usuwa komentarz albo pokazuje czytelny blad - [ ] Aktualizacja pliku serwisowego BackPRO podnosi wersje remote service - Operator moze wlaczyc i wylaczyc komentowanie dla wybranej strony. - Operator widzi komentarze pobrane z danego serwisu WordPress. - Operator moze usuwac komentarze z BackPRO. - Bledy polaczenia i uprawnien sa czytelne w UI. - Brak regresji w publikacji, permalinkach, StatLink i istniejacym dashboardzie strony. After completion, create `.paul/phases/02-admin-panel-upgrade/02-02-SUMMARY.md`