Cloudreve/pkg/filemanager/manager/fs.go

118 lines
4.0 KiB
Go

package manager
import (
"context"
"github.com/cloudreve/Cloudreve/v4/ent"
"github.com/cloudreve/Cloudreve/v4/inventory/types"
"github.com/cloudreve/Cloudreve/v4/pkg/cluster"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/cos"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/ks3"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/local"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/obs"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/onedrive"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/oss"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/qiniu"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/remote"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/s3"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver/upyun"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
)
func (m *manager) LocalDriver(policy *ent.StoragePolicy) driver.Handler {
if policy == nil {
policy = &ent.StoragePolicy{Type: types.PolicyTypeLocal, Settings: &types.PolicySetting{}}
}
return local.New(policy, m.l, m.config)
}
func (m *manager) CastStoragePolicyOnSlave(ctx context.Context, policy *ent.StoragePolicy) *ent.StoragePolicy {
if !m.stateless {
return policy
}
nodeId := cluster.NodeIdFromContext(ctx)
if policy.Type == types.PolicyTypeRemote {
if nodeId != policy.NodeID {
return policy
}
policyCopy := *policy
policyCopy.Type = types.PolicyTypeLocal
return &policyCopy
} else if policy.Type == types.PolicyTypeLocal {
policyCopy := *policy
policyCopy.NodeID = nodeId
policyCopy.Type = types.PolicyTypeRemote
policyCopy.SetNode(&ent.Node{
ID: nodeId,
Server: cluster.MasterSiteUrlFromContext(ctx),
SlaveKey: m.config.Slave().Secret,
})
return &policyCopy
} else if policy.Type == types.PolicyTypeOss {
policyCopy := *policy
if policyCopy.Settings != nil {
policyCopy.Settings.ServerSideEndpoint = ""
}
}
return policy
}
func (m *manager) GetStorageDriver(ctx context.Context, policy *ent.StoragePolicy) (driver.Handler, error) {
switch policy.Type {
case types.PolicyTypeLocal:
return local.New(policy, m.l, m.config), nil
case types.PolicyTypeRemote:
return remote.New(ctx, policy, m.settings, m.config, m.l)
case types.PolicyTypeOss:
return oss.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeCos:
return cos.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeS3:
return s3.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeKs3:
return ks3.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeObs:
return obs.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeQiniu:
return qiniu.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeUpyun:
return upyun.New(ctx, policy, m.settings, m.config, m.l, m.dep.MimeDetector(ctx))
case types.PolicyTypeOd:
return onedrive.New(ctx, policy, m.settings, m.config, m.l, m.dep.CredManager())
default:
return nil, ErrUnknownPolicyType
}
}
func (m *manager) getEntityPolicyDriver(cxt context.Context, e fs.Entity, policyOverwrite *ent.StoragePolicy) (*ent.StoragePolicy, driver.Handler, error) {
policyID := e.PolicyID()
var (
policy *ent.StoragePolicy
err error
)
if policyID == 0 {
policy = &ent.StoragePolicy{Type: types.PolicyTypeLocal, Settings: &types.PolicySetting{}}
} else {
if policyOverwrite != nil && policyOverwrite.ID == policyID {
policy = policyOverwrite
} else {
policy, err = m.policyClient.GetPolicyByID(cxt, e.PolicyID())
if err != nil {
return nil, nil, serializer.NewError(serializer.CodeDBError, "failed to get policy", err)
}
}
}
d, err := m.GetStorageDriver(cxt, policy)
if err != nil {
return nil, nil, err
}
return policy, d, nil
}