package controller import ( "context" "encoding/json" "fmt" "net/http" "github.com/AFASystems/presence/internal/pkg/model" "github.com/gorilla/mux" "github.com/segmentio/kafka-go" "gorm.io/gorm" ) func SendKafkaMessage(writer *kafka.Writer, value *model.ApiUpdate, ctx context.Context) error { valueStr, err := json.Marshal(&value) if err != nil { fmt.Println("error in encoding: ", err) return err } msg := kafka.Message{ Value: valueStr, } if err := writer.WriteMessages(ctx, msg); err != nil { fmt.Println("Error in sending kafka message: ", err) return err } return nil } func TrackerAdd(db *gorm.DB, writer *kafka.Writer, ctx context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var tracker model.Tracker if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil { http.Error(w, err.Error(), 400) return } db.Create(&tracker) apiUpdate := model.ApiUpdate{ Method: "POST", ID: tracker.ID, MAC: tracker.MAC, } if err := SendKafkaMessage(writer, &apiUpdate, ctx); err != nil { fmt.Println("error in sending Kafka POST message") http.Error(w, "Error in sending kafka message", 500) return } w.Write([]byte("ok")) } } func TrackerList(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var list []model.Tracker db.Find(&list) json.NewEncoder(w).Encode(list) } } func TrackerUpdate(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var tracker model.Tracker if err := json.NewDecoder(r.Body).Decode(&tracker); err != nil { http.Error(w, "Invalid JSON", 400) return } id := tracker.ID if err := db.First(&model.Tracker{}, "id = ?", id).Error; err != nil { http.Error(w, err.Error(), 400) return } if err := db.Save(&tracker).Error; err != nil { http.Error(w, err.Error(), 500) return } w.Write([]byte("ok")) } } func TrackerDelete(db *gorm.DB, writer *kafka.Writer, ctx context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] var tracker model.Tracker db.Find(&tracker, "id = ?", id) if res := db.Delete(&model.Tracker{}, "id = ?", id); res.RowsAffected == 0 { http.Error(w, "no tracker with such ID found", 400) return } apiUpdate := model.ApiUpdate{ Method: "Delete", ID: tracker.ID, } fmt.Printf("Sending DELETE tracker id: %s message\n", id) if err := SendKafkaMessage(writer, &apiUpdate, ctx); err != nil { fmt.Println("error in sending Kafka DELETE message") http.Error(w, "Error in sending kafka message", 500) return } w.Write([]byte("ok")) } }