Phase 2 complete (4/4 plans): - Plan 02-01: Fix dead ZPL page size condition in AllegroShipmentService - Plan 02-02: Add time-based cursor to AllegroStatusSyncService - Plan 02-03: Fix ShopproOrdersSyncService using wrong state repository - Plan 02-04: Extract CronHandlerFactory as single cron composition point Plan 02-04 specifics: - New CronHandlerFactory builds complete cron object graph - Application::maybeRunCronOnWeb() reduced from 80+ to ~20 lines - bin/cron.php reduced from 123 to 26 lines - Fixed 2 bugs: AllegroOAuthClient→AllegroTokenManager, AllegroOrderSyncStateRepository→ShopproOrderSyncStateRepository Co-Authored-By: Claude <noreply@anthropic.com>
126 lines
4.9 KiB
Markdown
126 lines
4.9 KiB
Markdown
---
|
|
phase: 02-bug-fixes
|
|
plan: 04
|
|
subsystem: cron
|
|
tags: [cron, factory, refactor, dependency-injection]
|
|
|
|
requires:
|
|
- phase: 02-bug-fixes
|
|
provides: Application.php z AllegroTokenManager (plan 02-03), ShopproPaymentStatusSyncService (plan 02-01)
|
|
|
|
provides:
|
|
- CronHandlerFactory — jedyne miejsce budujące graf obiektów crona
|
|
- Application::maybeRunCronOnWeb() skrócona z 80+ do ~20 linii logiki
|
|
- bin/cron.php skrócone ze 123 do 26 linii
|
|
- Naprawione dwa błędy w bin/cron.php (AllegroOAuthClient→AllegroTokenManager, AllegroOrderSyncStateRepository→ShopproOrderSyncStateRepository)
|
|
|
|
affects: [cron, bin/cron, Application, integracje]
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns: [Factory pattern dla kompozycji obiektów, Single source of truth dla okablowania crona]
|
|
|
|
key-files:
|
|
created: [src/Modules/Cron/CronHandlerFactory.php]
|
|
modified: [src/Core/Application.php, bin/cron.php]
|
|
|
|
key-decisions:
|
|
- "Factory przyjmuje tylko PDO i integrationSecret — bez DI container (odrębny temat)"
|
|
- "ShopproIntegrationsRepository tworzony raz w fabryce i współdzielony między 3 serwisami"
|
|
|
|
patterns-established:
|
|
- "CronHandlerFactory::build(CronRepository, Logger): CronRunner — standardowy kontrakt fabryki"
|
|
|
|
duration: ~20min
|
|
started: 2026-03-13T00:00:00Z
|
|
completed: 2026-03-13T00:00:00Z
|
|
---
|
|
|
|
# Phase 2 Plan 04: CronHandlerFactory Summary
|
|
|
|
**Wydzielono CronHandlerFactory jako jedyne miejsce budujące graf obiektów crona; naprawiono 2 błędy zależności w bin/cron.php (AllegroOAuthClient→AllegroTokenManager, AllegroOrderSyncStateRepository→ShopproOrderSyncStateRepository).**
|
|
|
|
## Performance
|
|
|
|
| Metric | Value |
|
|
|--------|-------|
|
|
| Duration | ~20 min |
|
|
| Started | 2026-03-13 |
|
|
| Completed | 2026-03-13 |
|
|
| Tasks | 3 completed |
|
|
| Files modified | 3 (1 nowy, 2 zmodyfikowane) |
|
|
|
|
## Acceptance Criteria Results
|
|
|
|
| Criterion | Status | Notes |
|
|
|-----------|--------|-------|
|
|
| AC-1: Jeden punkt definicji handlerów crona | Pass | CronHandlerFactory jedynym miejscem `new AllegroIntegrationRepository` / `new ShopproIntegrationsRepository` w kontekście crona |
|
|
| AC-2: Web cron działa identycznie jak przed zmianą | Pass | `maybeRunCronOnWeb()` wywołuje fabrykę z tymi samymi handlerami |
|
|
| AC-3: bin/cron.php używa poprawnych zależności | Pass | `AllegroTokenManager` zamiast `AllegroOAuthClient`, `ShopproOrderSyncStateRepository` zamiast `AllegroOrderSyncStateRepository` |
|
|
|
|
## Accomplishments
|
|
|
|
- Nowy `CronHandlerFactory` (97 linii) — kompletny graf obiektów crona w jednym miejscu
|
|
- `Application.php`: usunięto 20+ importów cron; `maybeRunCronOnWeb()` skrócona z 80+ do ~20 linii (3 linie fabryki zamiast ~80 linii ręcznej konstrukcji)
|
|
- `bin/cron.php`: skrócone ze 123 do 26 linii; naprawiono 2 istniejące błędy w zależnościach
|
|
|
|
## Files Created/Modified
|
|
|
|
| File | Change | Purpose |
|
|
|------|--------|---------|
|
|
| `src/Modules/Cron/CronHandlerFactory.php` | Created | Jedyne miejsce budujące graf obiektów crona |
|
|
| `src/Core/Application.php` | Modified | Zastąpiono 80+ linii ręcznej konstrukcji wywołaniem fabryki; usunięto 20+ zbędnych importów |
|
|
| `bin/cron.php` | Modified | Zastąpiono 100+ linii wywołaniem fabryki; naprawiono 2 błędy zależności |
|
|
|
|
## Decisions Made
|
|
|
|
| Decision | Rationale | Impact |
|
|
|----------|-----------|--------|
|
|
| Factory przyjmuje `PDO` + `integrationSecret`, nie `Application` | Unikanie circular dependency i nadmiernego coupling | Fabryka przenośna, testowalność wyższa |
|
|
| `ShopproIntegrationsRepository` tworzony raz i współdzielony | Application.php tworzył go 3x niepotrzebnie | Spójność z intencją kodu, mniejsze zużycie zasobów |
|
|
| Nie wprowadzamy DI container | Odrębny temat (CONCERNS.md [MEDIUM]) | Brak scope creep |
|
|
|
|
## Deviations from Plan
|
|
|
|
### Summary
|
|
|
|
| Type | Count | Impact |
|
|
|------|-------|--------|
|
|
| Auto-fixed | 0 | — |
|
|
| Scope additions | 0 | — |
|
|
| Deferred | 0 | — |
|
|
|
|
**Total impact:** Brak odchyleń — plan wykonany dokładnie jak napisano.
|
|
|
|
## Skills
|
|
|
|
| Skill | Status | Notes |
|
|
|-------|--------|-------|
|
|
| sonar-scanner | ✓ | ANALYSIS SUCCESSFUL — 0 nowych issues w zmienionych plikach |
|
|
| /code-review | ○ | `gh` CLI niedostępne w środowisku; brak PR (praca na main) |
|
|
|
|
## Issues Encountered
|
|
|
|
| Issue | Resolution |
|
|
|-------|------------|
|
|
| `gh` CLI niedostępne — code-review niemożliwy | Pominięto; sonar-scanner jako główna weryfikacja jakości |
|
|
|
|
## SonarQube — post plan 02-04 (skan 2026-03-13)
|
|
|
|
Brak nowych issues w `CronHandlerFactory.php` (nowy plik). Pre-existing issues w `Application.php` (S1142, S1448, S4833, S2003) — niezmienione przez nasze modyfikacje.
|
|
|
|
## Next Phase Readiness
|
|
|
|
**Ready:**
|
|
- Graf obiektów crona w jednym miejscu — gotowe do dalszej pracy z handlerami
|
|
- bin/cron.php i Application.php zsynchronizowane — brak ryzyka rozjechania zależności
|
|
|
|
**Concerns:**
|
|
- `Application` ma nadal 22 metody (S1448 pre-existing) — kandydat do podziału w przyszłości
|
|
|
|
**Blockers:** Brak
|
|
|
|
---
|
|
*Phase: 02-bug-fixes, Plan: 04*
|
|
*Completed: 2026-03-13*
|