Private
Public Access
1
0
Files
u-desk/internal/api/config_api.go
绝尘 d7de60b02c 发布:版本 0.3.0
- Markdown Mermaid 图表支持(10+ 种图表类型)
- 代码语法高亮(20+ 种常用编程语言)
- 文件列表优化(文件夹优先显示)
- 文件系统模块化重构
- 新增内部更新日志 CHANGELOG.internal.md
- 更新作者邮箱
2026-02-04 11:12:24 +08:00

183 lines
4.3 KiB
Go

package api
import (
"fmt"
"u-desk/internal/service"
)
// ConfigAPI 配置 API
type ConfigAPI struct {
configService *service.ConfigService
}
// NewConfigAPI 创建配置 API 实例
func NewConfigAPI() (*ConfigAPI, error) {
configService, err := service.NewConfigService()
if err != nil {
return nil, err
}
return &ConfigAPI{
configService: configService,
}, nil
}
// GetAppConfigResponse 获取应用配置响应
type GetAppConfigResponse struct {
Tabs []AppTabDefinition `json:"tabs"`
VisibleTabs []string `json:"visibleTabs"`
DefaultTab string `json:"defaultTab"`
}
// AppTabDefinition 应用 Tab 定义(前端格式)
type AppTabDefinition struct {
Key string `json:"key"`
Title string `json:"title"`
Visible bool `json:"visible"`
Enabled bool `json:"enabled"`
}
// SaveAppConfigRequest 保存应用配置请求(前端格式)
type SaveAppConfigRequest struct {
Tabs []AppTabDefinition `json:"tabs"`
VisibleTabs []string `json:"visibleTabs"`
DefaultTab string `json:"defaultTab"`
}
// GetAppConfig 获取应用配置
func (api *ConfigAPI) GetAppConfig() (map[string]interface{}, error) {
tabConfig, err := api.configService.GetTabConfig()
if err != nil {
return map[string]interface{}{
"success": false,
"message": fmt.Sprintf("获取配置失败: %v", err),
}, err
}
// 转换为前端格式
tabs := make([]AppTabDefinition, len(tabConfig.AvailableTabs))
visibleTabSet := make(map[string]bool)
for _, key := range tabConfig.VisibleTabs {
visibleTabSet[key] = true
}
for i, tab := range tabConfig.AvailableTabs {
tabs[i] = AppTabDefinition{
Key: tab.Key,
Title: tab.Title,
Visible: visibleTabSet[tab.Key],
Enabled: tab.Enabled,
}
}
return map[string]interface{}{
"success": true,
"data": GetAppConfigResponse{
Tabs: tabs,
VisibleTabs: tabConfig.VisibleTabs,
DefaultTab: tabConfig.DefaultTab,
},
}, nil
}
// SaveAppConfig 保存应用配置
func (api *ConfigAPI) SaveAppConfig(req SaveAppConfigRequest) (map[string]interface{}, error) {
// 验证:至少保留一个可见 Tab
if len(req.VisibleTabs) < 1 {
return map[string]interface{}{
"success": false,
"message": "至少需要保留一个可见的 Tab",
}, fmt.Errorf("至少需要保留一个可见的 Tab")
}
// 验证:默认 Tab 必须在可见列表中
defaultTabExists := false
for _, key := range req.VisibleTabs {
if key == req.DefaultTab {
defaultTabExists = true
break
}
}
if !defaultTabExists {
return map[string]interface{}{
"success": false,
"message": "默认 Tab 必须在可见列表中",
}, fmt.Errorf("默认 Tab 必须在可见列表中")
}
// 转换为服务层格式
availableTabs := make([]service.TabDefinition, len(req.Tabs))
for i, tab := range req.Tabs {
availableTabs[i] = service.TabDefinition{
Key: tab.Key,
Title: tab.Title,
Enabled: tab.Enabled,
}
}
tabConfig := &service.TabConfig{
AvailableTabs: availableTabs,
VisibleTabs: req.VisibleTabs,
DefaultTab: req.DefaultTab,
}
// 保存配置
if err := api.configService.SaveTabConfig(tabConfig); err != nil {
return map[string]interface{}{
"success": false,
"message": fmt.Sprintf("保存配置失败: %v", err),
}, err
}
return map[string]interface{}{
"success": true,
"message": "配置保存成功",
"data": nil,
}, nil
}
// MigrateTabConfig 迁移旧配置
func (api *ConfigAPI) MigrateTabConfig() error {
config, _ := api.configService.GetTabConfig()
if config == nil {
return nil
}
// 检查是否包含 device
hasDevice := false
for _, tab := range config.AvailableTabs {
if tab.Key == "device" {
hasDevice = true
break
}
}
if !hasDevice {
return nil
}
// 过滤掉 device
newTabs := make([]service.TabDefinition, 0, len(config.AvailableTabs))
newVisible := make([]string, 0, len(config.VisibleTabs))
for _, tab := range config.AvailableTabs {
if tab.Key != "device" {
newTabs = append(newTabs, tab)
}
}
for _, key := range config.VisibleTabs {
if key != "device" {
newVisible = append(newVisible, key)
}
}
defaultTab := config.DefaultTab
if defaultTab == "device" {
defaultTab = "file-system"
}
return api.configService.SaveTabConfig(&service.TabConfig{
AvailableTabs: newTabs,
VisibleTabs: newVisible,
DefaultTab: defaultTab,
})
}