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
+2 -11
View File
@@ -2,7 +2,6 @@ package github
import (
"context"
"encoding/json"
"fmt"
"github.com/google/go-github/v84/github"
@@ -18,7 +17,7 @@ func (v *GitHubAccountConfigValidator) GetType() string {
}
func (v *GitHubAccountConfigValidator) Validate(config string) error {
cfg, err := parseAccount(config)
cfg, err := ParseAccountConfig(config)
if err != nil {
return err
}
@@ -35,7 +34,7 @@ func (v *GitHubAccountConfigValidator) Validate(config string) error {
// Test 用 token 拉一次当前用户信息,验证 token 是否有效
func (v *GitHubAccountConfigValidator) Test(config string) error {
cfg, err := parseAccount(config)
cfg, err := ParseAccountConfig(config)
if err != nil {
return err
}
@@ -65,11 +64,3 @@ func (v *GitHubAccountConfigValidator) Meta() meta.AccountMeta {
},
}
}
func parseAccount(config string) (*GithubAccount, error) {
var cfg GithubAccount
if err := json.Unmarshal([]byte(config), &cfg); err != nil {
return nil, fmt.Errorf("解析GitHub账号配置失败: %v", err)
}
return &cfg, nil
}
+9 -14
View File
@@ -6,29 +6,24 @@ import (
"strings"
"github.com/ssdomei232/goodBaby/internal/retry"
"github.com/ssdomei232/goodBaby/model"
)
// MakeRepositoryPublic 将规则中配置的仓库设置为 public
func MakeRepositoryPublic(ctx context.Context, rule *model.Rule) error {
reposConfig, account, err := GetGithubReposAndAccountFromRule(rule)
if err != nil {
return err
}
// MakeRepositoryPublic 把配置里的仓库逐个设置为 public
//
// 每个仓库单独重试、互不阻塞,最后汇总失败信息交给上层记录。
func MakeRepositoryPublic(ctx context.Context, account *GithubAccount, config *GithubReposConfig) error {
var fails []string
for _, repo := range reposConfig.Repos {
err := retry.Do(ctx, func() error {
for _, repo := range config.Repos {
if err := retry.Do(ctx, func() error {
return SetRepositoryPublic(ctx, account.Token, account.Owner, repo)
})
if err != nil {
fails = append(fails, fmt.Sprintf("%s: %v", repo, err))
}); err != nil {
fails = append(fails, err.Error())
}
}
if len(fails) > 0 {
return fmt.Errorf("%d/%d 个仓库设置为 public 失败: %s",
len(fails), len(reposConfig.Repos), strings.Join(fails, "; "))
len(fails), len(config.Repos), strings.Join(fails, "; "))
}
return nil
}
+3 -4
View File
@@ -1,7 +1,6 @@
package github
import (
"encoding/json"
"fmt"
"strings"
@@ -15,9 +14,9 @@ func (v *GithubMakeRepositoryPublicRuleValidator) GetType() string {
}
func (v *GithubMakeRepositoryPublicRuleValidator) Validate(configJSON string) error {
var config GithubReposConfig
if err := json.Unmarshal([]byte(configJSON), &config); err != nil {
return fmt.Errorf("解析 GitHub 规则配置失败: %v", err)
config, err := ParseReposConfig(configJSON)
if err != nil {
return err
}
if len(config.Repos) == 0 {
+11 -4
View File
@@ -2,7 +2,6 @@ package github
import (
"context"
"log"
"github.com/ssdomei232/goodBaby/model"
)
@@ -14,8 +13,16 @@ func (e *GithubMakeRepoPublicExecutor) GetType() string {
return RuleTypeMakeRepoPublic
}
func (e *GithubMakeRepoPublicExecutor) Execute(ctx context.Context, rule *model.Rule) error {
log.Printf("执行GitHub仓库公开规则: %s (ID: %d)", rule.Name, rule.ID)
func (e *GithubMakeRepoPublicExecutor) Execute(ctx context.Context, task *model.RuleTask) error {
account, err := ParseAccountConfig(task.AccountConfig())
if err != nil {
return err
}
return MakeRepositoryPublic(ctx, rule)
config, err := ParseReposConfig(task.Rule.ConfigJson)
if err != nil {
return err
}
return MakeRepositoryPublic(ctx, account, config)
}
+22 -18
View File
@@ -6,33 +6,37 @@ import (
"fmt"
"github.com/google/go-github/v84/github"
"github.com/ssdomei232/goodBaby/handler/db"
"github.com/ssdomei232/goodBaby/model"
)
// GetGithubReposAndAccountFromRule 从 rule 中获取 GithubReposConfig 和 GithubAccount
func GetGithubReposAndAccountFromRule(rule *model.Rule) (*GithubReposConfig, *GithubAccount, error) {
var githubReposConfig GithubReposConfig
if err := json.Unmarshal([]byte(rule.ConfigJson), &githubReposConfig); err != nil {
return nil, nil, fmt.Errorf("解析 GitHub 规则配置失败: %w", err)
// ParseAccountConfig 解析 GitHub 账号配置
func ParseAccountConfig(config string) (*GithubAccount, error) {
if config == "" {
return nil, fmt.Errorf("解析GitHub账号配置失败: 规则没有关联账号")
}
var githubAccount GithubAccount
if err := db.LoadAccountConfig(rule.AccountID, &githubAccount); err != nil {
return nil, nil, err
var account GithubAccount
if err := json.Unmarshal([]byte(config), &account); err != nil {
return nil, fmt.Errorf("解析GitHub账号配置失败: %v", err)
}
return &githubReposConfig, &githubAccount, nil
return &account, nil
}
// SetRepositoryPublic 将仓库设置为 public
// ParseReposConfig 解析仓库规则配置
func ParseReposConfig(configJSON string) (*GithubReposConfig, error) {
var config GithubReposConfig
if err := json.Unmarshal([]byte(configJSON), &config); err != nil {
return nil, fmt.Errorf("解析GitHub规则配置失败: %v", err)
}
return &config, nil
}
// SetRepositoryPublic 把一个仓库设置为 public
func SetRepositoryPublic(ctx context.Context, token, owner, repo string) error {
client := github.NewClient(nil).WithAuthToken(token)
opts := &github.Repository{
if _, _, err := client.Repositories.Edit(ctx, owner, repo, &github.Repository{
Visibility: github.Ptr("public"),
}); err != nil {
return fmt.Errorf("设置仓库 %s 为 public 失败: %w", repo, err)
}
_, _, err := client.Repositories.Edit(ctx, owner, repo, opts)
return err
return nil
}