Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

90 wiersze
3.2 KiB

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "os/signal"
  7. "sync"
  8. "syscall"
  9. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  10. "github.com/AFASystems/presence/internal/pkg/config"
  11. "github.com/AFASystems/presence/internal/pkg/controller"
  12. "github.com/AFASystems/presence/internal/pkg/kafkaclient"
  13. "github.com/AFASystems/presence/internal/pkg/model"
  14. "github.com/AFASystems/presence/internal/pkg/service"
  15. "github.com/gorilla/handlers"
  16. "github.com/gorilla/mux"
  17. )
  18. var wg sync.WaitGroup
  19. func main() {
  20. cfg := config.Load()
  21. appState := appcontext.NewAppState()
  22. // define context
  23. ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
  24. defer stop()
  25. headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
  26. originsOk := handlers.AllowedOrigins([]string{"*"})
  27. methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})
  28. writer := appState.AddKafkaWriter(cfg.KafkaURL, "apibeacons")
  29. settingsWriter := appState.AddKafkaWriter(cfg.KafkaURL, "settings")
  30. locationReader := appState.AddKafkaReader(cfg.KafkaURL, "locevents", "gid-loc-server")
  31. alertsReader := appState.AddKafkaReader(cfg.KafkaURL, "alertbeacons", "gid-alert-serv")
  32. client := appState.AddValkeyClient(cfg.ValkeyURL)
  33. // Need Lua script to pull all of the beacons in one go on init
  34. chLoc := make(chan model.HTTPLocation, 200)
  35. chEvents := make(chan model.BeaconEvent, 500)
  36. wg.Add(2)
  37. go kafkaclient.Consume(locationReader, chLoc, ctx, &wg)
  38. go kafkaclient.Consume(alertsReader, chEvents, ctx, &wg)
  39. r := mux.NewRouter()
  40. // For now just add beacon DELETE / GET / POST / PUT methods
  41. r.HandleFunc("/api/beacons/{beacon_id}", controller.BeaconsDeleteController(writer, ctx)).Methods("DELETE")
  42. r.HandleFunc("/api/beacons", controller.BeaconsListController(appState)).Methods("GET")
  43. r.HandleFunc("/api/beacons/{beacon_id}", controller.BeaconsListSingleController(appState)).Methods("GET")
  44. r.HandleFunc("/api/beacons", controller.BeaconsAddController(writer, ctx)).Methods("POST")
  45. r.HandleFunc("/api/beacons", controller.BeaconsAddController(writer, ctx)).Methods("PUT")
  46. r.HandleFunc("/api/settings", controller.SettingsListController(appState, client, ctx)).Methods("GET")
  47. r.HandleFunc("/api/settings", controller.SettingsEditController(settingsWriter, appState, client, ctx)).Methods("POST")
  48. http.ListenAndServe(cfg.HTTPAddr, handlers.CORS(originsOk, headersOk, methodsOk)(r))
  49. eventLoop:
  50. for {
  51. select {
  52. case <-ctx.Done():
  53. break eventLoop
  54. case msg := <-chLoc:
  55. if err := service.LocationToBeaconService(msg, appState, client, ctx); err != nil {
  56. fmt.Printf("Error in writing location change to beacon: %v\n", err)
  57. }
  58. case msg := <-chEvents:
  59. if err := service.EventToBeaconService(msg, appState, client, ctx); err != nil {
  60. fmt.Printf("Error in writing event change to beacon: %v\n", err)
  61. }
  62. }
  63. }
  64. fmt.Println("broken out of the main event loop")
  65. wg.Wait()
  66. fmt.Println("All go routines have stopped, Beggining to close Kafka connections")
  67. appState.CleanKafkaReaders()
  68. appState.CleanKafkaWriters()
  69. fmt.Println("All kafka clients shutdown, starting shutdown of valkey client")
  70. appState.CleanValkeyClient()
  71. }