gothub/main.go

103 lines
2.2 KiB
Go

package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/html"
"codeberg.org/Odyssium/gothub/pages"
"github.com/gofiber/fiber/v2/middleware/cache"
"time"
"github.com/gofiber/fiber/v2/middleware/proxy"
"github.com/gofiber/fiber/v2/middleware/compress"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/gofiber/fiber/v2/middleware/limiter"
"html/template"
)
func main() {
engine := html.New("./views", ".html")
engine.AddFunc(
// add unescape function
"unescape", func(s string) template.HTML {
return template.HTML(s)
},
)
app := fiber.New(fiber.Config{
Views: engine,
Prefork: false,
AppName: "GotHub",
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
if e, ok := err.(*fiber.Error); ok {
code = e.Code
}
err = ctx.Status(code).Render("error", fiber.Map{
"error": err,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
return nil
},
})
app.Use(cache.New(cache.Config{
Expiration: 5 * time.Minute,
}))
app.Get("/", func(c *fiber.Ctx) error {
return c.Render("index", fiber.Map{
"host": c.Hostname(),
})
})
app.Use(compress.New(compress.Config{
Level: compress.LevelBestSpeed, // 1
}))
app.Use(recover.New())
ratelimiter := limiter.New(limiter.Config{
Max: 5,
Expiration: 5 * time.Minute,
LimitReached: func(c *fiber.Ctx) error {
return c.Status(429).Render("ratelimit_gt", fiber.Map{
"Title": "Rate limit exceeded",
})
},
})
app.Static("/css", "./public/css")
app.Static("/fonts", "./public/fonts")
app.Static("/robots.txt", "./public/robots.txt")
app.Static("/favicon.ico", "./public/assets/favicon.ico")
app.Static("/logo.svg", "./public/assets/logo.svg")
app.Get("/explore", ratelimiter, pages.HandleExplore)
app.Get("/:user", ratelimiter, pages.HandleUser)
app.Get("/avatar/:id", func(c *fiber.Ctx) error {
url := "https://avatars.githubusercontent.com/u/" + c.Params("id") + "?v=4"
if err := proxy.Do(c, url); err != nil {
return err
}
// Remove Server header from response
c.Response().Header.Del(fiber.HeaderServer)
return nil
})
log.Fatal(app.Listen(":3000"))
}