first commit

This commit is contained in:
Chris
2026-03-23 20:23:58 +08:00
commit 74d612aca1
3193 changed files with 692056 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
# API Contract Master
## 目標
固定 `v1` 對外契約,避免前後端與 SDK 在開發中漂移。
> 參數必填/可選與路由實際狀態,請優先看:
> [PYTHON_API_PARAMETER_GUIDE.md](/Users/chirs/Documents/workspace/marketing/mkt.ose.tw/docs/backend/PYTHON_API_PARAMETER_GUIDE.md)
## 這輪契約調整2026-03-22
- `experiment_key` 改為系統生成(`EX+timestamp`),不接受使用者輸入。
- `variant_key` 改為系統生成(`VA+timestamp`),不接受使用者輸入。
- Variant 不再暴露 `status``is_control` 作為使用者可編輯欄位。
- `variant_changes` 移除 `enabled` 欄位(每筆 change 預設啟用)。
- 建立 Experiment API 成功時,需同步建立一個原始版本 Variant系統管理
- Runtime 實驗匹配需基於 URL 規則與裝置限制。
## 分區
- Admin API
- Editor API
- Runtime API
## Admin APIv1
### Sites
- `GET /api/admin/sites`
- `GET /api/admin/sites/{site_id}`
### Experiments
- `GET /api/admin/experiments`
- `GET /api/admin/experiments/{experiment_id}`
- `POST /api/admin/experiments`
- `PATCH /api/admin/experiments/{experiment_id}`
- `GET /api/admin/experiments/{experiment_id}/activity`
`POST/PATCH /api/admin/experiments` 使用者輸入重點:
- `name`
- `module_type`
- `status`
- `targeting_config.url_rules`
- `targeting_config.device_targets`
使用者不輸入:
- `experiment_key`(系統生成)
### Variants
- `GET /api/admin/variants/{variant_id}`
- `GET /api/admin/variants?experiment_id=...`
- `POST /api/admin/variants`
- `PATCH /api/admin/variants/{variant_id}`
`POST/PATCH /api/admin/variants` 使用者輸入重點:
- `name`
- `traffic_weight`
使用者不輸入:
- `variant_key`(系統生成)
- `status`
- `is_control`
### Releases
- `GET /api/admin/releases?experiment_id=...`
- `GET /api/admin/releases/{release_id}`
- `POST /api/admin/releases/build`
- `POST /api/admin/releases/{release_id}/publish`
- `POST /api/admin/releases/{release_id}/rollback`
- `POST /api/admin/releases/{release_id}/archive`
### Goals / SDK Config
- `GET /api/admin/goals`
- `GET /api/admin/goals/{goal_id}`
- `GET /api/admin/sdk-configs`
- `GET /api/admin/sdk-configs/{sdk_config_id}`
## Editor APIv1
- `POST /api/editor/sessions`
- `GET /api/editor/sessions/{session_id}`
- `PATCH /api/editor/sessions/{session_id}`
- `DELETE /api/editor/sessions/{session_id}`
- `GET /api/editor/variants/{variant_id}/changes`
- `PUT /api/editor/variants/{variant_id}/changes`
- `POST /api/editor/previews/build`
`PUT /api/editor/variants/{variant_id}/changes`
- change 欄位不含 `enabled`
- change 是否生效由是否存在於 change set 決定
## Runtime APIv1
- `POST /api/runtime/bootstrap`
- `POST /api/runtime/assign`
- `POST /api/runtime/payload`
- `POST /api/runtime/events/impression`
- `POST /api/runtime/events/conversion`
## 契約原則
- 所有 API 回傳統一 DTO不回傳 Directus raw item
- editor 專用 DTO 與 runtime 專用 DTO 分離
- breaking change 需升 API 版本
- 對外 `C/U/D` 一律經 FastAPI禁止 frontend 直接對 Directus 做新業務寫入