You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

69 lines
1.6 KiB

  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "log/slog"
  7. "net/http"
  8. "github.com/AFASystems/presence/internal/pkg/model"
  9. "github.com/segmentio/kafka-go"
  10. "gorm.io/gorm"
  11. )
  12. func SettingsListController(db *gorm.DB) http.HandlerFunc {
  13. return func(w http.ResponseWriter, r *http.Request) {
  14. var settings []model.Settings
  15. db.Find(&settings)
  16. res, err := json.Marshal(settings)
  17. if err != nil {
  18. http.Error(w, err.Error(), 400)
  19. return
  20. }
  21. w.Write(res)
  22. }
  23. }
  24. func SettingsUpdateController(db *gorm.DB, writer *kafka.Writer, ctx context.Context) http.HandlerFunc {
  25. return func(w http.ResponseWriter, r *http.Request) {
  26. var updates map[string]any
  27. if err := json.NewDecoder(r.Body).Decode(&updates); err != nil {
  28. http.Error(w, "Invalid JSON", 400)
  29. return
  30. }
  31. inMsg := fmt.Sprintf("updates: %+v", updates)
  32. slog.Info(inMsg)
  33. if err := db.Model(&model.Settings{}).Where("id = ?", 1).Updates(updates).Error; err != nil {
  34. msg := fmt.Sprintf("Error in updating settings: %v", err)
  35. slog.Error(msg)
  36. http.Error(w, err.Error(), 500)
  37. return
  38. }
  39. eMsg, err := json.Marshal(updates)
  40. if err != nil {
  41. http.Error(w, "Error in marshaling settings updates", 400)
  42. msg := fmt.Sprintf("Error in marshaling settings updates: %v", err)
  43. slog.Error(msg)
  44. return
  45. }
  46. msg := kafka.Message{
  47. Value: eMsg,
  48. }
  49. if err := writer.WriteMessages(ctx, msg); err != nil {
  50. slog.Error("writing settings to Kafka", "err", err)
  51. http.Error(w, "Failed to publish settings update", 500)
  52. return
  53. }
  54. w.Header().Set("Content-Type", "application/json")
  55. w.Write([]byte(`{"status":"Settings updated"}`))
  56. }
  57. }