package server import ( "MiauInv/auth" "MiauInv/config" "MiauInv/frontend" "MiauInv/handlers" utils "MiauInv/util" "log" "net/http" "os" ) type Server struct { Port string JWTSecret []byte DatabasePath string CertificatePath string PrivateKeyPath string AllowRegistration bool } func InitServer() *Server { err := config.CheckIfExists() if err != nil { log.Fatal(err) return nil } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) return nil } jwtSecret := os.Getenv("JWT_SECRET") if jwtSecret == "" { log.Fatal("JWT_SECRET environment variable not set.") return nil } if len(jwtSecret) < 32 { log.Fatal("JWT_SECRET must be at least 32 characters long.") return nil } return &Server{ Port: cfg.Port, JWTSecret: []byte(jwtSecret), DatabasePath: cfg.DatabasePath, CertificatePath: cfg.CertificatePath, PrivateKeyPath: cfg.PrivateKeyPath, AllowRegistration: cfg.AllowRegistration, } } func (this *Server) Run() { log.Println("Starting server...") mux := http.NewServeMux() // // FRONTEND // mux.HandleFunc("/", frontend.Home) mux.HandleFunc("/login", utils.RenderFile("frontend/htmx/login.html")) mux.Handle("/dashboard", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(frontend.Dashboard))) mux.Handle("/inventory", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(frontend.Inventory))) mux.Handle("/items", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(frontend.Items))) mux.Handle("/locations", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(frontend.Locations))) mux.Handle("/projects", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(frontend.Projects))) if this.AllowRegistration { mux.HandleFunc("/register", utils.RenderFile("frontend/htmx/register.html")) } else { mux.HandleFunc("/register", utils.RenderFile("frontend/htmx/register_blocked.html")) } // // API // mux.HandleFunc("/api/login", handlers.APILogin) mux.HandleFunc("/api/refresh", handlers.RefreshToken) mux.Handle("/api/logout", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Logout))) if this.AllowRegistration { mux.HandleFunc("/api/register", handlers.APIRegister) } mux.Handle("/api/item", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Item))) mux.Handle("/api/location", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Location))) mux.Handle("/api/project", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Project))) mux.Handle("/api/stock", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Stock))) mux.Handle("/api/association", auth.AuthMiddleware(this.JWTSecret)(http.HandlerFunc(handlers.Associations))) // Assets mux.HandleFunc("/assets/", frontend.Assets) log.Printf("Listening on port %s", this.Port) log.Fatal(http.ListenAndServeTLS(":"+this.Port, this.CertificatePath, this.PrivateKeyPath, mux)) }