|
|
@ -1,5 +1,12 @@ |
|
|
|
package story |
|
|
|
|
|
|
|
import ( |
|
|
|
"sort" |
|
|
|
"strings" |
|
|
|
|
|
|
|
"github.com/globalsign/mgo/bson" |
|
|
|
) |
|
|
|
|
|
|
|
// A Tag associates a story with other content, like other stories, logs and more.
|
|
|
|
type Tag struct { |
|
|
|
Kind string `bson:"kind"` |
|
|
@ -10,3 +17,20 @@ type Tag struct { |
|
|
|
func (tag *Tag) Equal(other Tag) bool { |
|
|
|
return tag.Kind == other.Kind && tag.Name == other.Name |
|
|
|
} |
|
|
|
|
|
|
|
// ListTags lists all tags
|
|
|
|
func ListTags() ([]Tag, error) { |
|
|
|
tags := make([]Tag, 0, 64) |
|
|
|
err := storyCollection.Find(bson.M{"tags": bson.M{"$ne": nil}}).Distinct("tags", &tags) |
|
|
|
|
|
|
|
sort.Slice(tags, func(i, j int) bool { |
|
|
|
kindCmp := strings.Compare(tags[i].Kind, tags[j].Kind) |
|
|
|
if kindCmp != 0 { |
|
|
|
return kindCmp < 0 |
|
|
|
} |
|
|
|
|
|
|
|
return strings.Compare(tags[i].Name, tags[j].Name) < 0 |
|
|
|
}) |
|
|
|
|
|
|
|
return tags, err |
|
|
|
} |