@@ -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
7278func (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
0 commit comments