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 }