package config
import (
"html/template"
"log"
"strconv"
"time"
"github.com/dmitriygnatenko/internal/interfaces"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/html"
)
const (
appName = "dmitriygnatenko"
templatesPath = "./../../internal/templates"
)
func Init(app interfaces.IApp) fiber.Config {
return fiber.Config{
AppName: appName,
DisableStartupMessage: true,
Views: initEngine(app.GetEnvService()),
ErrorHandler: initErrorHandler(app),
}
}
//nolint
func initEngine(env interfaces.IEnv) *html.Engine {
engine := html.New(templatesPath, ".html")
engine.AddFunc("now", func() time.Time {
return time.Now()
})
engine.AddFunc("noescape", func(str string) template.HTML {
return template.HTML(str)
})
engine.AddFunc("gridsep", func(i, l int) bool {
i++
return i%3 == 0 && i != l
})
engine.AddFunc("version", func() string {
return env.GetStaticVersion()
})
engine.AddFunc("ga", func() bool {
return env.IsGAEnabled()
})
return engine
}
func initErrorHandler(app interfaces.IApp) fiber.ErrorHandler {
return func(ctx *fiber.Ctx, err error) error {
errCode := fiber.StatusInternalServerError
errText := err.Error()
if e, ok := err.(*fiber.Error); ok {
errCode = e.Code
}
var renderData fiber.Map
if errCode == fiber.StatusNotFound {
renderData = fiber.Map{
"pageTitle": "Страница не найдена",
"code": fiber.StatusNotFound,
"text": "Запрашиваемая вами страница не найдена",
}
} else {
renderData = fiber.Map{
"pageTitle": "Внутренняя ошибка",
"code": fiber.StatusInternalServerError,
"text": "Внутренняя ошибка сервера, идем исправлять...",
}
if errText != "" {
sendErr := app.GetMailerService().Send(
app.GetEnvService().GetAdminEmail(),
"Ошибка на сайте dmitriygnatenko.ru",
"Код: "+strconv.Itoa(errCode)+"\r\n"+"Текст: "+errText,
)
if sendErr != nil {
log.Print(sendErr)
}
}
}
renderData["headTitle"] = "От слона к суслику - статьи про PHP, Go, алгоритмы"
return ctx.Render("error", renderData, "_layout")
}
}