--- phase: 06-sonarqube-quality plan: 02 subsystem: api tags: [sonarqube, refactoring, validation, php] requires: - phase: 06-sonarqube-quality provides: Faza aktywna — brak twardych zależności między planami 06-xx provides: - AllegroIntegrationController z metodami save/saveImportSettings/oauthCallback o ≤3 return each - ShopproIntegrationsController z metodami save/saveStatusMappings/syncStatuses o ≤3 return each - Wzorzec validateXxxInput(): ?string oraz validateXxxAccess(): ?Response dla walidacji w kontrolerach affects: [06-05-god-classes] tech-stack: added: [] patterns: [validation-helper-method, access-guard-method] key-files: created: [] modified: - src/Modules/Settings/AllegroIntegrationController.php - src/Modules/Settings/ShopproIntegrationsController.php key-decisions: - "Wzorzec ?string dla walidacji danych wejściowych (validateSaveInput, validateImportSettingsInput, validateOAuthCallbackParams)" - "Wzorzec ?Response dla strażników dostępu CSRF+notFound (validateSaveAccess, validateCsrfAndIntegrationAccess)" - "Restrukturyzacja try/catch w ShopproIntegrationsController::save() — brak return wewnątrz bloku, $redirectTo mutuje na sukces" patterns-established: - "validateXxxInput(): ?string — zwraca komunikat błędu lub null; wywołujący robi Flash::set + redirect w jednym if" - "validateXxxAccess(): ?Response — łączy CSRF + not-found w jeden guard zwracający gotowy Response lub null" duration: 20min started: 2026-03-13T00:00:00Z completed: 2026-03-13T00:00:00Z --- # Phase 6 Plan 02: S1142 Return Statements Reduction — Summary **Wydzielono walidacje do private helperów w AllegroIntegrationController i ShopproIntegrationsController, redukując return statements do ≤3 we wszystkich 6 metodach (łącznie z 9+6+5+4+4+4 → 3 każda).** ## Performance | Metric | Value | |--------|-------| | Duration | ~20 min | | Started | 2026-03-13 | | Completed | 2026-03-13 | | Tasks | 2/2 completed | | Files modified | 2 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: AllegroIntegrationController::save() ≤3 return | Pass | 6→3 (wydzielono validateSaveInput) | | AC-2: AllegroIntegrationController::saveImportSettings() ≤3 return | Pass | 5→3 (wydzielono validateImportSettingsInput) | | AC-3: AllegroIntegrationController::oauthCallback() ≤3 return | Pass | 4→3 (wydzielono validateOAuthCallbackParams) | | AC-4: ShopproIntegrationsController::save() ≤3 return | Pass | 9→3 (validateSaveAccess + validateSaveInput) | | AC-5: Brak regresji funkcjonalnej | Pass | Czysto strukturalna refaktoryzacja — logika, komunikaty, redirect paths bez zmian | ## Accomplishments - 6 metod zredukowanych do ≤3 return statements (AllegroIntegrationController: 3 metody; ShopproIntegrationsController: 3 metody) - Ustalono dwa wzorce helperów wielokrotnego użytku: `?string` dla walidacji danych, `?Response` dla strażników dostępu - `validateCsrfAndIntegrationAccess()` w ShopproIntegrationsController współdzielony przez saveStatusMappings() i syncStatuses() - Try/catch w ShopproIntegrationsController::save() restrukturyzowany do jednego return na końcu metody ## Task Commits | Task | Commit | Type | Description | |------|--------|------|-------------| | Task 1+2: AllegroIntegrationController + ShopproIntegrationsController | `028c46c` | feat | Redukcja return statements we wszystkich 6 metodach | ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `src/Modules/Settings/AllegroIntegrationController.php` | Modified | +3 private metody walidacji; save/saveImportSettings/oauthCallback zrefaktoryzowane | | `src/Modules/Settings/ShopproIntegrationsController.php` | Modified | +3 private metody walidacji/dostępu; save/saveStatusMappings/syncStatuses zrefaktoryzowane | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | Wzorzec `?Response` dla CSRF+not-found guard zamiast `?string` | CSRF i not-found mają różne redirect URL — zwrot gotowego Response czystszy niż tuple | validateSaveAccess() i validateCsrfAndIntegrationAccess() spójne z istniejącym validateCsrf() w Allegro | | Brak internal return w try/catch ShopproIntegrationsController::save() | Pozwala na pojedynczy return na końcu metody | $redirectTo mutuje na sukces, pozostaje $redirectTo przy błędzie | | Jeden commit dla obu plików | Obie zmiany to jeden spójny wzorzec refaktoryzacji | Historia spójna | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Scope additions | 0 | — | | Auto-fixed | 0 | — | | Deferred | 1 | Skill gap: sonar-scanner | **Total impact:** Plan wykonany zgodnie ze specyfikacją. ### Deferred Items - **sonar-scanner pominięty** — narzędzie nie jest zainstalowane w PATH (konsekwentnie pomijane od Fazy 03). Violations S1142 powinny spaść o ~12-15 pozycji po uruchomieniu skanera. ## Skill Audit | Oczekiwany | Wywołany | Uwagi | |------------|---------|-------| | sonar-scanner | ○ | Pominięto — brak instalacji w PATH | ## Issues Encountered | Issue | Resolution | |-------|------------| | ShopproIntegrationsController::save() miała 9 returns (plan mówił o 5) | Wydzielono dwa helpery zamiast jednego; wzorzec ?Response dla CSRF+not-found guard | ## Next Phase Readiness **Ready:** - Wzorzec validateXxxInput()/validateXxxAccess() ustalony — do użycia w kolejnych planach - Codebase w stabilnym stanie; obie klasy syntaktycznie poprawne **Concerns:** - sonar-scanner nadal nieinstalowany — liczba aktualnych S1142 violations nieznana - Plan 06-05 (god classes) zależy od 06-04 — kolejność: 06-06 → 06-04 → 06-05 **Blockers:** None --- *Phase: 06-sonarqube-quality, Plan: 02* *Completed: 2026-03-13*