# Спецификация 04: программы (AdminProgramsController) Источники: Ф-9.3, Ф-10.3, m03 (ProgramStore), 🛡4 module_reqs. ## 1. Эндпоинты (Bearer) | Метод | Путь | Ответ | |---|---|---| | GET | `/api/admin/programs?athleteId` | `{"items":[{versionId, version, status, author, basedOnVersion, rationale, createdAt}]}` (без body) | | GET | `/api/admin/programs/{versionId}?athleteId` | версия с `body` (json как есть) | | POST | `/api/admin/programs/{versionId}/activate?athleteId` | `200 {"version":N,"status":"active"}` | | POST | `/api/admin/programs/{versionId}/apply?athleteId` | `200 {"versionId":"…","version":N,"status":"active"}` | ## 2. Семантика - **Активация**: только `draft` (иначе 400); `ProgramStore.Activate` — прежняя active → archived (гарантия БД). Повторная активация archived — 400 (m03). - **Применение предложения правил** (Ф-9.3): только rules-draft; `ProgramStore.CreateDraft(athleteId, body=rules-draft.body, author=admin, rationale=оригинал + " (применено из консоли)")` → активация новой версии. 🛡4: оригинальный rules-draft не меняется (остаётся draft — владелец может его архивировать активацией другой версии; дедуп-замок m05 снимается тем, что новая active версия уже существует). Не-rules версия на apply → 400. - 🛡3: других записей нет (редактирование body — вне v1). ## 3. Ошибки 401; 404 — версия/атлет не найдены; 400 — статус не позволяет.