package handlers import ( "context" "net/http" "time" "git.soup.land/soup/sxgo/ssr" "lookbook/internal/components" "lookbook/internal/data/item" "lookbook/internal/data/media" "lookbook/internal/data/tag" ) type homeContent struct { Items []homeItem Tags []string ActiveTag string IsAdmin bool } type homeItem struct { ID string Title *string Description *string LinkURL *string ItemType string EmbedHTML *string Tags []string ThumbnailID *int64 MediaID *int64 } func (h homeContent) Render(sw *ssr.Writer) error { return sw.Tmpl(h, `
{{if .IsAdmin}}
{{end}}
ALL {{range .Tags}} {{.}} {{end}}
{{range .Items}} {{if eq .ItemType "quote"}}
{{.Description}}
{{if .Title}}— {{.Title}}{{end}}
{{else if .ThumbnailID}} {{if .Title}}{{.Title}}{{else}}Image{{end}} {{else if .MediaID}} {{if .Title}}{{.Title}}{{else}}Image{{end}} {{else if eq .ItemType "embed"}}
{{else}} {{end}} {{if .Tags}}
{{range .Tags}}{{.}}{{end}}
{{end}}
{{end}}
{{if .IsAdmin}} {{end}} `) } // HandleHome handles GET / func HandleHome(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) defer cancel() tagFilter := r.URL.Query().Get("tag") var items []item.Row var err error if tagFilter != "" { items, err = item.QListByTag(ctx, rc.DB, tagFilter) } else { items, err = item.QList(ctx, rc.DB) } if err != nil { return err } // Get all tags allTags, err := tag.QList(ctx, rc.DB) if err != nil { return err } tagNames := make([]string, len(allTags)) for i, t := range allTags { tagNames[i] = t.Name } // Build home items homeItems := make([]homeItem, 0, len(items)) for _, it := range items { hi := homeItem{ ID: it.PubID, Title: it.Title, Description: it.Description, LinkURL: it.LinkURL, ItemType: it.ItemType, EmbedHTML: it.EmbedHTML, } // Get tags itemTags, err := tag.QTagsForItem(ctx, rc.DB, it.ID) if err != nil { return err } hi.Tags = make([]string, len(itemTags)) for i, t := range itemTags { hi.Tags[i] = t.Name } // Get media mediaList, err := media.QFindByItemID(ctx, rc.DB, it.ID) if err != nil { return err } for _, m := range mediaList { if m.MediaType == "thumbnail" { hi.ThumbnailID = &m.ID } else if m.MediaType == "original" { hi.MediaID = &m.ID } } homeItems = append(homeItems, hi) } content := homeContent{ Items: homeItems, Tags: tagNames, ActiveTag: tagFilter, IsAdmin: rc.IsAdmin, } w.Header().Set("Content-Type", "text/html; charset=utf-8") sw := ssr.NewWriter(w, rc.TmplCache) page := components.Page{ Title: "", IsAdmin: rc.IsAdmin, Content: content, } return page.Render(sw) }