package main import ( "errors" "fmt" "log" "log/slog" "net/http" "os" "time" "gitea.henriburau.de/haw-lan/cod4watcher/models" "gitea.henriburau.de/haw-lan/cod4watcher/routes" "gitea.henriburau.de/haw-lan/cod4watcher/services" "github.com/go-chi/chi" "github.com/joho/godotenv" ) func main() { if err := godotenv.Load(); err != nil { if errors.Is(err, os.ErrNotExist) { slog.Info(".env not found using env") } else { log.Fatal(err) } } router := chi.NewMux() persistence, err := models.NewSQLitePersistence(os.Getenv("DB_LOC")) if err != nil { log.Fatal(err) } cs := services.NewCaptureService(persistence) cod4StatusProvider := &models.CoD4UdpClient{} cachedProvider, err := models.NewCachedProvider(cod4StatusProvider) if err != nil { log.Fatal(err) } cod4Service, err := services.NewCoD4Server(cachedProvider) if err != nil { log.Fatal(err) } server := routes.NewServer(cs, cod4Service) doneChan := make(chan bool) scanner, err := services.NewScanner(persistence, cachedProvider, time.Second*10, doneChan) if err != nil { log.Fatal(err) } go scanner.Scan() router.Use(routes.LogMiddleware, routes.PathMiddleware, routes.AuthMiddleware) router.Handle("/*", public()) router.Get("/health", routes.Make(server.HandleHealth)) router.Get("/server/status", routes.Make(server.HandleServerStatus)) router.Get("/captures/{captureID}", routes.Make(server.HandleCapture)) router.Get("/captures/{captureID}/table", routes.Make(server.HandleCaptureTable)) router.Get("/login", routes.Make(server.HandleLogin)) router.Get("/logout", routes.Make(server.HandleLogout)) router.Group(func(r chi.Router) { r.Use(routes.OnlyAuthenticatedMiddleware) r.Delete("/captures/{captureID}", routes.Make(server.HandleCaptureDelete)) r.Get("/captures/{captureID}/start", routes.Make(server.HandleCaptureStart)) r.Get("/captures/{captureID}/stop", routes.Make(server.HandleCaptureStop)) r.Post("/new/capture", routes.Make(server.HandleCaptureCreate)) r.Get("/new/capture", routes.Make(server.HandleCaptureForm)) r.Post("/captures/{captureID}/mapscore/{mapscoreID}/counted/{counted}", routes.Make(server.HandleUpdateMapScoreCounted)) }) router.Post("/signin", routes.Make(server.HandleSignin)) router.Get("/", routes.Make(server.HandleHome)) listenAddr := os.Getenv("LISTEN_ADDR") slog.Info("HTTP server started", "listenAddr", listenAddr) http.ListenAndServe(listenAddr, router) } func public() http.Handler { fmt.Println("building static files for development") return http.StripPrefix("/assets/", http.FileServerFS(os.DirFS("assets"))) }