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  }