|
- package main
-
- import (
- "context"
- "fmt"
- "net/http"
- "os/signal"
- "sync"
- "syscall"
-
- "github.com/AFASystems/presence/internal/pkg/common/appcontext"
- "github.com/AFASystems/presence/internal/pkg/config"
- "github.com/AFASystems/presence/internal/pkg/controller"
- "github.com/AFASystems/presence/internal/pkg/kafkaclient"
- "github.com/AFASystems/presence/internal/pkg/model"
- "github.com/AFASystems/presence/internal/pkg/service"
- "github.com/gorilla/handlers"
- "github.com/gorilla/mux"
- )
-
- var wg sync.WaitGroup
-
- func main() {
- cfg := config.Load()
- appState := appcontext.NewAppState()
-
- // define context
- ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
- defer stop()
-
- headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
- originsOk := handlers.AllowedOrigins([]string{"*"})
- methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})
-
- writer := appState.AddKafkaWriter(cfg.KafkaURL, "apibeacons")
- settingsWriter := appState.AddKafkaWriter(cfg.KafkaURL, "settings")
-
- locationReader := appState.AddKafkaReader(cfg.KafkaURL, "locevents", "gid-loc-server")
- alertsReader := appState.AddKafkaReader(cfg.KafkaURL, "alertbeacons", "gid-alert-serv")
-
- client := appState.AddValkeyClient(cfg.ValkeyURL)
- // Need Lua script to pull all of the beacons in one go on init
-
- chLoc := make(chan model.HTTPLocation, 200)
- chEvents := make(chan model.BeaconEvent, 500)
-
- wg.Add(2)
- go kafkaclient.Consume(locationReader, chLoc, ctx, &wg)
- go kafkaclient.Consume(alertsReader, chEvents, ctx, &wg)
-
- r := mux.NewRouter()
-
- // For now just add beacon DELETE / GET / POST / PUT methods
- r.HandleFunc("/api/beacons/{beacon_id}", controller.BeaconsDeleteController(writer, ctx)).Methods("DELETE")
- r.HandleFunc("/api/beacons", controller.BeaconsListController(appState)).Methods("GET")
- r.HandleFunc("/api/beacons/{beacon_id}", controller.BeaconsListSingleController(appState)).Methods("GET")
- r.HandleFunc("/api/beacons", controller.BeaconsAddController(writer, ctx)).Methods("POST")
- r.HandleFunc("/api/beacons", controller.BeaconsAddController(writer, ctx)).Methods("PUT")
-
- r.HandleFunc("/api/settings", controller.SettingsListController(appState, client, ctx)).Methods("GET")
- r.HandleFunc("/api/settings", controller.SettingsEditController(settingsWriter, appState, client, ctx)).Methods("POST")
-
- http.ListenAndServe(cfg.HTTPAddr, handlers.CORS(originsOk, headersOk, methodsOk)(r))
-
- eventLoop:
- for {
- select {
- case <-ctx.Done():
- break eventLoop
- case msg := <-chLoc:
- if err := service.LocationToBeaconService(msg, appState, client, ctx); err != nil {
- fmt.Printf("Error in writing location change to beacon: %v\n", err)
- }
- case msg := <-chEvents:
- if err := service.EventToBeaconService(msg, appState, client, ctx); err != nil {
- fmt.Printf("Error in writing event change to beacon: %v\n", err)
- }
- }
- }
-
- fmt.Println("broken out of the main event loop")
- wg.Wait()
-
- fmt.Println("All go routines have stopped, Beggining to close Kafka connections")
- appState.CleanKafkaReaders()
- appState.CleanKafkaWriters()
- fmt.Println("All kafka clients shutdown, starting shutdown of valkey client")
- appState.CleanValkeyClient()
- }
|