Compare commits
3 Commits
f574a00a8f
...
16a65df664
Author | SHA1 | Date | |
---|---|---|---|
|
16a65df664 | ||
|
4e87c77ccb | ||
|
94b3f4c0f2 |
@ -1,8 +1,18 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import "log"
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"gitea.elara.ws/Hazel/transfem-startpage/internal/server"
|
||||||
|
)
|
||||||
|
|
||||||
func Start() error {
|
func Start() error {
|
||||||
log.Println("starting server")
|
profile := "default"
|
||||||
return nil
|
if len(os.Args) > 2 {
|
||||||
|
profile = os.Args[2]
|
||||||
|
}
|
||||||
|
log.Println("starting server with profile " + profile)
|
||||||
|
|
||||||
|
return server.Start(profile)
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,9 @@ package rendering
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"log"
|
||||||
"maps"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"slices"
|
|
||||||
|
|
||||||
"gitea.elara.ws/Hazel/transfem-startpage/internal/diyhrt"
|
"gitea.elara.ws/Hazel/transfem-startpage/internal/diyhrt"
|
||||||
"github.com/pelletier/go-toml"
|
"github.com/pelletier/go-toml"
|
||||||
@ -102,17 +100,6 @@ func NewConfig() Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 (rc *Config) ScanForConfigFile(profile string) error {
|
func (rc *Config) ScanForConfigFile(profile string) error {
|
||||||
profileFile := profile + ".toml"
|
profileFile := profile + ".toml"
|
||||||
|
|
||||||
@ -141,7 +128,7 @@ func (rc *Config) LoadConfigFile(file string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("loading config file: " + file)
|
log.Println("loading config file", file)
|
||||||
|
|
||||||
content, err := os.ReadFile(file)
|
content, err := os.ReadFile(file)
|
||||||
|
|
||||||
@ -153,12 +140,10 @@ func (rc *Config) LoadConfigFile(file string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) Init() error {
|
func (c *Config) Init() error {
|
||||||
fmt.Print("downloading website icons")
|
log.Println("downloading website icons...")
|
||||||
for i := range c.Template.Websites {
|
for i := range c.Template.Websites {
|
||||||
fmt.Print(".")
|
|
||||||
c.Template.Websites[i].Cache()
|
c.Template.Websites[i].Cache()
|
||||||
}
|
}
|
||||||
fmt.Print("\n")
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
28
internal/rendering/diyhrt.go
Normal file
28
internal/rendering/diyhrt.go
Normal file
@ -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
|
||||||
|
}
|
42
internal/server/embed.go
Normal file
42
internal/server/embed.go
Normal file
@ -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)
|
||||||
|
}
|
48
internal/server/server.go
Normal file
48
internal/server/server.go
Normal file
@ -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
|
||||||
|
}
|
97
main.go
97
main.go
@ -1,107 +1,16 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
|
||||||
"html/template"
|
|
||||||
"io/fs"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"gitea.elara.ws/Hazel/transfem-startpage/internal/cli"
|
"gitea.elara.ws/Hazel/transfem-startpage/internal/cli"
|
||||||
"gitea.elara.ws/Hazel/transfem-startpage/internal/diyhrt"
|
"gitea.elara.ws/Hazel/transfem-startpage/internal/server"
|
||||||
"gitea.elara.ws/Hazel/transfem-startpage/internal/rendering"
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var CurrentConfig = rendering.NewConfig()
|
|
||||||
|
|
||||||
func FetchDiyHrt() error {
|
|
||||||
fmt.Println("Fetch DiyHrt Marketplaces...")
|
|
||||||
|
|
||||||
l, err := diyhrt.GetListings(CurrentConfig.DiyHrt.ApiKey)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
CurrentConfig.LoadDiyHrt(l)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:embed frontend/*
|
//go:embed frontend/*
|
||||||
var frontendFiles embed.FS
|
var FrontendFiles embed.FS
|
||||||
|
|
||||||
func getFileContent() string {
|
|
||||||
content, err := frontendFiles.ReadFile("frontend/index.html")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(content)
|
|
||||||
}
|
|
||||||
|
|
||||||
var IndexTemplate = template.Must(template.New("index").Parse(getFileContent()))
|
|
||||||
|
|
||||||
func getIndex(c echo.Context) error {
|
|
||||||
var tpl bytes.Buffer
|
|
||||||
IndexTemplate.Execute(&tpl, CurrentConfig.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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func backMain() {
|
|
||||||
profile := "default"
|
|
||||||
if len(os.Args) > 1 {
|
|
||||||
profile = os.Args[1]
|
|
||||||
}
|
|
||||||
fmt.Println("loading profile " + profile)
|
|
||||||
|
|
||||||
err := CurrentConfig.ScanForConfigFile(profile)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = CurrentConfig.Init()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = FetchDiyHrt()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
e := echo.New()
|
|
||||||
|
|
||||||
// statically serve the file
|
|
||||||
cacheDir, err := rendering.GetCacheDir()
|
|
||||||
if err == nil {
|
|
||||||
e.Static("/cache", cacheDir)
|
|
||||||
} else {
|
|
||||||
fmt.Println(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(CurrentConfig.Server.Port)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
server.FrontendFiles = FrontendFiles
|
||||||
cli.Cli()
|
cli.Cli()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user