package main import ( "embed" "fmt" "io/fs" "log" "net/http" "git.readonly.ch/bouzoure/popvaud-people/controllers" "git.readonly.ch/bouzoure/popvaud-people/helpers" "git.readonly.ch/bouzoure/popvaud-people/middlewares" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/filesystem" loggerMiddleware "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/helmet/v2" "github.com/gofiber/template/django/v3" ) //go:embed static/* var embedStatic embed.FS //go:embed views var embedViews embed.FS func main() { config, err := helpers.GetConfig() if err != nil { // TODO: Handle exception log.Fatal(err) } _, err = helpers.GetDatabase() if err != nil { // TODO: Handle exception log.Fatal(err) } accountCheck, err := helpers.FirstAccountCheck() if err != nil { // TODO: Handle exception log.Fatal(err) } if !accountCheck { err = helpers.FirstAccountCreate() if err != nil { // TODO: Handle exception log.Fatal(err) } } // Create a new engine var engine *django.Engine if config.Debug { engine = django.New("./views", ".html") engine.ShouldReload = true } else { embedViews2, err := fs.Sub(embedViews, "views") if err != nil { log.Fatal(err) } engine = django.NewFileSystem( http.FS(embedViews2), ".html", ) } app := fiber.New(fiber.Config{ Views: engine, }) if config.Debug { app.Static("/static", "./static") } else { app.Use("/static", filesystem.New(filesystem.Config{ Root: http.FS(embedStatic), PathPrefix: "static", Browse: false, })) } // Base middlewares app.Use(loggerMiddleware.New()) app.Use(helmet.New()) // Security middlewares app.Use(middlewares.AuthMiddleware) app.Use(middlewares.WelcomeMiddleware) app.Use(middlewares.MfaEnrollMiddleware) app.Use(middlewares.MfaVerifyMiddleware) app.Use(middlewares.TemplatesMiddleware) app.Use("/admin", middlewares.AuthzAdmin) // Homepage app.Get("/", controllers.Homepage) // Login & logout app.Get("/login", controllers.LoginForm) app.Post("/login", controllers.LoginForm) app.Get("/logout", controllers.LogoutProcess) // Welcome page on first login app.Get("/welcome", controllers.WelcomePage) app.Post("/welcome", controllers.WelcomePage) // TOTP enroll & verify app.Get("/totp/enroll", controllers.TotpEnrollPage) app.Post("/totp/enroll", controllers.TotpEnrollPage) app.Get("/totp/verify", controllers.TotpVerifyPage) app.Post("/totp/verify", controllers.TotpVerifyPage) // Admin: Lists app.Get("/admin/lists", controllers.Lists) app.Get("/admin/lists/:id", controllers.ListShow) app.Get("/admin/lists/add", controllers.ListAdd) app.Post("/admin/lists/add", controllers.ListAdd) app.Get("/admin/lists/:id/edit", controllers.ListEdit) app.Post("/admin/lists/:id/edit", controllers.ListEdit) app.Delete("/admin/lists/:id", controllers.ListDelete) app.Get("/admin/lists/:id/items/add", controllers.ListItemAdd) app.Post("/admin/lists/:id/items/add", controllers.ListItemAdd) app.Get("/admin/lists/:id/items/:id", controllers.ListItemEdit) app.Post("/admin/lists/:id/items/:id", controllers.ListItemEdit) app.Delete("/admin/lists/:id/items/:id", controllers.ListItemDelete) listenAddr := fmt.Sprintf( "%s:%d", config.App.ListenAddress, config.App.ListenPort, ) err = app.Listen(listenAddr) if err != nil { log.Fatal(err) } }