shorgru/cmd/shorg/serve/serve.go

56 lines
1.2 KiB
Go

package serve
import (
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/ssoda/captcha"
"github.com/uptrace/bun/extra/bundebug"
"github.com/urfave/cli/v2"
"sh.org.ru/pkg/config"
"sh.org.ru/pkg/db"
"sh.org.ru/pkg/handler"
"sh.org.ru/static"
)
func Run(c *cli.Context) error {
configFile := c.String("config")
cfg, err := config.New(configFile)
if err != nil {
return err
}
db := db.New(cfg.DB)
db.AddQueryHook(bundebug.NewQueryHook(bundebug.WithVerbose(cfg.Debug)))
h := handler.Handler{DB: db}
e := echo.New()
e.HTTPErrorHandler = handler.ErrorHandler
e.Use(
middleware.Recover(),
middleware.Logger(),
middleware.RemoveTrailingSlash(),
)
e.GET("/", h.Index)
e.GET("/quote/:id", h.Quote)
e.GET("/random", h.Random)
e.GET("/add", h.AddQuote)
e.POST("/add", h.AddQuotePost)
e.GET("/add/success", h.AddQuoteSuccess)
e.GET("/captcha/*", echo.WrapHandler(captcha.Server(400, 65)))
adminMW := middleware.BasicAuth(func(u, p string, ctx echo.Context) (bool, error) {
return cfg.Admins[u] == p, nil
})
func(g *echo.Group) {
g.GET("/", h.Admin)
g.POST("/action", h.AdminAction)
g.GET("/export", h.AdminExport)
}(e.Group("/admin", adminMW))
e.StaticFS("/", static.FS)
return e.Start(cfg.Listen)
}