mirror of
https://github.com/Theodor-Springmann-Stiftung/lenz-web.git
synced 2025-10-28 16:55:32 +00:00
111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/config"
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/controllers"
|
|
gitprovider "github.com/Theodor-Springmann-Stiftung/lenz-web/git"
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/server"
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/templating"
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/views"
|
|
"github.com/Theodor-Springmann-Stiftung/lenz-web/xmlmodels"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/storage/memory/v2"
|
|
)
|
|
|
|
var REFRESH_CHANGES = []string{
|
|
"./views/assets",
|
|
}
|
|
|
|
var RESET_CHANGES = []string{
|
|
"./views/layouts",
|
|
"./views/routes",
|
|
}
|
|
|
|
func main() {
|
|
cfg, err := config.Get()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if cfg.Debug {
|
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
|
}
|
|
|
|
dir := filepath.Join(cfg.BaseDIR, cfg.GITPath)
|
|
|
|
fmt.Printf("Starting Lenz with config: %v", cfg)
|
|
commit, err := gitprovider.OpenOrClone(dir, cfg.GitURL, cfg.GitBranch)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// INFO: the lib, engine and storage objects passed to the server should never be recreated.
|
|
lib, err := xmlmodels.Parse(dir, commit.Hash)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
engine := templating.New(&views.LayoutFS, &views.RoutesFS)
|
|
engine.AddFuncs(lib.FuncMap())
|
|
|
|
storage := memory.New(memory.Config{
|
|
GCInterval: 24 * time.Hour,
|
|
})
|
|
|
|
if cfg.Debug {
|
|
SetupDebug(storage, engine)
|
|
}
|
|
|
|
server := server.New(engine, storage, cfg.Debug)
|
|
controllers.Register(server, cfg)
|
|
|
|
server.Start(cfg.Address + ":" + cfg.Port)
|
|
}
|
|
|
|
func SetupDebug(storage fiber.Storage, engine *templating.Engine) {
|
|
SetupRefreshWatcher(storage, engine)
|
|
SetupReloadWatcher(storage, engine)
|
|
engine.Debug()
|
|
}
|
|
|
|
func SetupRefreshWatcher(storage fiber.Storage, engine *templating.Engine) {
|
|
refreshwatcher, err := New(func() { RefreshFunction(storage, engine) })
|
|
if err != nil {
|
|
slog.Error("Error setting up refresh watcher, continuing without: ", "error:", err)
|
|
return
|
|
}
|
|
|
|
for _, path := range REFRESH_CHANGES {
|
|
refreshwatcher.AddRecursive(path)
|
|
}
|
|
}
|
|
|
|
func SetupReloadWatcher(storage fiber.Storage, engine *templating.Engine) {
|
|
resetwatcher, err := New(func() { ResetFunction(storage, engine) })
|
|
if err != nil {
|
|
slog.Error("Error setting up refresh watcher, continuing without: ", "error:", err)
|
|
return
|
|
}
|
|
|
|
for _, path := range RESET_CHANGES {
|
|
resetwatcher.AddRecursive(path)
|
|
}
|
|
}
|
|
|
|
func ResetFunction(storage fiber.Storage, engine *templating.Engine) {
|
|
slog.Debug("Resetting storage and reloading engine")
|
|
storage.Reset()
|
|
engine.Reload()
|
|
}
|
|
|
|
func RefreshFunction(storage fiber.Storage, engine *templating.Engine) {
|
|
slog.Debug("Resetting storage and sending refresh signal")
|
|
storage.Reset()
|
|
engine.Refresh()
|
|
}
|