From 4e87c77ccbcc3d57218b1d88add31a388686a4d7 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Wed, 16 Jul 2025 12:31:51 +0200 Subject: [PATCH] implemented start server --- internal/rendering/diyhrt.go | 28 +++++++++++++++++++++ internal/server/embed.go | 42 +++++++++++++++++++++++++++++++ internal/server/server.go | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 internal/rendering/diyhrt.go create mode 100644 internal/server/embed.go create mode 100644 internal/server/server.go diff --git a/internal/rendering/diyhrt.go b/internal/rendering/diyhrt.go new file mode 100644 index 0000000..9c94aac --- /dev/null +++ b/internal/rendering/diyhrt.go @@ -0,0 +1,28 @@ +package rendering + +import ( + "maps" + "slices" + + "gitea.elara.ws/Hazel/transfem-startpage/internal/diyhrt" +) + +func (c *Config) LoadDiyHrt(listings []diyhrt.Listing) { + existingStores := make(map[int]diyhrt.Store) + + for _, listing := range listings { + existingStores[listing.Store.Id] = listing.Store + } + + c.Template.Listings = c.DiyHrt.ListingFilter.Filter(listings) + c.Template.Stores = c.DiyHrt.StoreFilter.Filter(slices.Collect(maps.Values(existingStores))) +} + +func (c *Config) FetchDiyHrt() error { + l, err := diyhrt.GetListings(c.DiyHrt.ApiKey) + if err != nil { + return err + } + c.LoadDiyHrt(l) + return nil +} diff --git a/internal/server/embed.go b/internal/server/embed.go new file mode 100644 index 0000000..a1dfc13 --- /dev/null +++ b/internal/server/embed.go @@ -0,0 +1,42 @@ +package server + +import ( + "bytes" + "embed" + "io/fs" + "log" + "net/http" + "text/template" + + "github.com/labstack/echo/v4" +) + +var FrontendFiles embed.FS + +func getFileContent() string { + content, err := FrontendFiles.ReadFile("frontend/index.html") + + if err != nil { + log.Fatal(err) + } + + return string(content) +} + +func getIndex(c echo.Context) error { + IndexTemplate := template.Must(template.New("index").Parse(getFileContent())) + + var tpl bytes.Buffer + IndexTemplate.Execute(&tpl, Config.Template) + + return c.HTML(http.StatusOK, tpl.String()) +} + +func getFileSystem() http.FileSystem { + fsys, err := fs.Sub(FrontendFiles, "frontend") + if err != nil { + panic(err) + } + + return http.FS(fsys) +} diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 0000000..f5b333e --- /dev/null +++ b/internal/server/server.go @@ -0,0 +1,48 @@ +package server + +import ( + "log" + "net/http" + "strconv" + + "gitea.elara.ws/Hazel/transfem-startpage/internal/rendering" + "github.com/labstack/echo/v4" +) + +var Config = rendering.NewConfig() + +func Start(profile string) error { + err := Config.ScanForConfigFile(profile) + if err != nil { + return err + } + + err = Config.Init() + if err != nil { + return err + } + + err = Config.FetchDiyHrt() + if err != nil { + log.Println(err) + } + + e := echo.New() + + // statically serve the file + cacheDir, err := rendering.GetCacheDir() + if err == nil { + e.Static("/cache", cacheDir) + } else { + log.Println("didn't enable cache dir", err) + } + + // https://echo.labstack.com/docs/cookbook/embed-resources + staticHandler := http.FileServer(getFileSystem()) + e.GET("/assets/*", echo.WrapHandler(http.StripPrefix("/", staticHandler))) + e.GET("/scripts/*", echo.WrapHandler(http.StripPrefix("/", staticHandler))) + e.GET("/", getIndex) + + e.Logger.Fatal(e.Start(":" + strconv.Itoa(Config.Server.Port))) + return nil +}