Files
voidraft/internal/services/theme_service.go
2025-12-14 02:19:50 +08:00

105 lines
2.3 KiB
Go

package services
import (
"context"
"fmt"
"strings"
"voidraft/internal/models/ent"
"voidraft/internal/models/ent/theme"
"voidraft/internal/models/schema/mixin"
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/services/log"
)
// ThemeService 主题服务
type ThemeService struct {
db *DatabaseService
logger *log.LogService
}
// NewThemeService 创建主题服务
func NewThemeService(db *DatabaseService, logger *log.LogService) *ThemeService {
if logger == nil {
logger = log.New()
}
return &ThemeService{db: db, logger: logger}
}
// ServiceStartup 服务启动
func (s *ThemeService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
return nil
}
// GetThemeByKey 根据Key获取主题
func (s *ThemeService) GetThemeByKey(ctx context.Context, key string) (*ent.Theme, error) {
trimmed := strings.TrimSpace(key)
if trimmed == "" {
return nil, fmt.Errorf("theme key cannot be empty")
}
t, err := s.db.Client.Theme.Query().
Where(theme.Key(trimmed)).
Only(ctx)
if err != nil {
if ent.IsNotFound(err) {
return nil, nil
}
return nil, fmt.Errorf("get theme error: %w", err)
}
return t, nil
}
// UpdateTheme 保存或更新主题
func (s *ThemeService) UpdateTheme(ctx context.Context, key string, colors map[string]interface{}) error {
trimmed := strings.TrimSpace(key)
if trimmed == "" {
return fmt.Errorf("theme key cannot be empty")
}
if colors == nil {
colors = map[string]interface{}{}
}
// 判断主题类型
themeType := theme.TypeDark
if raw, ok := colors["dark"].(bool); ok && !raw {
themeType = theme.TypeLight
}
existing, err := s.GetThemeByKey(ctx, trimmed)
if err != nil {
return err
}
if existing == nil {
// 插入新主题
_, err = s.db.Client.Theme.Create().
SetKey(trimmed).
SetType(themeType).
SetColors(colors).
Save(ctx)
return err
}
// 更新现有主题
return s.db.Client.Theme.UpdateOneID(existing.ID).
SetType(themeType).
SetColors(colors).
Exec(ctx)
}
// ResetTheme 删除主题
func (s *ThemeService) ResetTheme(ctx context.Context, key string) error {
trimmed := strings.TrimSpace(key)
if trimmed == "" {
return fmt.Errorf("theme key cannot be empty")
}
_, err := s.db.Client.Theme.Delete().
Where(theme.Key(trimmed)).
Exec(mixin.SkipSoftDelete(ctx))
return err
}