57 lines
5.2 KiB
Markdown
57 lines
5.2 KiB
Markdown
# Модуль m01-server-db — план разработки
|
||
|
||
> План по алгоритму d-dev (`std1\_rules\d\d-dev.md`); отметки статусов
|
||
> актуализируются при завершении каждого шага (d-dev-6). Требования —
|
||
> [module_reqs.md](module_reqs.md).
|
||
|
||
| Шаг d-dev | Состав | Статус |
|
||
|---|---|---|
|
||
| 0. Персистентная подготовка | module_reqs.md, readme.md, SKILL.md | ✅ |
|
||
| 1. Доменные объекты | `Dal\{Src,Ref}\Domain\{Сущность}.cs` (c-dm) | ✅ утверждено (2026-10-17) |
|
||
| 1.3. Утверждение домена | — | **Пользователь!** ✅ |
|
||
| 2. Список функций к реализации | статусы `DEV` в 2-db\{src,ref}\functions.md | ✅ |
|
||
| 2.3. Утверждение списка | — | **Пользователь!** ✅ (шаг 6) |
|
||
| 3. Спецификации функций | `func_specs\` (d-db-5, d-db-9) — все 38 | ✅ |
|
||
| 3.4. Утверждение спецификаций | — | **Пользователь!** ✅ (группы 1–4, 2026-10-17) |
|
||
| 4. Код функций и тесты | миграции 001–002, `2-db\{src,ref}\functions\` (38), `tests\` (38 файлов) | ✅ |
|
||
| 4.4. Утверждение реализации функций | — | **Пользователь!** ✅ (2026-10-17; прогон 122/122 PASS, docker `watchbody-pg`; функции `DONE`) |
|
||
| 5. Спецификации тестов репозиториев | `repository_tests\` (d-tst) — **11 файлов** на 13 репозиториев (тесты ProgramVersion и ExerciseReplacement — внутри файлов `ProgramRepository.md` / `ExerciseRepository.md`), 38 функций | ✅ утверждено (2026-10-18, ревью сверкой) |
|
||
| 5.3. Утверждение | — | **Пользователь!** ✅ |
|
||
| 6. Репозитории DAL + тесты | `Server.WatchBody.Core` (13 репозиториев + 7 фильтров, Kit.Helpers fluent), `Server.WatchBody.Core.Tests` (56 тестов) | ✅ код написан; сборка 0 ошибок; тесты 56/56 PASS (числа после З-35) |
|
||
| 6.4. Утверждение репозиториев | — | **Пользователь!** ✅ (2026-10-18, после ревью `agent_recommendations.md`) |
|
||
| 7. Завершение | статусы функций `DONE`; сборка и тесты зелёные | ✅ (2026-10-18: 38/38 функций `DONE`; тесты 56/56 PASS, psql-прогон 123/123 на docker `watchbody-pg` — числа после З-35) |
|
||
|
||
**Модуль завершён** (2026-10-18). Следующий по плану этапа 7 — m02-rest-api.
|
||
|
||
Примечания:
|
||
|
||
- Разработка поштучно, группы по сущностям (принятый порядок):
|
||
migration → ref → athlete/athlete_profile → exercise/replacement →
|
||
program/program_version → workout/workout_set → command_log →
|
||
daily_log → workout_metrics → breaks.
|
||
- Спецификации тестов репозиториев живут в модуле
|
||
(`1-docs\4-modules\m01-server-db\repository_tests\`) — адаптация пути
|
||
`1-docs\3-core\…` из d-tst-1 к структуре репозитория (модульных
|
||
документов).
|
||
- Errata (2026-10-18, вскрыто интеграцией m02): jsonb-параметры функций
|
||
принимают `text` с кастой в теле (Npgsql передаёт строку как `text`,
|
||
неявного cast'а text→jsonb в PG нет) — `program_version_insert.p_body`,
|
||
`workout_update.p_facts_json`, `command_log_insert.p_semantics`,
|
||
`workout_metrics_upsert` (4 параметра); `program_version_insert`
|
||
дополнен идемпотентностью по `p_id` (🛡, как `workout_insert`).
|
||
psql-тесты затронутых функций перегнаны — PASS; спецификации обновлены.
|
||
- Errata (2026-10-18, вскрыто интеграцией m04): Npgsql возвращает
|
||
колонки `date` как `DateOnly` (не `DateTime`) — `DailyLogRepository`
|
||
переведён на `AsDate()`; ключи агрегата `workout_select` — snake_case,
|
||
`ParseSets` дополнен `JsonNamingPolicy.SnakeCaseLower` (иначе поля
|
||
`WorkoutSet`, включая `in_plan`, молча не заполнялись).
|
||
- Прогон psql-тестов — PostgreSQL 17 в docker-контейнере `watchbody-pg`
|
||
(порт 5433, БД `watchbody`), ручное воспроизведение — pgAdmin (db-tst-1).
|
||
- З-35 (2026-10-18, ревью этапа 7): З-31 (`src.program.external_id`)
|
||
не был доведён до SQL/DAL-артефактов — исправлено: миграция
|
||
`003_program_external_id.sql` (идемпотентная), `program_insert.psql`
|
||
rev. 2 (`p_external_id` + DROP прежней сигнатуры: два оверлода
|
||
с DEFAULT делают 2-аргументный вызов неоднозначным), spec, домен
|
||
`Program.ExternalId`, `ProgramRepository.Insert`; тесты: psql-кейс #3
|
||
(повтор `external_id` → UNIQUE), Core-тест `Insert_2СExternalId`.
|