diff --git a/cmd/linkwallet/linkwallet.go b/cmd/linkwallet/linkwallet.go index bd7f2ae..7ff5f61 100644 --- a/cmd/linkwallet/linkwallet.go +++ b/cmd/linkwallet/linkwallet.go @@ -13,12 +13,13 @@ func main() { dbh := db.DB{} dbh.Open("badger") bmm := db.NewBookmarkManager(&dbh) + cmm := db.NewConfigManager(&dbh) go func() { version.UpdateVersionInfo() }() log.Printf("linkallet verison %s starting", version.Is()) - server := web.Create(bmm) + server := web.Create(bmm, cmm) go bmm.RunQueue() go bmm.UpdateContent() server.Start() diff --git a/db/config.go b/db/config.go new file mode 100644 index 0000000..4b88a5f --- /dev/null +++ b/db/config.go @@ -0,0 +1,49 @@ +package db + +import ( + "fmt" + "log" + + "github.com/tardisx/linkwallet/entity" + "github.com/timshannon/badgerhold/v4" +) + +type ConfigManager struct { + db *DB +} + +func NewConfigManager(db *DB) *ConfigManager { + return &ConfigManager{db: db} +} + +func (cmm *ConfigManager) LoadConfig() (entity.Config, error) { + config := entity.Config{} + err := cmm.db.store.FindOne(&config, &badgerhold.Query{}) + if err == nil { + if config.Version == 1 { + return config, nil + } else { + return entity.Config{}, fmt.Errorf("failed to load config - wrong version %d", config.Version) + } + } else if err == badgerhold.ErrNotFound { + log.Printf("using default config") + return cmm.DefaultConfig(), nil + } else { + return entity.Config{}, fmt.Errorf("failed to load config: %w", err) + } +} + +func (cmm *ConfigManager) DefaultConfig() entity.Config { + return entity.Config{ + BaseURL: "http://localhost:8080", + Version: 1, + } +} + +func (cmm *ConfigManager) SaveConfig(conf *entity.Config) error { + err := cmm.db.store.Upsert("config", conf) + if err != nil { + return fmt.Errorf("could not save config: %w", err) + } + return nil +} diff --git a/db/index.go b/db/index.go index 9993ec9..4e7bc88 100644 --- a/db/index.go +++ b/db/index.go @@ -23,7 +23,7 @@ func (db *DB) UpdateIndexForWordsByID(words []string, id uint64) { delete(wi.Bitmap, id) }) - // addiing + // adding var find, store time.Duration for i, word := range words { // log.Printf("indexing %s", word) diff --git a/entity/config.go b/entity/config.go new file mode 100644 index 0000000..c0edb92 --- /dev/null +++ b/entity/config.go @@ -0,0 +1,6 @@ +package entity + +type Config struct { + BaseURL string + Version int +} diff --git a/version/version.go b/version/version.go index 43c0c63..f669a6a 100644 --- a/version/version.go +++ b/version/version.go @@ -8,7 +8,7 @@ import ( "golang.org/x/mod/semver" ) -const Tag = "v0.0.8" +const Tag = "v0.0.9" var versionInfo struct { Local struct { diff --git a/web/templates/_layout.html b/web/templates/_layout.html index fe9de0f..a0da40c 100644 --- a/web/templates/_layout.html +++ b/web/templates/_layout.html @@ -21,11 +21,12 @@
  • Admin
  • -
  • Bookmarklet
  • +
  • Bookmarklet
  • @@ -50,6 +51,8 @@ {{ template "bookmarklet.html" . }} {{ else if eq .page "manage" }} {{ template "manage.html" . }} + {{ else if eq .page "config" }} + {{ template "config.html" . }} {{ end }} {{/* template "foundation_sample.html" . */}} diff --git a/web/templates/config.html b/web/templates/config.html new file mode 100644 index 0000000..434f250 --- /dev/null +++ b/web/templates/config.html @@ -0,0 +1,7 @@ +
    +
    + +
    Configuration
    + {{ template "config_form.html" . }} +
    +
    \ No newline at end of file diff --git a/web/templates/config_form.html b/web/templates/config_form.html new file mode 100644 index 0000000..b88c9f7 --- /dev/null +++ b/web/templates/config_form.html @@ -0,0 +1,12 @@ + +
    + + + + + +
    Base URL + +
    +

    save

    +
    \ No newline at end of file diff --git a/web/web.go b/web/web.go index 7d68394..034170b 100644 --- a/web/web.go +++ b/web/web.go @@ -42,7 +42,7 @@ type Server struct { } // Create creates a new web server instance and sets up routing. -func Create(bmm *db.BookmarkManager) *Server { +func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server { // setup routes for the static assets (vendor includes) staticFS, err := fs.Sub(staticFiles, "static") @@ -53,6 +53,11 @@ func Create(bmm *db.BookmarkManager) *Server { // templ := template.Must(template.New("").Funcs(template.FuncMap{"dict": dictHelper}).ParseFS(templateFiles, "templates/*.html")) templ := template.Must(template.New("").Funcs(template.FuncMap{"nicetime": niceTime, "niceURL": niceURL, "join": strings.Join, "version": version.Is}).ParseFS(templateFiles, "templates/*.html")) + config, err := cmm.LoadConfig() + if err != nil { + log.Fatalf("could not start server - failed to load config: %s", err) + } + r := gin.Default() server := &Server{ @@ -67,7 +72,7 @@ func Create(bmm *db.BookmarkManager) *Server { r.StaticFS("/assets", http.FS(staticFS)) r.GET("/", func(c *gin.Context) { - meta := gin.H{"page": "root"} + meta := gin.H{"page": "root", "config": config} c.HTML(http.StatusOK, "_layout.html", meta, ) @@ -75,12 +80,27 @@ func Create(bmm *db.BookmarkManager) *Server { r.GET("/manage", func(c *gin.Context) { allBookmarks, _ := bmm.ListBookmarks() - meta := gin.H{"page": "manage", "bookmarks": allBookmarks} + meta := gin.H{"page": "manage", "config": config, "bookmarks": allBookmarks} c.HTML(http.StatusOK, "_layout.html", meta, ) }) + r.GET("/config", func(c *gin.Context) { + meta := gin.H{"page": "config", "config": config} + c.HTML(http.StatusOK, + "_layout.html", meta, + ) + }) + + r.POST("/config", func(c *gin.Context) { + config.BaseURL = c.PostForm("baseurl") + cmm.SaveConfig(&config) + meta := gin.H{"config": config} + + c.HTML(http.StatusOK, "config_form.html", meta) + }) + r.POST("/search", func(c *gin.Context) { query := c.PostForm("query") @@ -152,8 +172,6 @@ func Create(bmm *db.BookmarkManager) *Server { r.POST("/tags", func(c *gin.Context) { - log.Printf("POST: tag '%s' tags_hidden '%s'", c.PostForm("tag"), c.PostForm("tags_hidden")) - newTag := c.PostForm("tag") oldTags := strings.Split(c.PostForm("tags_hidden"), "|") @@ -203,7 +221,7 @@ func Create(bmm *db.BookmarkManager) *Server { r.GET("/bookmarklet", func(c *gin.Context) { url := c.Query("url") log.Printf(url) - meta := gin.H{"page": "bookmarklet_click", "url": url} + meta := gin.H{"page": "bookmarklet_click", "config": config, "url": url} c.HTML(http.StatusOK, "_layout.html", meta, )