From 12b4c3e54c04357a86b52fd105566f00370cb79d Mon Sep 17 00:00:00 2001 From: ryan Date: Sun, 30 Aug 2026 16:39:40 +0800 Subject: [PATCH] fix(cap): keep only /api/v1/cap routes Drop the unversioned /api/cap aliases so Challenge and Redeem exist only under /api/v1/cap. --- backend/plugins/domain/cap/handlers.go | 5 +++-- backend/plugins/domain/cap/plugin.go | 6 +----- backend/plugins/domain/cap/plugin_captcha_contract_test.go | 7 +++++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/plugins/domain/cap/handlers.go b/backend/plugins/domain/cap/handlers.go index 3be401c9..fe211ddb 100644 --- a/backend/plugins/domain/cap/handlers.go +++ b/backend/plugins/domain/cap/handlers.go @@ -20,7 +20,8 @@ import ( // @Param request body challengeRequest false "可选范围限制参数" // @Success 200 {object} response.Any{data=cap.ChallengeResponse} "成功返回 PoW 难题" // @Failure 500 {object} response.Any "内部服务错误" -// @Router /api/cap/challenge [post] +// @Router /api/v1/cap/challenge [get] +// @Router /api/v1/cap/challenge [post] func Challenge(c *gin.Context) { var req challengeRequest _ = c.ShouldBind(&req) // 允许不传 body,默认使用 login scope @@ -54,7 +55,7 @@ func Challenge(c *gin.Context) { // @Success 200 {object} response.Any{data=cap.RedeemResponse} "核销成功,返回 X-Cap-Token" // @Failure 400 {object} response.Any "参数错误或核销失败" // @Failure 500 {object} response.Any "内部服务错误" -// @Router /api/cap/redeem [post] +// @Router /api/v1/cap/redeem [post] func Redeem(c *gin.Context) { var req redeemRequest if err := c.ShouldBindJSON(&req); err != nil { diff --git a/backend/plugins/domain/cap/plugin.go b/backend/plugins/domain/cap/plugin.go index c9ecf749..2c4703dc 100644 --- a/backend/plugins/domain/cap/plugin.go +++ b/backend/plugins/domain/cap/plugin.go @@ -86,11 +86,7 @@ func (p *Plugin) Apply(ctx *core.Context) error { capGroup.POST("/challenge", Challenge) capGroup.POST("/redeem", Redeem) } - - legacy := ctx.Router().Group("/api/cap") - legacy.POST("/challenge", Challenge) - legacy.POST("/redeem", Redeem) - ctx.Router().RegisterWhitelist("/api/cap/challenge", "/api/cap/redeem") + ctx.Router().RegisterWhitelist("/api/v1/cap/challenge", "/api/v1/cap/redeem") // Register Settings Schemas ctx.Settings().Register(extpoints.SettingSchema{ diff --git a/backend/plugins/domain/cap/plugin_captcha_contract_test.go b/backend/plugins/domain/cap/plugin_captcha_contract_test.go index 2eb104f8..7577a31d 100644 --- a/backend/plugins/domain/cap/plugin_captcha_contract_test.go +++ b/backend/plugins/domain/cap/plugin_captcha_contract_test.go @@ -34,15 +34,18 @@ func TestApplyRegistersUnversionedCapRoutes(t *testing.T) { t.Fatal(err) } want := map[string]bool{ + "GET /api/v1/cap/challenge": false, "POST /api/v1/cap/challenge": false, - "POST /api/cap/challenge": false, - "POST /api/cap/redeem": false, + "POST /api/v1/cap/redeem": false, } for _, rd := range ctx.Router().Routes() { key := rd.Method + " " + rd.Path if _, ok := want[key]; ok { want[key] = true } + if key == "POST /api/cap/challenge" || key == "POST /api/cap/redeem" { + t.Errorf("legacy route must not exist: %s", key) + } } for key, ok := range want { if !ok {