fix(backend): 架构质量改进批次二 (#32-37)

- #32 License 激活迁移到 license_devices 表:Activate/Verify/Deactivate 全部改用
  license_devices,新增 max_devices 校验和 GET /license/devices 端点;
  Activate 现在校验 shop_id 防跨租户激活
- #33 checkInventory 从 StockOutHandler 移到 StockService.CheckInventoryAvailability
- #34 新增 util/response.go 统一错误响应工具(RespondError/RespondSuccess/RespondCreated)
- #35 生产模式 CORS Origin='*' 启动时 Fatal
- #36 生产模式 License 私钥未配置启动时 Fatal
- #37 新增 util/page.go ValidatePageSize,应用到 partner/product/stock_in/stock_out handler

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-11 00:38:49 +08:00
parent 51cfe5fc6d
commit 3ab78dbf7a
15 changed files with 554 additions and 429 deletions
+9
View File
@@ -0,0 +1,9 @@
package util
// ValidatePageSize clamps pageSize into [1, maxSize], returning defaultSize when out of range.
func ValidatePageSize(pageSize, defaultSize, maxSize int) int {
if pageSize < 1 || pageSize > maxSize {
return defaultSize
}
return pageSize
}
+22
View File
@@ -0,0 +1,22 @@
package util
import (
"net/http"
"github.com/gin-gonic/gin"
)
// RespondError writes a structured error response: {"code": code, "message": msg}.
func RespondError(c *gin.Context, status int, code, msg string) {
c.JSON(status, gin.H{"code": code, "message": msg})
}
// RespondSuccess writes {"data": data} with HTTP 200.
func RespondSuccess(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, gin.H{"data": data})
}
// RespondCreated writes {"data": data} with HTTP 201.
func RespondCreated(c *gin.Context, data interface{}) {
c.JSON(http.StatusCreated, gin.H{"data": data})
}