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.
 
 
 
 

124 lines
2.8 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/gorilla/mux"
  10. "github.com/segmentio/kafka-go"
  11. "gorm.io/gorm"
  12. )
  13. func SendKafkaMessage(writer *kafka.Writer, value *model.ApiUpdate, ctx context.Context) error {
  14. valueStr, err := json.Marshal(&value)
  15. if err != nil {
  16. msg := fmt.Sprintf("error in encoding: %v", err)
  17. slog.Error(msg)
  18. return err
  19. }
  20. msg := kafka.Message{
  21. Value: valueStr,
  22. }
  23. if err := writer.WriteMessages(ctx, msg); err != nil {
  24. msg := fmt.Sprintf("Error in sending kafka message: %v", err)
  25. slog.Error(msg)
  26. return err
  27. }
  28. return nil
  29. }
  30. func TrackerAdd(db *gorm.DB, writer *kafka.Writer, ctx context.Context) http.HandlerFunc {
  31. return func(w http.ResponseWriter, r *http.Request) {
  32. var tracker model.Tracker
  33. if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil {
  34. http.Error(w, err.Error(), 400)
  35. return
  36. }
  37. db.Create(&tracker)
  38. apiUpdate := model.ApiUpdate{
  39. Method: "POST",
  40. ID: tracker.ID,
  41. MAC: tracker.MAC,
  42. }
  43. if err := SendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  44. msg := "error in sending Kafka POST message"
  45. slog.Error(msg)
  46. http.Error(w, "Error in sending kafka message", 500)
  47. return
  48. }
  49. w.Write([]byte("ok"))
  50. }
  51. }
  52. func TrackerList(db *gorm.DB) http.HandlerFunc {
  53. return func(w http.ResponseWriter, r *http.Request) {
  54. var list []model.Tracker
  55. db.Find(&list)
  56. json.NewEncoder(w).Encode(list)
  57. }
  58. }
  59. func TrackerUpdate(db *gorm.DB) http.HandlerFunc {
  60. return func(w http.ResponseWriter, r *http.Request) {
  61. var tracker model.Tracker
  62. if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil {
  63. http.Error(w, "Invalid JSON", 400)
  64. return
  65. }
  66. id := tracker.ID
  67. if err := db.First(&model.Tracker{}, "id = ?", id).Error; err != nil {
  68. http.Error(w, err.Error(), 400)
  69. return
  70. }
  71. if err := db.Save(&tracker).Error; err != nil {
  72. http.Error(w, err.Error(), 500)
  73. return
  74. }
  75. w.Write([]byte("ok"))
  76. }
  77. }
  78. func TrackerDelete(db *gorm.DB, writer *kafka.Writer, ctx context.Context) http.HandlerFunc {
  79. return func(w http.ResponseWriter, r *http.Request) {
  80. id := mux.Vars(r)["id"]
  81. var tracker model.Tracker
  82. db.Find(&tracker, "id = ?", id)
  83. if res := db.Delete(&model.Tracker{}, "id = ?", id); res.RowsAffected == 0 {
  84. http.Error(w, "no tracker with such ID found", 400)
  85. return
  86. }
  87. apiUpdate := model.ApiUpdate{
  88. Method: "DELETE",
  89. MAC: tracker.MAC,
  90. }
  91. msg := fmt.Sprintf("Sending DELETE tracker id: %s message", id)
  92. slog.Info(msg)
  93. if err := SendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  94. msg := "error in sending Kafka DELETE message"
  95. slog.Error(msg)
  96. http.Error(w, "Error in sending kafka message", 500)
  97. return
  98. }
  99. w.Write([]byte("ok"))
  100. }
  101. }