Files
backPRO/.paul/phases/02-admin-panel-upgrade/02-03-PLAN.md
2026-04-24 18:53:11 +02:00

189 lines
7.7 KiB
Markdown

---
phase: 02-admin-panel-upgrade
plan: 03
type: execute
wave: 3
depends_on: ["02-02"]
files_modified:
- src/Services/WordPressService.php
- src/Controllers/SiteController.php
- templates/sites/comments.php
- config/routes.php
autonomous: true
delegation: off
---
<objective>
## Goal
Dodac "twarde" zamykanie komentarzy dla istniejacych tresci WordPress:
1. Zamkniecie komentarzy i pingow/trackbackow we wszystkich istniejacych wpisach strony.
2. Opcjonalne usuniecie oczekujacych komentarzy spamowych po zamknieciu komentarzy.
3. Pokazanie wyniku operacji w panelu komentarzy BackPRO.
## Purpose
Samo wylaczenie komentowania nowych wpisow nie chroni starych artykulow, ktore maja `comment_status = open`. Boty moga dalej dodawac komentarze pod istniejacymi wpisami. Operator BackPRO potrzebuje jednej akcji, ktora zdalnie domyka cala powierzchnie komentarzy dla wybranego serwisu.
## Output
- Nowa metoda `closeExistingComments()` w `WordPressService`.
- Nowe akcje remote service w `backpro-remote-service.php` generowanym przez `WordPressService`.
- Nowa akcja POST w `SiteController` i trasa w `config/routes.php`.
- Sekcja w `templates/sites/comments.php` z przyciskiem "Zamknij komentarze w istniejacych wpisach" i opcja usuniecia oczekujacych komentarzy.
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Prior Work
@.paul/phases/02-admin-panel-upgrade/02-02-SUMMARY.md
## Source Files
@src/Services/WordPressService.php
@src/Controllers/SiteController.php
@templates/sites/comments.php
@config/routes.php
</context>
<acceptance_criteria>
## AC-1: Masowe zamkniecie istniejacych wpisow
```gherkin
Given uzytkownik jest zalogowany w BackPRO i strona ma aktywny plik serwisowy BackPRO
When klika "Zamknij komentarze w istniejacych wpisach"
Then WordPress ustawia comment_status='closed' i ping_status='closed' dla wszystkich opublikowanych wpisow
And BackPRO pokazuje liczbe zaktualizowanych wpisow
```
## AC-2: Opcjonalne czyszczenie oczekujacych komentarzy
```gherkin
Given uzytkownik widzi panel komentarzy danej strony
When zaznacza opcje usuniecia oczekujacych komentarzy i uruchamia operacje
Then WordPress usuwa komentarze ze statusem hold
And BackPRO pokazuje liczbe usunietych komentarzy
```
## AC-3: Bezpieczna obsluga bledow i odswiezenie statusu
```gherkin
Given remote service jest nieaktualny albo niedostepny
When uzytkownik uruchamia masowe zamkniecie komentarzy
Then BackPRO probuje zaktualizowac plik serwisowy i ponawia akcje
And przy niepowodzeniu pokazuje czytelny komunikat bledu bez psucia listy komentarzy
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Dodac operacje close_existing_comments do WordPressService i remote service</name>
<files>src/Services/WordPressService.php</files>
<action>
Dodac publiczna metode:
- closeExistingComments(array $site, bool $deletePendingComments = false): array
- Wywoluje callRemoteService($site, 'close_existing_comments', ['delete_pending_comments' => '1'/'0']).
- Jezeli akcja nie dziala przez stary plik serwisowy, wywoluje ensureRemoteService(), odswieza site z bazy i ponawia akcje.
- Zwraca success, posts_updated, pending_comments_deleted, message.
- Przy bledzie zwraca success=false i czytelny message.
Zaktualizowac BACKPRO_REMOTE_SERVICE_VERSION do kolejnej wersji, np. 1.6.0.
W getBackproRemoteServiceContent() dodac action `close_existing_comments`:
- Ustawic default_comment_status='closed' i default_ping_status='closed', aby nowe tresci tez byly domyslnie zamkniete.
- Wykonac bezposredni update przez global `$wpdb`:
- UPDATE {$wpdb->posts} SET comment_status='closed', ping_status='closed' WHERE post_type IN ('post','page') AND post_status NOT IN ('trash','auto-draft')
- Zliczyc liczbe zaktualizowanych rekordow z wyniku query.
- Jesli `delete_pending_comments=1`, usunac komentarze ze statusem `hold` przez wp_delete_comment($commentId, true).
- Zwracac JSON z posts_updated, pending_comments_deleted i message.
Nie modyfikowac istniejacych metod listowania/usuwania pojedynczych komentarzy poza ewentualnym wspolnym helperem formatowania wyniku.
</action>
<verify>php -l src/Services/WordPressService.php</verify>
<done>AC-1, AC-2 i AC-3 maja warstwe zdalnej operacji WordPress.</done>
</task>
<task type="auto">
<name>Task 2: Dodac akcje kontrolera i trase masowego zamkniecia</name>
<files>src/Controllers/SiteController.php, config/routes.php</files>
<action>
Dodac do SiteController metode:
- closeExistingComments(string $id): void
- Auth::requireLogin().
- Pobrac Site::find(), obsluzyc brak strony.
- Odczytac checkbox/field `delete_pending_comments` jako bool.
- Wywolac WordPressService::closeExistingComments($site, $deletePendingComments).
- Flash success z liczba posts_updated i pending_comments_deleted.
- Flash danger z message przy bledzie.
- Redirect do `/sites/{id}/comments`.
Dodac trase:
- POST `/sites/{id}/comments/close-existing` -> SiteController@closeExistingComments
Zachowac cienki kontroler: nie wpisywac SQL ani logiki WordPress do kontrolera.
</action>
<verify>php -l src/Controllers/SiteController.php oraz php -l config/routes.php</verify>
<done>AC-1, AC-2 i AC-3 sa dostepne z panelu przez POST route.</done>
</task>
<task type="auto">
<name>Task 3: Dodac UI hard-close w panelu komentarzy</name>
<files>templates/sites/comments.php</files>
<action>
W `templates/sites/comments.php` dodac karte/sekcje pod ustawieniem "Komentowanie nowych wpisow":
- Tytul: "Istniejace wpisy".
- Krotkie wyjasnienie: operacja zamyka komentarze i pingi/trackbacki w juz opublikowanych tresciach.
- Formularz POST do `/sites/{id}/comments/close-existing`.
- Checkbox `delete_pending_comments` opisany jako "Usun oczekujace komentarze przy tej operacji".
- Przycisk w stylu ostrzegawczym, np. `btn-outline-danger`, z data-confirm zawierajacym ostrzezenie, ze operacja dotyczy wszystkich wpisow tej strony.
- Po flashu sukcesu/bledu istniejacy layout ma normalnie pokazac komunikat.
Nie ukrywac listy komentarzy ani istniejacych filtrow statusu.
</action>
<verify>php -l templates/sites/comments.php</verify>
<done>AC-1 i AC-2 maja widoczny, potwierdzany interfejs uzytkownika.</done>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- src/Services/PublisherService.php
- src/Models/Article.php
- src/Models/Topic.php
- migrations/* (brak zmian schematu bazy)
- templates/articles/*
- cron/*
## SCOPE LIMITS
- Nie dodawac globalnej operacji dla wszystkich stron naraz; zakres to pojedyncza strona.
- Nie dodawac moderacji approve/spam/unspam w tym planie.
- Nie usuwac zatwierdzonych komentarzy, chyba ze uzytkownik usunie je osobno istniejaca funkcja.
- Nie dodawac nowych zaleznosci Composer.
- Nie modyfikowac bazy lokalnej BackPRO.
</boundaries>
<verification>
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/comments.php
- [ ] /sites/{id}/comments pokazuje sekcje "Istniejace wpisy"
- [ ] POST /sites/{id}/comments/close-existing wywoluje remote service i pokazuje wynik
- [ ] Remote service version wzrosla, aby wymusic aktualizacje pliku na serwerze
</verification>
<success_criteria>
- Operator moze jednym kliknieciem zamknac komentarze i pingi w istniejacych wpisach wybranej strony.
- Operator moze przy tej operacji usunac komentarze oczekujace na moderacje.
- Wynik operacji pokazuje liczby zaktualizowanych wpisow i usunietych komentarzy.
- Brak regresji w istniejacym widoku listy komentarzy i usuwaniu pojedynczego komentarza.
</success_criteria>
<output>
After completion, create `.paul/phases/02-admin-panel-upgrade/02-03-SUMMARY.md`
</output>