refactor(vfs): 重构VFS模块,拆分数据访问逻辑与路径解析逻辑
将原先的 `vfs.go` 文件中的功能进行拆分,创建了独立的 DAO 层文件 `vfs_dao.go` 和路径处理文件 `vfs_path.go`,以提升代码结构清晰度和可维护性。 - 将数据库操作相关方法迁移至 `VfsDAO` 结构体中 - 新增 `vfs_dao.go` 文件用于管理底层数据访问对象 - 新增 `vfs_path.go` 文件专门处理路径解析逻辑 - 移除了原 `vfs.go` 中的数据库初始化、用户及节点操作等冗余代码
This commit is contained in:
119
internal/vfs/services/vfs_proxy.go
Normal file
119
internal/vfs/services/vfs_proxy.go
Normal file
@ -0,0 +1,119 @@
|
||||
package vfs_service
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.zzyxyz.com/zzy/zzyxyz_go_api/internal/vfs/models"
|
||||
)
|
||||
|
||||
// ServiceProxy 服务代理接口
|
||||
type ServiceProxy interface {
|
||||
// Get 从后端服务获取数据
|
||||
Get(servicePath string, node *models.VfsNode) ([]byte, error)
|
||||
|
||||
// Create 在后端服务创建资源
|
||||
Create(servicePath string, node *models.VfsNode, data []byte) ([]byte, error) // 返回创建的资源ID
|
||||
|
||||
// Update 更新后端服务资源
|
||||
Update(servicePath string, node *models.VfsNode, data []byte) error
|
||||
|
||||
// Delete 删除后端服务资源
|
||||
Delete(servicePath string, node *models.VfsNode) error
|
||||
|
||||
// GetName 获取代理名称
|
||||
GetName() string
|
||||
}
|
||||
|
||||
// ProxyEntry 代理表条目
|
||||
type ProxyEntry struct {
|
||||
Name string
|
||||
MatchExt string
|
||||
Proxy ServiceProxy // 对应的代理实现
|
||||
}
|
||||
|
||||
type ProxyService struct {
|
||||
Proxies []*ProxyEntry
|
||||
proxyMutex sync.RWMutex
|
||||
}
|
||||
|
||||
func NewProxyService() *ProxyService {
|
||||
return &ProxyService{
|
||||
Proxies: make([]*ProxyEntry, 0),
|
||||
proxyMutex: sync.RWMutex{},
|
||||
}
|
||||
}
|
||||
|
||||
// FindProxyByServiceName 根据服务节点名称查找对应的代理
|
||||
func (s *ProxyService) findProxyByServiceName(serviceName string) ServiceProxy {
|
||||
s.proxyMutex.RLock()
|
||||
defer s.proxyMutex.RUnlock()
|
||||
|
||||
if serviceName == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 根据服务名称匹配前缀
|
||||
for _, entry := range s.Proxies {
|
||||
if entry.MatchExt == serviceName {
|
||||
return entry.Proxy
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ProxyService) RegisterProxy(entry *ProxyEntry) {
|
||||
s.proxyMutex.Lock()
|
||||
defer s.proxyMutex.Unlock()
|
||||
|
||||
s.Proxies = append(s.Proxies, entry)
|
||||
}
|
||||
|
||||
func (s *ProxyService) StrictProxy2Service(method string, data []byte, node *models.VfsNode) ([]byte, error) {
|
||||
if node.Type != models.VfsNodeTypeService {
|
||||
return nil, fmt.Errorf("node is not a service")
|
||||
}
|
||||
exts := strings.Split(node.Name, ".")
|
||||
var serviceName = exts[1]
|
||||
// log.Println("Proxy2Service: ", serviceName)
|
||||
// 查找对应的代理
|
||||
proxy := s.findProxyByServiceName(serviceName)
|
||||
if proxy == nil {
|
||||
return nil, fmt.Errorf("service proxy not found for: %s", serviceName)
|
||||
}
|
||||
|
||||
// 根据HTTP方法调用相应的代理方法
|
||||
switch method {
|
||||
case http.MethodGet:
|
||||
result, err := proxy.Get(serviceName, node)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get service data: %v", err)
|
||||
}
|
||||
return result, nil
|
||||
case http.MethodPost:
|
||||
// 读取请求体数据
|
||||
result, err := proxy.Create(serviceName, node, data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create service resource: %v", err)
|
||||
}
|
||||
return result, nil
|
||||
case http.MethodPut, http.MethodPatch:
|
||||
// 读取请求体数据
|
||||
err := proxy.Update(serviceName, node, data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to update service resource: %v", err)
|
||||
}
|
||||
return nil, nil
|
||||
case http.MethodDelete:
|
||||
err := proxy.Delete(serviceName, node)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to delete service resource: %v", err)
|
||||
}
|
||||
return nil, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("method not allowed")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user