package controller import ( "context" "encoding/json" "log/slog" "net/http" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/model" "github.com/segmentio/kafka-go" "gorm.io/gorm" ) func SettingsListController(db *gorm.DB, context context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var settings []model.Settings if err := db.WithContext(context).Find(&settings).Error; err != nil { response.InternalError(w, "failed to list settings", err) return } response.JSON(w, http.StatusOK, settings) } } func SettingsUpdateController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var updates map[string]any if err := json.NewDecoder(r.Body).Decode(&updates); err != nil { response.BadRequest(w, "invalid request body") return } slog.Info("updating settings", "updates", updates) if err := db.WithContext(context).Model(&model.Settings{}).Where("id = ?", 1).Updates(updates).Error; err != nil { response.InternalError(w, "failed to update settings", err) return } eMsg, err := json.Marshal(updates) if err != nil { response.InternalError(w, "failed to marshal settings for publish", err) return } kafkaMsg := kafka.Message{Value: eMsg} if err := writer.WriteMessages(context, kafkaMsg); err != nil { slog.Error("writing settings to Kafka", "err", err) response.InternalError(w, "failed to publish settings update", err) return } response.JSON(w, http.StatusOK, map[string]string{"status": "updated"}) } }