47 lines
3.6 KiB
Markdown
47 lines
3.6 KiB
Markdown
# 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: oolslutter`, 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).
|