VEU.WathBody/1-docs/4-modules/m08-admin-web/readme.md

47 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# m08-admin-web — план работ (d-dev)
> Модуль: admin REST API `/api/admin/*` в `Server.WatchBody.Web`
> (бэкенд консоли владельца, Ф-9; UI — Flutter Web, отдельный этап).
> Алгоритм: `std1\_rules\d\d-dev.md`. Требования:
> [module_reqs.md](module_reqs.md).
> Зависимости: m01 (репозитории, DONE), m02 (Web/маршруты/middleware,
> DONE), m03 (ProgramStore, DONE), m04 (workout_metrics, DONE).
| Шаг | Что делаем | Статус |
|---|---|---|
| 0 | Модульные документы: module_reqs.md / readme.md / SKILL.md | ✅ 2026-10-18 |
| 1 | Список единиц (классы/методы/конфиг/тесты) | ✅ 2026-10-18 |
| 1.3 | **Пользователь!** утверждение списка | ⬜ |
| 2 | Спецификации: api_specs (auth, athletes, workouts+CSV, programs, metrics, plan, UI) | ✅ 2026-10-19 |
| 2.4 | **Пользователь!** утверждение спецификаций | ⬜ |
| 3 | Реализация + тесты | ✅ 2026-10-19 (Web 105/105, из них m08 — 7; Core 56/56; flutter analyze 0 ошибок; build web → wwwrootdmin; HTTP-смок хостинга/логина пройден) |
| 3.4 | **Пользователь!** утверждение реализации (закрытие модуля) | ✅ 2026-10-19 |
| 4 | Завершение: план, примечания | ✅ 2026-10-19 — **Модуль завершён** (2026-10-19). Итерация 3 завершена. Следующий по плану этапа 7 — m09-phone-core (итерация 4, Android). |
Статусы: ⬜ не начат · 🔄 в работе · ✅ готов.
## Примечания по ходу работ
1. **Kit.Helpers.Routes**: `NeedHttpPost_All` нельзя чейнить на несколько
роутов одного блока `AddController` (RouteFluent — дубль ключа
`httpMethod`) — каждый admin-эндпоинт в отдельном блоке.
2. **ApiKeyMiddleware сужен до `/api/v1/*`** (errata m02): раньше
перехватывал вообще все пути — статика консоли `/admin` и прочее
получали 401. `/api/admin` — Bearer-контур, `/health` — открыт;
поведение `/api/v1/*` не изменилось (тесты зелёные).
3. **workout_select без «всех атлетов»** — admin-список собирается
обходом атлетов (v1: атлетов немного; кандидат — функция БД в v2).
4. **Request.Body в Kestrel не seekable** — чтение тела один раз,
без `Position = 0` (иначе 500).
5. **workout_insert не пишет `ended_at`** (errata m02/m06): тесты
дозакрывают через Update.
6. **Flutter**: SDK 3.47.7 (`C: ools lutter`, PATH в каждом вызове);
без внешних pub-пакетов (только SDK) — `dart:html` для HTTP/Blob
(deprecation-info осознанно, web-only v1); сборка 41 МБ (canvaskit)
— `wwwrootdmin` в .gitignore (артефакт, собирается
`build.ps1`); analyze — 0 ошибок/варнингов, 4 info (dart:html ×2,
use_build_context ×2 — ложные срабатывания при guard `mounted`).
7. **Смоки**: HTTP (curl) — статика 200, /health 200, /api/v1 без
ключа 401, login 401/200, athletes/plan с Bearer — данные;
браузерный прогон UI — за владельцем (чек-лист spec 06 §4).