diff options
| author | ivar <i@oiee.no> | 2026-04-07 00:23:24 +0200 |
|---|---|---|
| committer | ivar <i@oiee.no> | 2026-04-07 00:23:24 +0200 |
| commit | 85920b8c7a2696115d1f77c046f48f6f00d639f1 (patch) | |
| tree | 14ed2043796eadd6ed5b0a95c55e38e48713d638 /internal/server/frontpage.go | |
| download | iblog-85920b8c7a2696115d1f77c046f48f6f00d639f1.tar.xz iblog-85920b8c7a2696115d1f77c046f48f6f00d639f1.zip | |
Init
Diffstat (limited to 'internal/server/frontpage.go')
| -rw-r--r-- | internal/server/frontpage.go | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/internal/server/frontpage.go b/internal/server/frontpage.go new file mode 100644 index 0000000..faca83c --- /dev/null +++ b/internal/server/frontpage.go @@ -0,0 +1,87 @@ +package server + +import ( + "net/http" + "strings" + + "iblog/internal/db" + + "github.com/gin-gonic/gin" +) + +type FrontpageHandler struct { + DB *db.DB +} + +type frontpageData struct { + Posts []db.PostRecord + Query string + ActiveTag string + SiteTitle string + SiteDescription string +} + +func NewFrontpageHandler(database *db.DB) *FrontpageHandler { + return &FrontpageHandler{DB: database} +} + +func (h *FrontpageHandler) Serve(c *gin.Context) { + query := strings.TrimSpace(c.Query("q")) + tag := strings.TrimSpace(c.Query("tag")) + + title, _ := h.DB.GetSetting("site_title") + desc, _ := h.DB.GetSetting("site_description") + + data := frontpageData{ + Query: query, + ActiveTag: tag, + SiteTitle: title, + SiteDescription: desc, + } + + if query != "" { + results, err := h.DB.Search(query) + if err == nil { + data.Posts = searchResultsToPosts(results, h.DB) + } + } else { + posts, err := h.DB.ListPosts(false) // exclude drafts + if err == nil { + if tag != "" { + posts = filterByTag(posts, tag) + } + data.Posts = posts + } + } + + c.HTML(http.StatusOK, "index.html", data) +} + +func filterByTag(posts []db.PostRecord, tag string) []db.PostRecord { + var filtered []db.PostRecord + for _, p := range posts { + for _, t := range p.Tags { + if strings.EqualFold(t, tag) { + filtered = append(filtered, p) + break + } + } + } + return filtered +} + +func searchResultsToPosts(results []db.SearchResult, database *db.DB) []db.PostRecord { + var posts []db.PostRecord + for _, r := range results { + slug := strings.TrimPrefix(r.Path, "/") + if slug == r.Path { + continue // not a post + } + post, err := database.GetPostBySlug(slug) + if err != nil || post.Draft { + continue + } + posts = append(posts, *post) + } + return posts +} |
