Skip to content

Commit 90bf429

Browse files
authored
Merge pull request #495 from LydiaCai1203/fix-repo-list
feat: 获取仓库列表处加了缓存逻辑
2 parents 14c3c9a + 94828db commit 90bf429

14 files changed

Lines changed: 10424 additions & 51 deletions

File tree

backend/biz/git/handler/v1/identity.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func NewGitIdentityHandler(i *do.Injector) (*GitIdentityHandler, error) {
3131

3232
g := w.Group("/api/v1/users/git-identities")
3333
g.Use(auth.Auth(), targetActive.TargetActive())
34-
g.GET("", web.BaseHandler(h.List))
34+
g.GET("", web.BindHandler(h.List))
3535
g.GET("/:id", web.BindHandler(h.Get))
3636
g.POST("", web.BindHandler(h.Add))
3737
g.PUT("/:id", web.BindHandler(h.Update))
@@ -49,12 +49,13 @@ func NewGitIdentityHandler(i *do.Injector) (*GitIdentityHandler, error) {
4949
// @Accept json
5050
// @Produce json
5151
// @Security MonkeyCodeAIAuth
52-
// @Success 200 {object} web.Resp{data=[]domain.GitIdentity} "成功"
53-
// @Failure 500 {object} web.Resp "服务器内部错误"
52+
// @Param flush query bool false "是否刷新缓存"
53+
// @Success 200 {object} web.Resp{data=[]domain.GitIdentity} "成功"
54+
// @Failure 500 {object} web.Resp "服务器内部错误"
5455
// @Router /api/v1/users/git-identities [get]
55-
func (h *GitIdentityHandler) List(c *web.Context) error {
56+
func (h *GitIdentityHandler) List(c *web.Context, req domain.ListGitIdentityReq) error {
5657
user := middleware.GetUser(c)
57-
list, err := h.usecase.List(c.Request().Context(), user.ID)
58+
list, err := h.usecase.List(c.Request().Context(), user.ID, req.Flush)
5859
if err != nil {
5960
return errcode.ErrDatabaseQuery.Wrap(err)
6061
}
@@ -69,15 +70,16 @@ func (h *GitIdentityHandler) List(c *web.Context) error {
6970
// @Accept json
7071
// @Produce json
7172
// @Security MonkeyCodeAIAuth
72-
// @Param id path string true "Git 身份认证ID"
73-
// @Success 200 {object} web.Resp{data=domain.GitIdentity} "成功"
74-
// @Failure 400 {object} web.Resp "请求参数错误"
75-
// @Failure 404 {object} web.Resp "资源不存在"
76-
// @Failure 500 {object} web.Resp "服务器内部错误"
73+
// @Param id path string true "Git 身份认证ID"
74+
// @Param flush query bool false "是否刷新缓存"
75+
// @Success 200 {object} web.Resp{data=domain.GitIdentity} "成功"
76+
// @Failure 400 {object} web.Resp "请求参数错误"
77+
// @Failure 404 {object} web.Resp "资源不存在"
78+
// @Failure 500 {object} web.Resp "服务器内部错误"
7779
// @Router /api/v1/users/git-identities/{id} [get]
7880
func (h *GitIdentityHandler) Get(c *web.Context, req domain.GetGitIdentityReq) error {
7981
user := middleware.GetUser(c)
80-
identity, err := h.usecase.Get(c.Request().Context(), user.ID, req.ID)
82+
identity, err := h.usecase.Get(c.Request().Context(), user.ID, req.ID, req.Flush)
8183
if err != nil {
8284
return err
8385
}

backend/biz/git/usecase/identity.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import (
55
"fmt"
66
"log/slog"
77
"strings"
8+
"time"
89

910
"github.com/google/uuid"
11+
"github.com/patrickmn/go-cache"
1012
"github.com/samber/do"
1113

1214
"github.com/chaitin/MonkeyCode/backend/config"
@@ -15,6 +17,7 @@ import (
1517
"github.com/chaitin/MonkeyCode/backend/domain"
1618
"github.com/chaitin/MonkeyCode/backend/errcode"
1719
"github.com/chaitin/MonkeyCode/backend/pkg/cvt"
20+
gitpkg "github.com/chaitin/MonkeyCode/backend/pkg/git"
1821
"github.com/chaitin/MonkeyCode/backend/pkg/git/gitea"
1922
"github.com/chaitin/MonkeyCode/backend/pkg/git/gitee"
2023
"github.com/chaitin/MonkeyCode/backend/pkg/git/github"
@@ -27,6 +30,7 @@ type GitIdentityUsecase struct {
2730
repo domain.GitIdentityRepo
2831
tokenProvider *TokenProvider
2932
logger *slog.Logger
33+
repoCache *cache.Cache
3034
}
3135

3236
// NewGitIdentityUsecase 创建 Git 身份认证用例
@@ -36,11 +40,12 @@ func NewGitIdentityUsecase(i *do.Injector) (domain.GitIdentityUsecase, error) {
3640
repo: do.MustInvoke[domain.GitIdentityRepo](i),
3741
tokenProvider: do.MustInvoke[*TokenProvider](i),
3842
logger: do.MustInvoke[*slog.Logger](i).With("module", "GitIdentityUsecase"),
43+
repoCache: cache.New(7*24*time.Hour, 10*time.Minute),
3944
}, nil
4045
}
4146

4247
// List 获取用户的 Git 身份认证列表
43-
func (u *GitIdentityUsecase) List(ctx context.Context, uid uuid.UUID) ([]*domain.GitIdentity, error) {
48+
func (u *GitIdentityUsecase) List(ctx context.Context, uid uuid.UUID, flush bool) ([]*domain.GitIdentity, error) {
4449
identities, err := u.repo.List(ctx, uid)
4550
if err != nil {
4651
u.logger.ErrorContext(ctx, "failed to list git identities", "error", err, "user_id", uid)
@@ -58,34 +63,37 @@ func (u *GitIdentityUsecase) List(ctx context.Context, uid uuid.UUID) ([]*domain
5863
Token: token,
5964
InstallID: identity.InstallationID,
6065
IsOAuth: identity.OauthRefreshToken != "",
66+
Flush: flush,
6167
})
6268
if err != nil {
6369
u.logger.WarnContext(ctx, "failed to get authorized repositories", "error", err, "platform", identity.Platform, "identity_id", identity.ID)
64-
} else {
65-
tmp.AuthorizedRepositories = repos
70+
return tmp
6671
}
72+
tmp.AuthorizedRepositories = repos
6773
}
6874
return tmp
6975
}), nil
7076
}
7177

7278
func (u *GitIdentityUsecase) gitClienter(identity *db.GitIdentity) domain.GitClienter {
79+
var inner domain.GitClienter
7380
switch identity.Platform {
7481
case consts.GitPlatformGithub:
75-
return github.NewGithub(u.logger, u.cfg)
82+
inner = github.NewGithub(u.logger, u.cfg)
7683
case consts.GitPlatformGitLab:
77-
return gitlab.NewGitlabForBaseURL(identity.BaseURL, u.logger)
84+
inner = gitlab.NewGitlabForBaseURL(identity.BaseURL, u.logger)
7885
case consts.GitPlatformGitea:
79-
return gitea.NewGitea(u.logger, identity.BaseURL)
86+
inner = gitea.NewGitea(u.logger, identity.BaseURL)
8087
case consts.GitPlatformGitee:
81-
return gitee.NewGitee(identity.BaseURL, u.logger)
88+
inner = gitee.NewGitee(identity.BaseURL, u.logger)
8289
default:
8390
return nil
8491
}
92+
return gitpkg.NewCachedGitClient(inner, u.repoCache, identity.UserID.String()+":"+identity.ID.String())
8593
}
8694

8795
// Get 获取单个 Git 身份认证(仅限当前用户)
88-
func (u *GitIdentityUsecase) Get(ctx context.Context, uid uuid.UUID, id uuid.UUID) (*domain.GitIdentity, error) {
96+
func (u *GitIdentityUsecase) Get(ctx context.Context, uid uuid.UUID, id uuid.UUID, flush bool) (*domain.GitIdentity, error) {
8997
identity, err := u.repo.GetByUserID(ctx, uid, id)
9098
if err != nil {
9199
if db.IsNotFound(err) {
@@ -99,19 +107,20 @@ func (u *GitIdentityUsecase) Get(ctx context.Context, uid uuid.UUID, id uuid.UUI
99107
if client := u.gitClienter(identity); client != nil {
100108
token, err := u.tokenProvider.GetToken(ctx, identity.ID)
101109
if err != nil {
102-
u.logger.WarnContext(ctx, "failed to get token", "error", err, "platform", identity.Platform, "identity_id", id)
110+
u.logger.WarnContext(ctx, "failed to get token", "error", err, "platform", identity.Platform, "identity_id", identity.ID)
103111
return gi, nil
104112
}
105113
repos, err := client.Repositories(ctx, &domain.RepositoryOptions{
106114
Token: token,
107115
InstallID: identity.InstallationID,
108116
IsOAuth: identity.OauthRefreshToken != "",
117+
Flush: flush,
109118
})
110119
if err != nil {
111-
u.logger.WarnContext(ctx, "failed to get authorized repositories", "error", err, "platform", identity.Platform, "identity_id", id)
112-
} else {
113-
gi.AuthorizedRepositories = repos
120+
u.logger.WarnContext(ctx, "failed to get authorized repositories", "error", err, "platform", identity.Platform, "identity_id", identity.ID)
121+
return gi, nil
114122
}
123+
gi.AuthorizedRepositories = repos
115124
}
116125

117126
return gi, nil
@@ -134,6 +143,7 @@ func (u *GitIdentityUsecase) Update(ctx context.Context, uid uuid.UUID, req *dom
134143
return err
135144
}
136145
u.tokenProvider.ClearCache(req.ID)
146+
u.repoCache.Delete(uid.String() + ":" + req.ID.String())
137147
return nil
138148
}
139149

@@ -164,6 +174,7 @@ func (u *GitIdentityUsecase) Delete(ctx context.Context, uid uuid.UUID, id uuid.
164174
return err
165175
}
166176
u.tokenProvider.ClearCache(id)
177+
u.repoCache.Delete(uid.String() + ":" + id.String())
167178
return nil
168179
}
169180

backend/biz/host/usecase/host.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ type HostUsecase struct {
4545

4646
func NewHostUsecase(i *do.Injector) (domain.HostUsecase, error) {
4747
h := &HostUsecase{
48-
cfg: do.MustInvoke[*config.Config](i),
49-
redis: do.MustInvoke[*redis.Client](i),
50-
taskflow: do.MustInvoke[taskflow.Clienter](i),
51-
logger: do.MustInvoke[*slog.Logger](i).With("module", "HostUsecase"),
52-
repo: do.MustInvoke[domain.HostRepo](i),
53-
userRepo: do.MustInvoke[domain.UserRepo](i),
54-
girepo: do.MustInvoke[domain.GitIdentityRepo](i),
55-
vmexpireQueue: do.MustInvoke[*delayqueue.VMExpireQueue](i),
56-
tokenProvider: do.MustInvoke[*gituc.TokenProvider](i),
48+
cfg: do.MustInvoke[*config.Config](i),
49+
redis: do.MustInvoke[*redis.Client](i),
50+
taskflow: do.MustInvoke[taskflow.Clienter](i),
51+
logger: do.MustInvoke[*slog.Logger](i).With("module", "HostUsecase"),
52+
repo: do.MustInvoke[domain.HostRepo](i),
53+
userRepo: do.MustInvoke[domain.UserRepo](i),
54+
girepo: do.MustInvoke[domain.GitIdentityRepo](i),
55+
vmexpireQueue: do.MustInvoke[*delayqueue.VMExpireQueue](i),
56+
tokenProvider: do.MustInvoke[*gituc.TokenProvider](i),
5757
}
5858

5959
// 可选注入 PrivilegeChecker

backend/biz/register.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"github.com/samber/do"
55

66
"github.com/chaitin/MonkeyCode/backend/biz/file"
7-
"github.com/chaitin/MonkeyCode/backend/biz/vmidle"
87
"github.com/chaitin/MonkeyCode/backend/biz/git"
98
"github.com/chaitin/MonkeyCode/backend/biz/host"
109
"github.com/chaitin/MonkeyCode/backend/biz/notify"
@@ -14,6 +13,7 @@ import (
1413
"github.com/chaitin/MonkeyCode/backend/biz/task"
1514
"github.com/chaitin/MonkeyCode/backend/biz/team"
1615
"github.com/chaitin/MonkeyCode/backend/biz/user"
16+
"github.com/chaitin/MonkeyCode/backend/biz/vmidle"
1717
)
1818

1919
// RegisterAll 注册所有 biz 模块

backend/biz/task/service/types.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,3 @@ type wsContent struct {
3535
Content string `json:"content"`
3636
Message string `json:"message"`
3737
}
38-

backend/consts/host.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ const (
2222
type ProxyProtocol string
2323

2424
const (
25-
ProxyProtocolHTTP ProxyProtocol = "http"
26-
ProxyProtocolHTTPS ProxyProtocol = "https"
27-
ProxyProtocolSOCKS5 ProxyProtocol = "socks5"
25+
ProxyProtocolHTTP ProxyProtocol = "http"
26+
ProxyProtocolHTTPS ProxyProtocol = "https"
27+
ProxyProtocolSOCKS5 ProxyProtocol = "socks5"
2828
)
2929

3030
// TerminalMode 终端模式

0 commit comments

Comments
 (0)