config.go RawHistoryFolder
1package handlers
2
3import (
4 "context"
5 "encoding/json"
6 "fmt"
7
8 "github.com/bnema/dumber/internal/application/dto"
9 "github.com/bnema/dumber/internal/application/port"
10 "github.com/bnema/dumber/internal/logging"
11)
12
13// ConfigHandler handles configuration-related messages.
14type ConfigHandler struct {
15 saveConfig func(context.Context, dto.WebUIConfig) error
16}
17
18// NewConfigHandler creates a new ConfigHandler.
19// saveConfig is called to persist config changes (typically usecase.SaveWebUIConfigUseCase.Execute).
20func NewConfigHandler(saveConfig func(context.Context, dto.WebUIConfig) error) *ConfigHandler {
21 if saveConfig == nil {
22 panic("NewConfigHandler: saveConfig must not be nil")
23 }
24 return &ConfigHandler{saveConfig: saveConfig}
25}
26
27// Handle processes the save_config message.
28func (h *ConfigHandler) Handle(ctx context.Context, viewID port.WebViewID, payload json.RawMessage) (any, error) {
29 if h == nil {
30 return nil, fmt.Errorf("config handler is nil")
31 }
32 if h.saveConfig == nil {
33 return nil, fmt.Errorf("config handler: saveConfig not initialized")
34 }
35 log := logging.FromContext(ctx).With().Str("handler", "config").Logger()
36
37 var payloadCfg dto.WebUIConfig
38 if err := json.Unmarshal(payload, &payloadCfg); err != nil {
39 log.Error().Err(err).Msg("failed to unmarshal config payload")
40 return nil, fmt.Errorf("invalid config format: %w", err)
41 }
42
43 source := "webui"
44 if viewID != 0 {
45 source = fmt.Sprintf("webview:%d", viewID)
46 }
47 log.Info().Str("source", source).Msg("saving appearance configuration")
48
49 if err := h.saveConfig(ctx, payloadCfg); err != nil {
50 log.Error().Err(err).Msg("failed to save config")
51 return nil, fmt.Errorf("failed to save config: %w", err)
52 }
53
54 return map[string]any{"status": "success"}, nil
55}
56
57// RegisterConfigHandlers registers configuration handlers with the router.
58func RegisterConfigHandlers(
59 ctx context.Context, router port.WebUIHandlerRouter,
60 saveConfig func(context.Context, dto.WebUIConfig) error,
61) error {
62 handler := NewConfigHandler(saveConfig)
63
64 log := logging.FromContext(ctx).With().Str("component", "handlers").Logger()
65
66 if err := router.RegisterHandlerWithCallbacks(
67 "save_config",
68 "__dumber_config_saved",
69 "__dumber_config_error",
70 "",
71 handler,
72 ); err != nil {
73 return err
74 }
75
76 log.Info().Msg("registered save_config handler")
77
78 return nil
79}