package handlers import ( "context" "encoding/json" "fmt" "github.com/bnema/dumber/internal/application/dto" "github.com/bnema/dumber/internal/application/port" "github.com/bnema/dumber/internal/logging" ) // ConfigHandler handles configuration-related messages. type ConfigHandler struct { saveConfig func(context.Context, dto.WebUIConfig) error } // NewConfigHandler creates a new ConfigHandler. // saveConfig is called to persist config changes (typically usecase.SaveWebUIConfigUseCase.Execute). func NewConfigHandler(saveConfig func(context.Context, dto.WebUIConfig) error) *ConfigHandler { if saveConfig == nil { panic("NewConfigHandler: saveConfig must not be nil") } return &ConfigHandler{saveConfig: saveConfig} } // Handle processes the save_config message. func (h *ConfigHandler) Handle(ctx context.Context, viewID port.WebViewID, payload json.RawMessage) (any, error) { if h == nil { return nil, fmt.Errorf("config handler is nil") } if h.saveConfig == nil { return nil, fmt.Errorf("config handler: saveConfig not initialized") } log := logging.FromContext(ctx).With().Str("handler", "config").Logger() var payloadCfg dto.WebUIConfig if err := json.Unmarshal(payload, &payloadCfg); err != nil { log.Error().Err(err).Msg("failed to unmarshal config payload") return nil, fmt.Errorf("invalid config format: %w", err) } source := "webui" if viewID != 0 { source = fmt.Sprintf("webview:%d", viewID) } log.Info().Str("source", source).Msg("saving appearance configuration") if err := h.saveConfig(ctx, payloadCfg); err != nil { log.Error().Err(err).Msg("failed to save config") return nil, fmt.Errorf("failed to save config: %w", err) } return map[string]any{"status": "success"}, nil } // RegisterConfigHandlers registers configuration handlers with the router. func RegisterConfigHandlers( ctx context.Context, router port.WebUIHandlerRouter, saveConfig func(context.Context, dto.WebUIConfig) error, ) error { handler := NewConfigHandler(saveConfig) log := logging.FromContext(ctx).With().Str("component", "handlers").Logger() if err := router.RegisterHandlerWithCallbacks( "save_config", "__dumber_config_saved", "__dumber_config_error", "", handler, ); err != nil { return err } log.Info().Msg("registered save_config handler") return nil }