package main import ( "context" "net/http" "git.tijl.dev/tijl/tijl.dev/internal/assets" "git.tijl.dev/tijl/tijl.dev/internal/config" "git.tijl.dev/tijl/tijl.dev/internal/db" "git.tijl.dev/tijl/tijl.dev/internal/i18n" "git.tijl.dev/tijl/tijl.dev/internal/oidc" "git.tijl.dev/tijl/tijl.dev/internal/sessions" "git.tijl.dev/tijl/tijl.dev/modules/logger" "git.tijl.dev/tijl/tijl.dev/static" "git.tijl.dev/tijl/tijl.dev/views" "github.com/gofiber/contrib/fiberzerolog" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/filesystem" "github.com/gofiber/template/html/v2" ) func main() { // Load initial context ctx := context.Background() // Load config config.Load() // Load database db.Load() // Setup oidc oidc.Load(ctx) // Load assets assets.Load() // Load translations i18n.Load() // Init templating engine engine := html.NewFileSystem(http.FS(views.Embed), ".html") engine.AddFunc("icon", assets.Svg) // Init fiber app := fiber.New(fiber.Config{ Views: engine, DisableStartupMessage: true, }) app.Use(fiberzerolog.New(fiberzerolog.Config{ Logger: &log.Logger, })) /* Routes */ app.Get("/", func(c *fiber.Ctx) error { data := getCommon(c) data["Title"] = i18n.Translate(c, "home") return c.Render("index", data, "layouts/base") }) app.Get("/blog", func(c *fiber.Ctx) error { data := getCommon(c) data["Title"] = i18n.Translate(c, "blog") return c.Render("blog", data, "layouts/base") }) app.Get("/projects", func(c *fiber.Ctx) error { data := getCommon(c) data["Title"] = i18n.Translate(c, "projects") return c.Render("projects", data, "layouts/base") }) app.Get("/about", func(c *fiber.Ctx) error { data := getCommon(c) data["Title"] = i18n.Translate(c, "about") return c.Render("about", data, "layouts/base") }) app.Get("/settings", func(c *fiber.Ctx) error { lang := c.Query("lang") redirectURL := c.Query("redirect") if lang != "" { c.Cookie(&fiber.Cookie{ Name: "language", Value: lang, Secure: false, }) } if redirectURL != "" { return c.Redirect(redirectURL) } return nil }) app.Get("/login", oidc.HandleRedirect) app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback) // Static routes app.Use("/static", filesystem.New(filesystem.Config{ Root: http.FS(static.Embed), })) // 404 app.Use(func(c *fiber.Ctx) error { data := getCommon(c) return c.Render("404", data, "layouts/base") }) // Listen web server if err := app.Listen(":3000"); err != nil { log.Fatal().Err(err).Msg("Fiber app error") } } // Common functions for in templating func getCommon(c *fiber.Ctx) fiber.Map { _, err := sessions.GetSession(c) signedIn := false if err == nil { signedIn = true } return fiber.Map{ "SignedIn": signedIn, "Path": c.Path(), "Language": i18n.GetLanguage(c), "T": i18n.GetTranslations(i18n.GetLanguage(c)), } }