gophertype/pkg/models/tags.go

58 lines
1.2 KiB
Go

package models
import (
"git.kirsle.net/apps/gophertype/pkg/console"
)
// TaggedPost associates tags to their posts.
type TaggedPost struct {
ID uint `gorm:"primary_key"`
Tag string
PostID uint // foreign key to Post
}
// SummarizeTags returns the list of all tags ordered by frequency used.
// public: true for public view, don't count tags on private posts.
func SummarizeTags(public bool) []TagSummary {
var result []TagSummary
query := DB.Table("tagged_posts").
Select("tagged_posts.tag, count(tagged_posts.post_id) AS count").
Joins("JOIN posts ON posts.id = tagged_posts.post_id").
Group("tagged_posts.tag").
Order("count desc")
if public {
query = query.Where("posts.privacy = ?", Public)
}
rows, err := query.Rows()
if err != nil {
console.Error("SummarizeTags: query.Rows: %s", err)
}
for rows.Next() {
var (
tagName string
count int
)
if err := rows.Scan(&tagName, &count); err != nil {
console.Error("SummarizeTags: rows.Scan: %s", err)
}
result = append(result, TagSummary{
Tag: tagName,
Count: count,
})
}
return result
}
// TagSummary holds the result for SummarizeTags
type TagSummary struct {
Tag string
Count int
}