您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

115 行
3.0 KiB

  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  9. "github.com/AFASystems/presence/internal/pkg/model"
  10. "github.com/gorilla/mux"
  11. "github.com/segmentio/kafka-go"
  12. )
  13. func BeaconsListSingleController(appstate *appcontext.AppState) http.HandlerFunc {
  14. return func(w http.ResponseWriter, r *http.Request) {
  15. vars := mux.Vars(r)
  16. id := vars["beacon_id"]
  17. beacon, ok := appstate.GetBeacon(id)
  18. if !ok {
  19. w.Header().Set("Content-Type", "application/json")
  20. w.WriteHeader(http.StatusNotFound)
  21. json.NewEncoder(w).Encode(map[string]string{"error": "Beacon not found"})
  22. return
  23. }
  24. w.Header().Set("Content-Type", "application/json")
  25. w.WriteHeader(http.StatusOK)
  26. json.NewEncoder(w).Encode(beacon)
  27. }
  28. }
  29. func BeaconsListController(appstate *appcontext.AppState) http.HandlerFunc {
  30. return func(w http.ResponseWriter, r *http.Request) {
  31. beacons := appstate.GetAllBeacons()
  32. w.Header().Set("Content-Type", "application/json")
  33. w.WriteHeader(http.StatusOK)
  34. json.NewEncoder(w).Encode(beacons)
  35. }
  36. }
  37. // Probably define value as interface and then reuse this writer in all of the functions
  38. func sendKafkaMessage(writer *kafka.Writer, value *model.ApiUpdate, ctx context.Context) error {
  39. valueStr, err := json.Marshal(&value)
  40. if err != nil {
  41. fmt.Println("error in encoding: ", err)
  42. return err
  43. }
  44. msg := kafka.Message{
  45. Value: valueStr,
  46. }
  47. if err := writer.WriteMessages(ctx, msg); err != nil {
  48. fmt.Println("Error in sending kafka message: ", err)
  49. return err
  50. }
  51. return nil
  52. }
  53. func BeaconsDeleteController(writer *kafka.Writer, ctx context.Context) http.HandlerFunc {
  54. return func(w http.ResponseWriter, r *http.Request) {
  55. vars := mux.Vars(r)
  56. beaconId := vars["beacon_id"]
  57. apiUpdate := model.ApiUpdate{
  58. Method: "DELETE",
  59. ID: beaconId,
  60. }
  61. fmt.Printf("Sending DELETE beacon id: %s message\n", beaconId)
  62. if err := sendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  63. fmt.Println("error in sending Kafka DELETE message")
  64. http.Error(w, "Error in sending kafka message", 500)
  65. return
  66. }
  67. w.Write([]byte("ok"))
  68. }
  69. }
  70. func BeaconsAddController(writer *kafka.Writer, ctx context.Context) http.HandlerFunc {
  71. return func(w http.ResponseWriter, r *http.Request) {
  72. decoder := json.NewDecoder(r.Body)
  73. var inBeacon model.Beacon
  74. err := decoder.Decode(&inBeacon)
  75. if err != nil {
  76. http.Error(w, err.Error(), 400)
  77. return
  78. }
  79. if (len(strings.TrimSpace(inBeacon.Name)) == 0) || (len(strings.TrimSpace(inBeacon.ID)) == 0) {
  80. http.Error(w, "name and beacon_id cannot be blank", 400)
  81. return
  82. }
  83. fmt.Printf("sending POST beacon id: %s message\n", inBeacon.ID)
  84. apiUpdate := model.ApiUpdate{
  85. Method: "POST",
  86. Beacon: inBeacon,
  87. }
  88. if err := sendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  89. fmt.Println("error in sending Kafka POST message")
  90. http.Error(w, "Error in sending kafka message", 500)
  91. return
  92. }
  93. w.Write([]byte("ok"))
  94. }
  95. }