package handlers import ( "net/http" "cmr-backend/internal/httpx" "cmr-backend/internal/service" ) type DevHandler struct { devService *service.DevService } func NewDevHandler(devService *service.DevService) *DevHandler { return &DevHandler{devService: devService} } func (h *DevHandler) BootstrapDemo(w http.ResponseWriter, r *http.Request) { result, err := h.devService.BootstrapDemo(r.Context()) if err != nil { httpx.WriteError(w, err) return } httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result}) } func (h *DevHandler) Workbench(w http.ResponseWriter, r *http.Request) { if !h.devService.Enabled() { http.NotFound(w, r) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write([]byte(devWorkbenchHTML)) } const devWorkbenchHTML = ` CMR Backend Workbench
Developer Workbench

CMR Backend API Flow Panel

把入口、登录、首页、活动详情、launch、session、profile 串成一条完整调试链。这个页面只在非 production 环境开放,适合后续继续扩展成你想要的 API 测试面板。

1. Bootstrap

初始化 demo tenant / channel / event / card。

默认入口 tenant_demo / mini-demo / evt_demo_001

2. Config Pipeline

从本地 event 目录导入 source config,生成 preview build,并可直接发布成当前 release。

3. Session State

当前调试上下文,所有按钮共享这一组状态。

Access Token -
Refresh Token -
Source ID -
Build ID -
Release ID -
Session ID -
Session Token -

4. SMS Auth

5. WeChat Mini

开发环境可直接使用 dev-xxx code。

6. Entry / Home

7. Event

8. Session

9. Results

10. Profile

11. Quick Flows

把常用接口串成一键工作流,减少重复点击。

这些流程会复用当前表单里的手机号、设备、event、channel 等输入。

12. Request Export

最后一次请求会生成一条可复制的 curl,后面做问题复现会方便很多。

Last Curl

13. Scenarios

保存当前表单状态为可复用场景,也支持导入导出 JSON,适合后续切换不同俱乐部、入口和 event。

Scenario JSON

14. Response Log

最后一次请求的结果会记录在这里,便于后续做请求回放和用例保存。

ready

15. Request History

最近 12 次请求会保留在浏览器本地,刷新页面不会丢。

16. API 列表

把当前已实现接口按分组放进 workbench,直接看中文说明、鉴权要求和关键参数,不用来回翻文档。

共 24 个接口,支持按关键词筛选。
GET/healthz
健康检查接口,用来确认服务是否存活。
鉴权:无需鉴权
POST/auth/sms/send
发送短信验证码,支持登录和绑定手机号两种场景。
鉴权:无需鉴权
关键参数:countryCodemobileclientTypedeviceKeyscene
POST/auth/login/sms
APP 主登录入口,使用手机号验证码登录并返回 access/refresh token。
鉴权:无需鉴权
关键参数:mobilecodeclientTypedeviceKey
POST/auth/login/wechat-mini
微信小程序登录入口。开发环境支持 dev- 前缀 code 直接模拟登录。
鉴权:无需鉴权
关键参数:codeclientType=wechatdeviceKey
POST/auth/bind/mobile
已登录用户绑定手机号,必要时把微信轻账号合并到手机号主账号。
鉴权:Bearer token
关键参数:mobilecodeclientTypedeviceKey
POST/auth/refresh
使用 refresh token 刷新 access token。
鉴权:无需 Bearer token
关键参数:refreshTokenclientTypedeviceKey
POST/auth/logout
登出并撤销 refresh token。
鉴权:可带 Bearer token
GET/entry/resolve
解析当前入口属于哪个 tenant / channel,是多俱乐部、多公众号接入的入口层基础接口。
鉴权:无需鉴权
查询参数:channelCodechannelTypeplatformAppIdtenantCode
GET/home
返回入口首页卡片数据。
鉴权:无需鉴权
GET/cards
只返回卡片列表,适合调试卡片数据本身。
鉴权:无需鉴权
GET/me/entry-home
首页聚合接口,返回用户、tenant、channel、cards、进行中 session 和最近一局。
鉴权:Bearer token
GET/events/{eventPublicID}
活动详情接口,会带当前发布的 release 和 resolvedRelease。
鉴权:无需鉴权
GET/events/{eventPublicID}/play
活动详情页 / 开始前准备页聚合接口,判断是否可启动、继续还是查看上次结果。
鉴权:Bearer token
POST/events/{eventPublicID}/launch
基于当前 event 的已发布 release 创建一局 session,并返回 config URL、releaseId、sessionToken。
鉴权:Bearer token
关键参数:releaseIdclientTypedeviceKey
GET/events/{eventPublicID}/config-sources
查看某个 event 下已经导入过的 source config 列表。
鉴权:Bearer token
GET/config-sources/{sourceID}
查看单条 source config 明细。
鉴权:Bearer token
GET/config-builds/{buildID}
查看单次 build 的 manifest 和 asset index。
鉴权:Bearer token
GET/sessions/{sessionPublicID}
查询一局详情,带 session 状态、event 和 resolvedRelease。
鉴权:Bearer token
POST/sessions/{sessionPublicID}/start
把 session 从 launched 推进到 running
鉴权:sessionToken
关键参数:sessionToken
POST/sessions/{sessionPublicID}/finish
结束一局并沉淀结果摘要,是结果页数据的来源。
鉴权:sessionToken
关键参数:sessionTokenstatussummary.*
GET/me/sessions
查询用户最近 session 列表。
鉴权:Bearer token
GET/sessions/{sessionPublicID}/result
单局结果页接口,返回 session 和 result。
鉴权:Bearer token
GET/me/results
查询用户最近结果列表。
鉴权:Bearer token
GET/me
返回当前用户基础信息。
鉴权:Bearer token
GET/me/profile
“我的页”聚合接口,返回绑定概览、绑定项列表和最近记录摘要。
鉴权:Bearer token
POST/dev/bootstrap-demo
开发态自举 demo 数据,会准备 tenant、channel、event、release、card、source、build。
鉴权:仅 non-production,无需鉴权
GET/dev/config/local-files
列出本地配置目录中的 JSON 文件,作为 source config 导入入口。
鉴权:仅 non-production,无需鉴权
POST/dev/events/{eventPublicID}/config-sources/import-local
从本地 event 目录导入 source config。
鉴权:仅 non-production,无需鉴权
关键参数:fileNamenotes
POST/dev/config-builds/preview
基于 source config 生成 preview build,并产出 preview manifest。
鉴权:仅 non-production,无需鉴权
关键参数:sourceId
POST/dev/config-builds/publish
把成功的 build 发布成正式 release,并自动切换成当前 event 的可启动版本。
鉴权:仅 non-production,无需鉴权
关键参数:buildId
`