Files
voidraft/internal/services/config_service.go
2025-04-30 01:52:30 +08:00

229 lines
5.3 KiB
Go

package services
import (
"fmt"
"os"
"path/filepath"
"time"
"voidraft/internal/models"
"github.com/wailsapp/wails/v3/pkg/services/log"
)
// ConfigService 提供配置管理功能
type ConfigService struct {
store *Store[models.AppConfig]
homePath string
configPath string
logger *log.LoggerService
}
type Service struct{}
// NewConfigService 创建新的配置服务实例
func NewConfigService() *ConfigService {
// 初始化日志服务
logger := log.New()
// 获取用户主目录
homePath, err := os.UserHomeDir()
if err != nil {
logger.Error("Config: Failed to get user home directory", "error", err)
homePath = "."
}
// 创建默认配置
defaultConfig := models.NewDefaultAppConfig()
// 构建完整的配置文件路径
configFilePath := filepath.Join(homePath, defaultConfig.Paths.RootDir, defaultConfig.Paths.ConfigPath)
// 创建Store选项
storeOption := StoreOption{
FilePath: configFilePath,
AutoSave: true,
Logger: logger,
}
// 创建存储服务
store := NewStore[models.AppConfig](storeOption)
// 构造配置服务实例
service := &ConfigService{
store: store,
homePath: homePath,
configPath: configFilePath,
logger: logger,
}
// 检查是否需要设置默认配置
config := store.Get()
if isEmptyConfig(config) {
err := store.Set(*defaultConfig)
if err != nil {
logger.Error("Config: Failed to set default config", "error", err)
}
}
return service
}
// isEmptyConfig 检查配置是否为空
func isEmptyConfig(config models.AppConfig) bool {
// 检查基本字段
if config.Editor.FontSize == 0 && config.Paths.RootDir == "" {
return true
}
return false
}
// GetConfig 获取完整应用配置
func (cs *ConfigService) GetConfig() (*models.AppConfig, error) {
config := cs.store.Get()
// 如果配置为空,返回默认配置
if isEmptyConfig(config) {
defaultConfig := models.NewDefaultAppConfig()
if err := cs.store.Set(*defaultConfig); err != nil {
cs.logger.Error("Config: Failed to save default config", "error", err)
}
return defaultConfig, nil
}
return &config, nil
}
// SaveConfig 保存完整应用配置
func (cs *ConfigService) SaveConfig(config *models.AppConfig) error {
// 更新配置元数据
config.Metadata.LastUpdated = time.Now()
return cs.store.Set(*config)
}
// ResetConfig 重置为默认配置
func (cs *ConfigService) ResetConfig() error {
defaultConfig := models.NewDefaultAppConfig()
err := cs.store.Set(*defaultConfig)
if err != nil {
cs.logger.Error("Config: Failed to save default config", "error", err)
return fmt.Errorf("failed to reset config: %w", err)
}
return nil
}
// GetEditorConfig 获取编辑器配置
func (cs *ConfigService) GetEditorConfig() (models.EditorConfig, error) {
config, err := cs.GetConfig()
if err != nil {
return models.EditorConfig{}, err
}
return config.Editor, nil
}
// UpdateEditorConfig 更新编辑器配置
func (cs *ConfigService) UpdateEditorConfig(editorConfig models.EditorConfig) error {
// 获取当前配置
config, err := cs.GetConfig()
if err != nil {
return err
}
// 更新编辑器配置
config.Editor = editorConfig
config.Metadata.LastUpdated = time.Now()
// 保存更新后的配置
return cs.store.Set(*config)
}
// GetLanguage 获取当前语言设置
func (cs *ConfigService) GetLanguage() (models.LanguageType, error) {
editorConfig, err := cs.GetEditorConfig()
if err != nil {
return "", err
}
return editorConfig.Language, nil
}
// SetLanguage 设置语言
func (cs *ConfigService) SetLanguage(language models.LanguageType) error {
// 验证语言类型有效
if language != models.LangZhCN && language != models.LangEnUS {
return fmt.Errorf("unsupported language: %s", language)
}
// 获取当前配置
config, err := cs.GetConfig()
if err != nil {
return err
}
// 更新语言设置
config.Editor.Language = language
config.Metadata.LastUpdated = time.Now()
// 保存更新后的配置
return cs.store.Set(*config)
}
// GetPathConfig 获取路径配置
func (cs *ConfigService) GetPathConfig() (models.PathConfig, error) {
config, err := cs.GetConfig()
if err != nil {
return models.PathConfig{}, err
}
return config.Paths, nil
}
// UpdatePathConfig 更新路径配置
func (cs *ConfigService) UpdatePathConfig(pathConfig models.PathConfig) error {
// 获取当前配置
config, err := cs.GetConfig()
if err != nil {
return err
}
// 更新路径配置
config.Paths = pathConfig
config.Metadata.LastUpdated = time.Now()
// 保存更新后的配置
return cs.store.Set(*config)
}
// GetMetadata 获取配置元数据
func (cs *ConfigService) GetMetadata() (models.ConfigMetadata, error) {
config, err := cs.GetConfig()
if err != nil {
return models.ConfigMetadata{}, err
}
return config.Metadata, nil
}
// UpdateMetadata 更新配置元数据
func (cs *ConfigService) UpdateMetadata(metadata models.ConfigMetadata) error {
// 获取当前配置
config, err := cs.GetConfig()
if err != nil {
return err
}
// 更新元数据
config.Metadata = metadata
config.Metadata.LastUpdated = time.Now()
// 保存更新后的配置
return cs.store.Set(*config)
}
// OnShutdown 服务关闭时调用
func (cs *ConfigService) OnShutdown() error {
// 如果有未保存的更改,保存数据
if cs.store.HasUnsavedChanges() {
return cs.store.Save()
}
return nil
}