Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

58 linhas
1.7 KiB

  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "log/slog"
  6. "net/http"
  7. "github.com/AFASystems/presence/internal/pkg/api/response"
  8. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  9. "github.com/AFASystems/presence/internal/pkg/kafkaclient"
  10. "github.com/segmentio/kafka-go"
  11. "gorm.io/gorm"
  12. )
  13. func SettingsListController(db *gorm.DB, context context.Context) http.HandlerFunc {
  14. return func(w http.ResponseWriter, r *http.Request) {
  15. var settings []appcontext.Settings
  16. if err := db.WithContext(context).Find(&settings).Error; err != nil {
  17. response.InternalError(w, "failed to list settings", err)
  18. return
  19. }
  20. response.JSON(w, http.StatusOK, settings)
  21. }
  22. }
  23. func SettingsUpdateController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  24. return func(w http.ResponseWriter, r *http.Request) {
  25. var updates map[string]any
  26. if err := json.NewDecoder(r.Body).Decode(&updates); err != nil {
  27. response.BadRequest(w, "invalid request body")
  28. return
  29. }
  30. slog.Info("updating settings", "updates", updates)
  31. if err := db.WithContext(context).Model(&appcontext.Settings{}).Where("id = ?", 1).Updates(updates).Error; err != nil {
  32. response.InternalError(w, "failed to update settings", err)
  33. return
  34. }
  35. eMsg, err := json.Marshal(updates)
  36. if err != nil {
  37. response.InternalError(w, "failed to marshal settings for publish", err)
  38. return
  39. }
  40. kafkaMsg := kafka.Message{Value: eMsg}
  41. if err := kafkaclient.Write(context, writer, kafkaMsg); err != nil {
  42. slog.Error("error writing settings to Kafka", "error", err)
  43. response.InternalError(w, "failed to publish settings update", err)
  44. return
  45. }
  46. response.JSON(w, http.StatusOK, map[string]string{"status": "updated"})
  47. }
  48. }