--- phase: 13-basket-logging-ttl-token plan: 01 subsystem: frontend tags: [basket, checkout, logging, token, session, TTL] requires: - phase: 12-summaryview-redirect-fix provides: summaryView() redirect guard removed provides: - Order error logging to logs/logs-order-YYYY-MM-DD.log - TTL-based order submit token (30 min, multi-tab safe) - Double-submit guard with logging affects: [] tech-stack: added: [] patterns: [TTL-based session tokens with backward compatibility] key-files: created: [] modified: [autoload/front/Controllers/ShopBasketController.php] key-decisions: - "Token format: array ['token' => ..., 'created_at' => ...] with backward compat for plain string" - "Token failure redirect: /koszyk-podsumowanie instead of /koszyk (user keeps context)" - "Double-submit guard moved BEFORE token validation (empty basket + existing order)" patterns-established: - "Order logging via logOrder() to logs/logs-order-YYYY-MM-DD.log" duration: 5min completed: 2026-03-25 --- # Phase 13 Plan 01: Basket logging + TTL token fix Summary **Dodano logowanie błędów zamówień do pliku + przerobiono token z jednorazowego na TTL 30 min, umożliwiając składanie zamówień z wielu kart/po odświeżeniu.** ## Performance | Metric | Value | |--------|-------| | Duration | ~5 min | | Completed | 2026-03-25 | | Tasks | 2 completed | | Files modified | 1 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Logowanie błędów w basketSave() | Pass | 4 punkty logowania via logOrder() | | AC-2: Token TTL 30 min — wiele kart działa | Pass | createOrderSubmitToken() reuses valid token | | AC-3: Token wygasa po 30 min | Pass | isValidOrderSubmitToken() checks TTL, redirect → /koszyk-podsumowanie | | AC-4: Double-submit guard dla pustego koszyka | Pass | Nowy guard przed sprawdzeniem tokena | ## Accomplishments - Dodano metodę `logOrder()` zapisującą do `logs/logs-order-YYYY-MM-DD.log` + 4 punkty logowania w `basketSave()` - Token zamówienia przerobiony z jednorazowego na TTL 30 min — wiele kart, odświeżenie, "wstecz" nie unieważniają tokena - Backward compatibility ze starymi stringowymi tokenami w sesji - Double-submit guard przeniesiony PRZED sprawdzenie tokena (pusty koszyk + istniejące zamówienie → redirect) - Redirect przy błędzie tokena zmieniony z `/koszyk` na `/koszyk-podsumowanie` ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `autoload/front/Controllers/ShopBasketController.php` | Modified | Stała TTL, logOrder(), TTL token, logowanie, double-submit guard | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | Token jako array z created_at | Umożliwia TTL check bez dodatkowej sesji | Backward compat z plain string | | Redirect na /koszyk-podsumowanie | Użytkownik nie traci kontekstu, dostaje nowy token | Lepsza UX | | Double-submit guard przed token check | Pusty koszyk = pewny double-submit, nie trzeba sprawdzać tokena | Szybsze wykrycie | ## Deviations from Plan None — plan executed exactly as written ## Issues Encountered None ## Next Phase Readiness **Ready:** - Poprawka gotowa do wdrożenia w update package - Fazy 12 + 13 razem stanowią kompletny fix checkout flow **Concerns:** - None **Blockers:** - None --- *Phase: 13-basket-logging-ttl-token, Plan: 01* *Completed: 2026-03-25*