feat(gateway): 优化gateway相关功能
Quality check / Web UI (push) Successful in 9m19s

This commit is contained in:
mei
2026-09-12 15:32:27 +08:00
parent 0d89b7fe8f
commit 9b656cebee
84 changed files with 2769 additions and 825 deletions
+17 -10
View File
@@ -1,26 +1,33 @@
package fwalert
import (
"context"
"fmt"
"github.com/go-resty/resty/v2"
"github.com/ssdomei232/goodBaby/internal/retry"
)
// send 发送消息
// Send 发送一条饭碗警告
func Send(ctx context.Context, config *FwAlertRuleConfig) error {
if err := retry.Do(ctx, func() error {
return send(config)
}); err != nil {
return fmt.Errorf("发送饭碗警告失败: %w", err)
}
return nil
}
// send 调用一次 Webhook
func send(config *FwAlertRuleConfig) error {
restyClient := resty.New()
req := restyClient.R()
req.SetBody(FwAlertRequest{
Message: config.Msg,
})
resp, err := req.Execute(resty.MethodPost, config.WebhookURL)
resp, err := resty.New().R().
SetBody(FwAlertRequest{Message: config.Msg}).
Execute(resty.MethodPost, config.WebhookURL)
if err != nil {
return err
}
if resp.StatusCode() != 200 {
return fmt.Errorf("发送饭碗警告失败: %s", resp.Status())
return fmt.Errorf("Webhook 返回状态码 %s", resp.Status())
}
return nil
}
+2 -1
View File
@@ -1,6 +1,7 @@
package fwalert
const RuleTypeFwalert = "fwalert"
// RuleType 饭碗警告规则类型标识
const RuleType = "fwalert"
type FwAlertRuleConfig struct {
WebhookURL string `json:"webhook_url"`
@@ -1,23 +1,23 @@
package fwalert
import (
"encoding/json"
"fmt"
"net/url"
"github.com/ssdomei232/goodBaby/internal/meta"
)
// FwalertRuleValidator 饭碗警告规则验证器
type FwalertRuleValidator struct{}
func (v *FwalertRuleValidator) GetType() string {
return RuleTypeFwalert
return RuleType
}
func (v *FwalertRuleValidator) Validate(configJSON string) error {
var config FwAlertRuleConfig
if err := json.Unmarshal([]byte(configJSON), &config); err != nil {
return fmt.Errorf("解析饭碗警告规则配置失败: %v", err)
config, err := ParseRuleConfig(configJSON)
if err != nil {
return err
}
parsed, err := url.Parse(config.WebhookURL)
@@ -40,23 +40,14 @@ func (v *FwalertRuleValidator) Validate(configJSON string) error {
func (v *FwalertRuleValidator) Meta() meta.RuleMeta {
return meta.RuleMeta{
Type: RuleTypeFwalert,
Type: RuleType,
Label: "发送饭碗警告",
Description: "触发时发送饭碗警告消息。",
Docs: "docs/fwalert-config.md",
AccountType: "",
Fields: []meta.Field{
{Key: "webhook_url", Label: "Webhook URL", Type: meta.FieldString, Required: true, Help: "饭碗警告的触发地址", Placeholder: "https://fwalert.com/xxx-xxx-xxx-xxx-xxx"},
{Key: "msg", Label: "消息内容", Type: meta.FieldTextarea, Required: true, Help: "最大长度 1000 个字符"},
{Key: "msg", Label: "消息内容", Type: meta.FieldTextarea, Required: true, GatewayMessage: true, Help: "最大长度 1000 个字符"},
},
}
}
// ParseRuleConfig 解析饭碗警告规则配置
func ParseRuleConfig(configJSON string) (*FwAlertRuleConfig, error) {
var config FwAlertRuleConfig
if err := json.Unmarshal([]byte(configJSON), &config); err != nil {
return nil, fmt.Errorf("解析饭碗警告规则配置失败: %v", err)
}
return &config, nil
}
+5 -10
View File
@@ -2,9 +2,7 @@ package fwalert
import (
"context"
"log"
"github.com/ssdomei232/goodBaby/internal/retry"
"github.com/ssdomei232/goodBaby/model"
)
@@ -12,18 +10,15 @@ import (
type FwalertExecutor struct{}
func (e *FwalertExecutor) GetType() string {
return RuleTypeFwalert
return RuleType
}
func (e *FwalertExecutor) Execute(ctx context.Context, rule *model.Rule) error {
log.Printf("执行饭碗警告规则: %s (ID: %d)", rule.Name, rule.ID)
config, err := ParseRuleConfig(rule.ConfigJson)
func (e *FwalertExecutor) Execute(ctx context.Context, task *model.RuleTask) error {
// 饭碗警告的凭据就是 Webhook 地址,直接写在规则配置里
config, err := ParseRuleConfig(task.Rule.ConfigJson)
if err != nil {
return err
}
return retry.Do(ctx, func() error {
return send(config)
})
return Send(ctx, config)
}
+15
View File
@@ -0,0 +1,15 @@
package fwalert
import (
"encoding/json"
"fmt"
)
// ParseRuleConfig 解析饭碗警告规则配置
func ParseRuleConfig(configJSON string) (*FwAlertRuleConfig, error) {
var config FwAlertRuleConfig
if err := json.Unmarshal([]byte(configJSON), &config); err != nil {
return nil, fmt.Errorf("解析饭碗警告规则配置失败: %v", err)
}
return &config, nil
}