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 测试面板。

准备 Demo 数据

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

默认入口 tenant_demo / mini-demo / evt_demo_001
多赛道入口 tenant_demo / mini-demo / evt_demo_variant_manual_001

本地配置导入与发布

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

当前上下文

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

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

短信登录 / 绑定

微信小程序登录

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

入口与首页

活动与启动

局内状态

结果查询

当前用户

一键流程

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

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

请求导出

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

Last Curl

资源对象管理

管理地图、赛场和资源包对象,先建对象,再建版本,后面 Event source 直接引用这些对象。

Event Source 组装

创建 Event 并把 map version、playfield version、resource pack version 组装成 source config。

Build / Publish / Rollback

围绕当前 Event 查询 source/build/release 流水线,并执行 build、publish、rollback。

场景模板

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

Scenario JSON

响应日志

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

ready

请求历史

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

API 目录

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

共 0 个接口,支持按关键词筛选。
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
活动详情页 / 开始前准备页聚合接口,判断是否可启动、继续还是查看上次结果;第一阶段也会返回多赛道 assignmentMode 和 courseVariants。
鉴权:Bearer token
POST/events/{eventPublicID}/launch
基于当前 event 的已发布 release 创建一局 session,并返回 config URL、releaseId、sessionToken;多赛道第一阶段支持可选 variantId,并返回最终绑定的 launch.variant。
鉴权:Bearer token
关键参数:releaseIdvariantIdclientTypedeviceKey
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
GET/admin/maps
后台地图对象列表接口。
鉴权:Bearer token
POST/admin/maps
创建地图对象,后续再为它追加版本。
鉴权:Bearer token
关键参数:codenamestatus
GET/admin/maps/{mapPublicID}
查看单个地图对象和它的版本列表。
鉴权:Bearer token
POST/admin/maps/{mapPublicID}/versions
为地图对象创建一个版本,挂接 mapmeta 和 tiles 根路径。
鉴权:Bearer token
关键参数:versionCodemapmetaUrltilesRootUrlsetAsCurrent
GET/admin/playfields
后台赛场对象列表接口。
鉴权:Bearer token
POST/admin/playfields
创建赛场对象,适合管理 KML / GeoJSON 这类可复用场地资源。
鉴权:Bearer token
关键参数:codenamekindstatus
GET/admin/playfields/{playfieldPublicID}
查看单个赛场对象和它的版本列表。
鉴权:Bearer token
POST/admin/playfields/{playfieldPublicID}/versions
为赛场对象创建一个版本,挂接 KML 等源文件地址和控制点摘要。
鉴权:Bearer token
关键参数:versionCodesourceTypesourceUrlcontrolCountsetAsCurrent
GET/admin/resource-packs
后台资源包对象列表接口。
鉴权:Bearer token
POST/admin/resource-packs
创建资源包对象,用来管理内容页、音频和主题资源。
鉴权:Bearer token
关键参数:codenamestatus
GET/admin/resource-packs/{resourcePackPublicID}
查看单个资源包对象和它的版本列表。
鉴权:Bearer token
POST/admin/resource-packs/{resourcePackPublicID}/versions
为资源包对象创建版本,配置内容入口、音频根路径和主题代码。
鉴权:Bearer token
关键参数:versionCodecontentEntryUrlaudioRootUrlthemeProfileCodesetAsCurrent
GET/admin/events
后台 event 列表接口。
鉴权:Bearer token
POST/admin/events
创建 event 基础信息。
鉴权:Bearer token
关键参数:tenantCodeslugdisplayNamestatus
GET/admin/events/{eventPublicID}
查看 event 明细、最新 source 和当前 source 摘要。
鉴权:Bearer token
PUT/admin/events/{eventPublicID}
更新 event 基础信息。
鉴权:Bearer token
关键参数:tenantCodeslugdisplayNamestatus
POST/admin/events/{eventPublicID}/source
把 map/playfield/resource pack 版本和 gameModeCode 组装成 source config。
鉴权:Bearer token
关键参数:map.mapIdmap.versionIdplayfield.playfieldIdplayfield.versionIdgameModeCodeoverrides
GET/admin/events/{eventPublicID}/pipeline
查看 event 下的 source、build、release 流水线概览。
鉴权:Bearer token
POST/admin/sources/{sourceID}/build
基于 source 生成一条 build 记录和 preview manifest。
鉴权:Bearer token
GET/admin/builds/{buildID}
查看后台 build 明细。
鉴权:Bearer token
POST/admin/builds/{buildID}/publish
把后台 build 发布为正式 release,并切换为 event 当前发布版本。
鉴权:Bearer token
POST/admin/events/{eventPublicID}/rollback
将 event 当前发布版本回滚到指定 releaseId。
鉴权:Bearer token
关键参数:releaseId
`