refactor(internal): 分离runner

This commit is contained in:
mei
2026-06-19 18:47:36 +08:00
parent 7957a91609
commit 5da78f9deb
15 changed files with 209 additions and 53 deletions
+82
View File
@@ -65,6 +65,15 @@ func HandleCreateRule(c *gin.Context) {
return
}
// 检查关联账号和 Timer 是否存在(可以没有关联账号)
if exist, err := checkRuleConfigAccountAndTimerExist(newRule); err != nil {
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
return
} else if !exist {
c.JSON(400, gin.H{"code": 400, "data": "关联的账户或Timer不存在"})
return
}
// 规则校验
validatorRegistry := ruleConfigChecker.InitValidatorRegistry()
if err := validatorRegistry.Validate(newRule.Type, newRule.ConfigJson); err != nil {
@@ -82,6 +91,79 @@ func HandleCreateRule(c *gin.Context) {
c.JSON(200, gin.H{"code": 200, "data": "规则创建成功"})
}
// 编辑规则
func HandleEditRule(c *gin.Context) {
gormDB, err := db.GetGormDB()
if err != nil {
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
return
}
userInfo, err := user.GetUserInfoByGinCtx(c)
if err != nil {
c.JSON(401, gin.H{"code": 401, "data": "获取用户信息失败"})
return
}
ruleID, err := strconv.Atoi(c.Param("ruleID"))
if err != nil {
c.JSON(400, gin.H{"code": 400, "data": "规则 ID 格式错误"})
return
}
var rule model.Rule
result := gormDB.Where("id = ? AND uid = ?", ruleID, userInfo.ID).First(&rule)
if result.Error != nil {
c.JSON(404, gin.H{"code": 404, "data": "规则不存在"})
return
}
var updatedRule model.Rule
if err := c.BindJSON(&updatedRule); err != nil {
c.JSON(400, gin.H{"code": 400, "data": "输入参数错误"})
return
}
if updatedRule.Type == "" {
c.JSON(400, gin.H{"code": 400, "data": "规则类型不能为空"})
return
}
if updatedRule.Name == "" {
c.JSON(400, gin.H{"code": 400, "data": "规则名称不能为空"})
return
}
// 检查关联账号和 Timer 是否存在(可以没有关联账号)
if exist, err := checkRuleConfigAccountAndTimerExist(updatedRule); err != nil {
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
return
} else if !exist {
c.JSON(400, gin.H{"code": 400, "data": "关联的账户或Timer不存在"})
return
}
// 规则校验
validatorRegistry := ruleConfigChecker.InitValidatorRegistry()
if err := validatorRegistry.Validate(updatedRule.Type, updatedRule.ConfigJson); err != nil {
c.JSON(400, gin.H{"code": 400, "data": fmt.Sprintf("规则配置验证失败: %s", err.Error())})
return
}
rule.Name = updatedRule.Name
rule.Type = updatedRule.Type
rule.ConfigJson = updatedRule.ConfigJson
rule.AccountID = updatedRule.AccountID
rule.TimerID = updatedRule.TimerID
result = gormDB.Save(&rule)
if result.Error != nil {
c.JSON(500, gin.H{"code": 500, "data": "更新规则失败"})
return
}
c.JSON(200, gin.H{"code": 200, "data": "规则更新成功"})
}
// 根据删除规则
func HandleDeleteRule(c *gin.Context) {
userInfo, err := user.GetUserInfoByGinCtx(c)
+35
View File
@@ -15,3 +15,38 @@ func DeleteRuleByID(id uint, uid uint) error {
result := gormDB.Where("id = ? AND uid = ?", id, uid).Delete(&model.Rule{})
return result.Error
}
// 检查关联账号和 Timer 是否存在(可以没有关联账号)
func checkRuleConfigAccountAndTimerExist(rule model.Rule) (exist bool, err error) {
gormDB, err := db.GetGormDB()
if err != nil {
return false, err
}
if rule.TimerID == 0 {
return false, nil
}
var count int64
if rule.AccountID != 0 {
result := gormDB.Model(&model.Account{}).Where("id = ? AND uid = ?", rule.AccountID, rule.UID).Count(&count)
if result.Error != nil {
return false, result.Error
}
if count == 0 {
return false, nil
}
}
if rule.TimerID != 0 {
result := gormDB.Model(&model.Timer{}).Where("id = ? AND uid = ?", rule.TimerID, rule.UID).Count(&count)
if result.Error != nil {
return false, result.Error
}
if count == 0 {
return false, nil
}
}
return true, nil
}