Files
zzyxyz_go_api/internal/vfs/vfs_service.go
zzy b2cc27b8f5 refactor(bookmark): 重构 bookmark 服务生成配置和内部引用
将 bookmark 和 user_np 服务的生成配置分离为 server 和 client 包,
并更新了相应的导入路径。同时更新了 OpenAPI 配置文件中的包名、输出路径及
启用 strict-server 模式以增强类型安全。

此外,同步更新了 VFS 服务的客户端和服务端生成配置,并完善了其 OpenAPI
错误响应定义与二进制内容支持,增强了 API 的规范性和健壮性。

修复了部分权限校验逻辑,并调整了中间件注册方式以适配新的严格模式接口。
2025-09-25 16:15:34 +08:00

104 lines
2.6 KiB
Go

package vfs
import (
"fmt"
"net/http"
"strings"
"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 // 对应的代理实现
}
// FindProxyByServiceName 根据服务节点名称查找对应的代理
func (v *VfsImpl) FindProxyByServiceName(serviceName string) ServiceProxy {
v.proxyMutex.RLock()
defer v.proxyMutex.RUnlock()
if serviceName == "" {
return nil
}
// 根据服务名称匹配前缀
for _, entry := range v.proxyTable {
if entry.MatchExt == serviceName {
return entry.Proxy
}
}
return nil
}
func (v *VfsImpl) RegisterProxy(entry *ProxyEntry) {
v.proxyMutex.Lock()
defer v.proxyMutex.Unlock()
v.proxyTable = append(v.proxyTable, entry)
}
func (v *VfsImpl) StrictProxy2Service(method string, data []byte, node *models.VfsNode) ([]byte, error) {
exts := strings.Split(node.Name, ".")
var serviceName = exts[1]
// log.Println("Proxy2Service: ", serviceName)
// 查找对应的代理
proxy := v.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")
}
}