go-learn/docs/plans/plan-phase-8.md
sab.code.lab 1c85091186 chore: восстановление репозитория из снапшота v0.3.1
Прежняя git-история утрачена при переносе проекта на машину владельца
(снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной
истории.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 09:34:02 +02:00

3.2 KiB
Raw Permalink Blame History

План этапа 8 — личный кабинет и синхронизация прогресса

Дата: 2026-08-06. Статус: завершён (461/461 + smoke.sh OK). Предшественник: этапы 17 завершены, main = a99aeb9 (431/431). Активация — команда владельца; модель учётки и до-триаж раздела V — ADR-0004.

Ключевые решения (не пере-решать)

  1. Модель — email+пароль (ADR-0004); БЕЗ верификации почты и восстановления пароля (нет SMTP на shared-хостинге; предупреждение в UI при регистрации).
  2. PHP 8 без фреймворка, PDO SQLite (WAL, busy_timeout, БД вне web root), prepared statements везде, лимит тела 256 КБ, rate limit по IP, SameSite=Lax + заголовок X-GoLearn-Client как CSRF-мера. Синтаксис PHP ≥ 8.0 — совместимость с хостингами.
  3. Прогресс на сервере — opaque ProgressV2 (ProgressV1 + updatedAt), last-write-wins по updatedAt; localStorage — SoT для гостей; миграция V1→V2 в storage.ts по контракту конверта.
  4. Превью статическое: кабинет деградирует тихо при недоступном API (status 'unavailable', пометка в UI, без алертов).
  5. Локальная проверка бэкенда: PHP 8.2 CLI (распакованные deb-пакеты в /tmp/debs, обёртка /tmp/php-run) + php -S + curl smoke.sh. В среде нет системного PHP — гейты npm PHP не запускают.
  6. Параллельные ветки: stage-8-server (server/) и stage-8-web (apps/web); общих файлов нет. Мерж: server → web.

Объём

  • server/: api/{register,login,logout,me,progress,health}.php, lib/{db,http,auth,ratelimit}.php, config.example.php, .htaccess (заголовки, запрет листинга), tests/smoke.sh.
  • apps/web: storage.ts (ProgressV2 + миграция), sync-client.ts (mergeDecision чистая + fetch), pages/account.astro, nav + strings.
  • docs/deploy.md — деплой-чеклист V.2 (артефакты, порядок, smoke, откат, пути на хостинге, бэкап/restore SQLite).
  • PROJECT_STATE: этап 8 разморожен → в работе → завершён.

Приёмка этапа

  • npm run gates зелёные (0 warnings), astro build PASS.
  • server/tests/smoke.sh зелёный локально (PHP 8.2): полный прогон register/login/put/get/401/403/429/health.
  • Ручная приёмка владельцем на хостинге — по docs/deploy.md.

Риски

  • PHP на хостинге владельца может отличаться (версия, pdo_sqlite) — чек-лист deploy.md начинается с проверки php -v и модулей.
  • Сессии PHP на shared-хостинге: gc и путь сессий — зафиксировать session_save_path в config при проблемах (заметка в deploy.md).