同步 OpsXShell 档位定价与 Waffo 商品映射,补齐 checkout/webhook/设备列表契约,便于桌面端购买与满席释放。 Co-authored-by: Cursor <cursoragent@cursor.com>
86 lines
2.6 KiB
Go
86 lines
2.6 KiB
Go
package license
|
|
|
|
import (
|
|
"backend/internal/dto"
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// Verify 客户端 License 验证 // Logan.Li
|
|
func (ctrl *LicenseController) Verify(c *gin.Context) {
|
|
var req dto.LicenseVerifyRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误: " + err.Error()})
|
|
return
|
|
}
|
|
resp, _ := ctrl.svc.Verify(req)
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// ActivateDevice 客户端激活(机器绑定) // Logan.Li
|
|
func (ctrl *LicenseController) ActivateDevice(c *gin.Context) {
|
|
var req dto.LicenseActivateRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误: " + err.Error()})
|
|
return
|
|
}
|
|
data, err := ctrl.svc.Activate(req, c.ClientIP())
|
|
if err != nil {
|
|
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "激活成功", "data": data})
|
|
}
|
|
|
|
// Deactivate 客户端停用 // Logan.Li
|
|
func (ctrl *LicenseController) Deactivate(c *gin.Context) {
|
|
var req dto.LicenseDeactivateRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"})
|
|
return
|
|
}
|
|
if err := ctrl.svc.Deactivate(req); err != nil {
|
|
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "停用成功"})
|
|
}
|
|
|
|
// Heartbeat 客户端心跳 // Logan.Li
|
|
func (ctrl *LicenseController) Heartbeat(c *gin.Context) {
|
|
var req dto.LicenseHeartbeatRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"})
|
|
return
|
|
}
|
|
data, err := ctrl.svc.Heartbeat(req)
|
|
if err != nil {
|
|
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "心跳成功", "data": data})
|
|
}
|
|
|
|
// ListDevices 客户端查询已绑定设备(用于席位满时释放) // Logan.Li
|
|
func (ctrl *LicenseController) ListDevices(c *gin.Context) {
|
|
var req struct {
|
|
LicenseKey string `json:"license_key" binding:"required"`
|
|
}
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"})
|
|
return
|
|
}
|
|
devices, maxDevices, err := ctrl.svc.ListDevicesByKey(req.LicenseKey)
|
|
if err != nil {
|
|
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"code": 0, "data": gin.H{
|
|
"devices": devices,
|
|
"max_devices": maxDevices,
|
|
"used": len(devices),
|
|
}})
|
|
}
|
|
|