diff --git a/db/bookmarks.go b/db/bookmarks.go index 39fb080..dcb414e 100644 --- a/db/bookmarks.go +++ b/db/bookmarks.go @@ -2,6 +2,7 @@ package db import ( "fmt" + "io" "log" "sync" "time" @@ -48,6 +49,19 @@ func (m *BookmarkManager) ListBookmarks() ([]entity.Bookmark, error) { return bookmarks, nil } +// ExportBookmarks exports all bookmarks to an io.Writer +func (m *BookmarkManager) ExportBookmarks(w io.Writer) error { + bms := []entity.Bookmark{} + err := m.db.store.Find(&bms, &badgerhold.Query{}) + if err != nil { + return fmt.Errorf("could not export bookmarks: %w", err) + } + for _, bm := range bms { + w.Write([]byte(bm.URL + "\n")) + } + return nil +} + func (m *BookmarkManager) SaveBookmark(bm *entity.Bookmark) error { err := m.db.store.Update(bm.ID, &bm) if err != nil { diff --git a/version/version.go b/version/version.go index 7550368..4a243fe 100644 --- a/version/version.go +++ b/version/version.go @@ -8,7 +8,7 @@ import ( "golang.org/x/mod/semver" ) -const Tag = "v0.0.6" +const Tag = "v0.0.7" var versionInfo struct { Local struct { diff --git a/web/templates/_layout.html b/web/templates/_layout.html index c38c3d7..104af09 100644 --- a/web/templates/_layout.html +++ b/web/templates/_layout.html @@ -22,6 +22,7 @@ Admin
diff --git a/web/web.go b/web/web.go index 16661ec..291eb04 100644 --- a/web/web.go +++ b/web/web.go @@ -189,6 +189,16 @@ func Create(bmm *db.BookmarkManager) *Server { c.String(http.StatusOK, "queued") }) + r.GET("/export", func(c *gin.Context) { + c.Writer.Header().Set("Content-Type", "text/plain") + c.Writer.Header().Set("Content-Disposition", "attachment; filename=\"bookmarks.txt\"") + err := bmm.ExportBookmarks(c.Writer) + // this is a bit late, but we already added headers, so at least log it. + if err != nil { + log.Printf("got error when exporting: %s", err) + } + }) + return server }