marky

Lightweight bookmarking + plaintext archive
Log | Files | Refs | README | LICENSE

commit d2b0eb6e94cbda4a0cc5766c4409735dc5533e6d
parent 8a7e253126aa473b0c63bbd3b16a61832be1e546
Author: David Eisinger <[email protected]>
Date:   Thu,  9 Oct 2025 13:50:57 -0400

Remove initial API call on logged-out view

Diffstat:
Minternal/api.go | 42++++++++++++++++++++++++++++++++++++++++--
Minternal/web/app.js | 10+++++++++-
2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/internal/api.go b/internal/api.go @@ -387,7 +387,7 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) { } if u, err := db.GetUserByUsername(r.Context(), uname); err == nil && u != nil { if html, err := RenderPage("user.html", cfg); err == nil { - // If owner viewing own page, embed initial bookmarks to avoid client fetch + // Embed initial bookmarks to avoid client fetch if isOwnerAuthorized(r, u, db) { items, err := db.ListBookmarks(r.Context(), u.ID, 50, 0) if err == nil { @@ -407,6 +407,25 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) { } } } + } else { + items, err := db.ListPublicBookmarks(r.Context(), u.ID, 50, 0) + if err == nil { + resp := make([]bookmarkResponse, 0, len(items)) + for i := range items { + resp = append(resp, toRespWithArchive(r.Context(), db, &items[i])) + } + if b, err := json.Marshal(resp); err == nil { + inject := []byte("<script>window.MARKY_INITIAL={view:'public',user:" + strconv.Quote(u.Username) + ",results:" + string(b) + "}</script>\n") + marker := []byte("<script src=\"/app.js\"></script>") + if i := bytes.Index(html, marker); i >= 0 { + out := make([]byte, 0, len(html)+len(inject)) + out = append(out, html[:i]...) + out = append(out, inject...) + out = append(out, html[i:]...) + html = out + } + } + } } w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write(html) @@ -461,7 +480,7 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) { if !strings.Contains(p, "/") && !strings.Contains(p, ".") { if u, err := db.GetUserByUsername(r.Context(), p); err == nil && u != nil { if html, err := RenderPage("user.html", cfg); err == nil { - // Owner initial embed for legacy route + // Initial embed for legacy route if isOwnerAuthorized(r, u, db) { items, err := db.ListBookmarks(r.Context(), u.ID, 50, 0) if err == nil { @@ -481,6 +500,25 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) { } } } + } else { + items, err := db.ListPublicBookmarks(r.Context(), u.ID, 50, 0) + if err == nil { + resp := make([]bookmarkResponse, 0, len(items)) + for i := range items { + resp = append(resp, toRespWithArchive(r.Context(), db, &items[i])) + } + if b, err := json.Marshal(resp); err == nil { + inject := []byte("<script>window.MARKY_INITIAL={view:'public',user:" + strconv.Quote(u.Username) + ",results:" + string(b) + "}</script>\n") + marker := []byte("<script src=\"/app.js\"></script>") + if i := bytes.Index(html, marker); i >= 0 { + out := make([]byte, 0, len(html)+len(inject)) + out = append(out, html[:i]...) + out = append(out, inject...) + out = append(out, html[i:]...) + html = out + } + } + } } w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write(html) diff --git a/internal/web/app.js b/internal/web/app.js @@ -68,7 +68,15 @@ createApp({ // Do not auto-fetch all bookmarks on initial load } else { this.view = 'public'; - this.loadPublic(); + // Initialize from server-embedded data when available; otherwise fetch + let hydrated = false; + try { + if (window.MARKY_INITIAL && window.MARKY_INITIAL.view === 'public' && window.MARKY_INITIAL.user === this.viewUser) { + this.results = Array.isArray(window.MARKY_INITIAL.results) ? window.MARKY_INITIAL.results : []; + hydrated = true; + } + } catch {} + if (!hydrated) this.loadPublic(); } this.updateTitle(); },