Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

133 строки
3.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/api/response"
  9. "github.com/AFASystems/presence/internal/pkg/model"
  10. "github.com/gorilla/mux"
  11. "github.com/segmentio/kafka-go"
  12. "gorm.io/gorm"
  13. )
  14. func SendKafkaMessage(writer *kafka.Writer, value *model.ApiUpdate, context context.Context) error {
  15. valueStr, err := json.Marshal(&value)
  16. if err != nil {
  17. msg := fmt.Sprintf("error in encoding: %v", err)
  18. slog.Error(msg)
  19. return err
  20. }
  21. msg := kafka.Message{
  22. Value: valueStr,
  23. }
  24. if err := writer.WriteMessages(context, msg); err != nil {
  25. msg := fmt.Sprintf("Error in sending kafka message: %v", err)
  26. slog.Error(msg)
  27. return err
  28. }
  29. return nil
  30. }
  31. func TrackerAdd(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  32. return func(w http.ResponseWriter, r *http.Request) {
  33. var tracker model.Tracker
  34. if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil {
  35. response.BadRequest(w, "invalid request body")
  36. return
  37. }
  38. if err := db.WithContext(context).Create(&tracker).Error; err != nil {
  39. response.InternalError(w, "failed to create tracker", err)
  40. return
  41. }
  42. apiUpdate := model.ApiUpdate{
  43. Method: "POST",
  44. ID: tracker.ID,
  45. MAC: tracker.MAC,
  46. }
  47. if err := SendKafkaMessage(writer, &apiUpdate, context); err != nil {
  48. slog.Error("error sending Kafka POST message", "err", err)
  49. response.InternalError(w, "failed to publish tracker update", err)
  50. return
  51. }
  52. response.JSON(w, http.StatusCreated, map[string]string{"status": "created"})
  53. }
  54. }
  55. func TrackerList(db *gorm.DB, context context.Context) http.HandlerFunc {
  56. return func(w http.ResponseWriter, r *http.Request) {
  57. var list []model.Tracker
  58. if err := db.WithContext(context).Find(&list).Error; err != nil {
  59. response.InternalError(w, "failed to list trackers", err)
  60. return
  61. }
  62. response.JSON(w, http.StatusOK, list)
  63. }
  64. }
  65. func TrackerUpdate(db *gorm.DB, context context.Context) http.HandlerFunc {
  66. return func(w http.ResponseWriter, r *http.Request) {
  67. var tracker model.Tracker
  68. if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil {
  69. response.BadRequest(w, "invalid request body")
  70. return
  71. }
  72. id := tracker.ID
  73. if err := db.WithContext(context).First(&model.Tracker{}, "id = ?", id).Error; err != nil {
  74. response.NotFound(w, "tracker not found")
  75. return
  76. }
  77. if err := db.WithContext(context).Save(&tracker).Error; err != nil {
  78. response.InternalError(w, "failed to update tracker", err)
  79. return
  80. }
  81. response.JSON(w, http.StatusOK, map[string]string{"status": "updated"})
  82. }
  83. }
  84. func TrackerDelete(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  85. return func(w http.ResponseWriter, r *http.Request) {
  86. id := mux.Vars(r)["id"]
  87. var tracker model.Tracker
  88. if err := db.WithContext(context).First(&tracker, "id = ?", id).Error; err != nil {
  89. response.NotFound(w, "tracker not found")
  90. return
  91. }
  92. res := db.WithContext(context).Delete(&model.Tracker{}, "id = ?", id)
  93. if res.RowsAffected == 0 {
  94. response.NotFound(w, "tracker not found")
  95. return
  96. }
  97. if res.Error != nil {
  98. response.InternalError(w, "failed to delete tracker", res.Error)
  99. return
  100. }
  101. apiUpdate := model.ApiUpdate{
  102. Method: "DELETE",
  103. MAC: tracker.MAC,
  104. }
  105. slog.Info("sending DELETE tracker message", "id", id)
  106. if err := SendKafkaMessage(writer, &apiUpdate, context); err != nil {
  107. slog.Error("error sending Kafka DELETE message", "err", err)
  108. response.InternalError(w, "failed to publish tracker deletion", err)
  109. return
  110. }
  111. response.JSON(w, http.StatusOK, map[string]string{"status": "deleted"})
  112. }
  113. }