github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/node/fabric.go (about) 1 package node 2 3 import ( 4 "encoding/gob" 5 model "github.com/cloudreve/Cloudreve/v3/models" 6 "github.com/cloudreve/Cloudreve/v3/pkg/cluster" 7 "github.com/cloudreve/Cloudreve/v3/pkg/conf" 8 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/googledrive" 9 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/onedrive" 10 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/oauth" 11 "github.com/cloudreve/Cloudreve/v3/pkg/mq" 12 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 13 "github.com/gin-gonic/gin" 14 ) 15 16 type SlaveNotificationService struct { 17 Subject string `uri:"subject" binding:"required"` 18 } 19 20 type OauthCredentialService struct { 21 PolicyID uint `uri:"id" binding:"required"` 22 } 23 24 func HandleMasterHeartbeat(req *serializer.NodePingReq) serializer.Response { 25 res, err := cluster.DefaultController.HandleHeartBeat(req) 26 if err != nil { 27 return serializer.Err(serializer.CodeInternalSetting, "Cannot initialize slave controller", err) 28 } 29 30 return serializer.Response{ 31 Code: 0, 32 Data: res, 33 } 34 } 35 36 // HandleSlaveNotificationPush 转发从机的消息通知到本机消息队列 37 func (s *SlaveNotificationService) HandleSlaveNotificationPush(c *gin.Context) serializer.Response { 38 var msg mq.Message 39 dec := gob.NewDecoder(c.Request.Body) 40 if err := dec.Decode(&msg); err != nil { 41 return serializer.ParamErr("Cannot parse notification message", err) 42 } 43 44 mq.GlobalMQ.Publish(s.Subject, msg) 45 return serializer.Response{} 46 } 47 48 // Get 获取主机Oauth策略的AccessToken 49 func (s *OauthCredentialService) Get(c *gin.Context) serializer.Response { 50 policy, err := model.GetPolicyByID(s.PolicyID) 51 if err != nil { 52 return serializer.Err(serializer.CodePolicyNotExist, "", err) 53 } 54 55 var client oauth.TokenProvider 56 switch policy.Type { 57 case "onedrive": 58 client, err = onedrive.NewClient(&policy) 59 if err != nil { 60 return serializer.Err(serializer.CodeInternalSetting, "Cannot initialize OneDrive client", err) 61 } 62 case "googledrive": 63 client, err = googledrive.NewClient(&policy) 64 if err != nil { 65 return serializer.Err(serializer.CodeInternalSetting, "Cannot initialize Google Drive client", err) 66 } 67 default: 68 return serializer.Err(serializer.CodePolicyNotExist, "", nil) 69 } 70 71 if err := client.UpdateCredential(c, conf.SystemConfig.Mode == "slave"); err != nil { 72 return serializer.Err(serializer.CodeInternalSetting, "Cannot refresh OneDrive credential", err) 73 } 74 75 return serializer.Response{Data: client.AccessToken()} 76 }