package store import ( "context" ) // MenuItem is one entry of a blog's menu: either a page of the blog or a custom link. type MenuItem struct { ID int64 PageID *int64 // nil for custom links Label string // custom links only; pages use their title URL string // custom links only SortOrder int // joined from pages PageTitle string PageSlug string IsHome bool } // Text is what the visitor reads. func (m MenuItem) Text() string { if m.PageID != nil { return m.PageTitle } return m.Label } // Href is where the entry points. func (m MenuItem) Href() string { switch { case m.PageID == nil: return m.URL case m.IsHome: return "/" } return "/" + m.PageSlug } const menuCols = `m.id, m.page_id, m.label, m.url, m.sort_order, coalesce(p.title,''), coalesce(p.slug,''), coalesce(p.is_home,false)` func (bs *BlogStore) ListMenu(ctx context.Context) ([]MenuItem, error) { rows, err := bs.db.Query(ctx, `SELECT `+menuCols+` FROM menu_items m LEFT JOIN pages p ON p.id=m.page_id ORDER BY m.sort_order, m.id`) if err != nil { return nil, err } defer rows.Close() var out []MenuItem for rows.Next() { var m MenuItem if err := rows.Scan(&m.ID, &m.PageID, &m.Label, &m.URL, &m.SortOrder, &m.PageTitle, &m.PageSlug, &m.IsHome); err != nil { return nil, err } out = append(out, m) } return out, rows.Err() } // AddMenuPage appends a page to the menu; a page already in the menu is left where it is. func (bs *BlogStore) AddMenuPage(ctx context.Context, pageID int64) error { return addMenuPage(ctx, bs.db, pageID) } func addMenuPage(ctx context.Context, db querier, pageID int64) error { _, err := db.Exec(ctx, `INSERT INTO menu_items (page_id, sort_order) SELECT id, (SELECT coalesce(max(sort_order),-1)+1 FROM menu_items) FROM pages WHERE id=$1 ON CONFLICT (page_id) WHERE page_id IS NOT NULL DO NOTHING`, pageID) return err } // SetPageInMenu adds or removes a page's menu entry. func (bs *BlogStore) SetPageInMenu(ctx context.Context, pageID int64, on bool) error { if on { return bs.AddMenuPage(ctx, pageID) } _, err := bs.db.Exec(ctx, `DELETE FROM menu_items WHERE page_id=$1`, pageID) return err }