transmet/categories/categories.go

65 lines
1.6 KiB
Go
Raw Normal View History

2015-05-12 05:06:28 +00:00
package categories
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
"strings"
2015-05-12 05:06:28 +00:00
)
type Category struct {
Id int
Name string
Parent sql.NullInt64
Children []*Category
}
var CategoriesTree []*Category
var CategoriesFlat map[int]*Category
// Cavet: slight cheat. All parents must have Category_id < their children.
func LoadCategories(db *sql.DB) {
CategoriesTree = []*Category{}
CategoriesFlat = make(map[int]*Category)
2015-05-19 15:32:35 +00:00
rows, err := db.Query("select categories.id, categories.name, categories.parent_id from categories order by coalesce(parent_id, id), parent_id is not null")
2015-05-12 05:06:28 +00:00
if err != nil {
fmt.Println("DB Error loading Categories:", err)
return
}
2015-05-18 03:18:28 +00:00
defer rows.Close()
2015-05-12 05:06:28 +00:00
for rows.Next() {
category := &Category{Children: []*Category{}}
err = rows.Scan(&category.Id, &category.Name, &category.Parent)
if err != nil {
fmt.Println("Categories DB Error: ", err)
}
2015-05-19 15:32:35 +00:00
2015-05-12 05:06:28 +00:00
CategoriesFlat[category.Id] = category
if category.Parent.Valid {
pid := int(category.Parent.Int64)
CategoriesFlat[pid].Children = append(CategoriesFlat[pid].Children, category)
} else {
CategoriesTree = append(CategoriesTree, category)
}
}
}
// get the number of parents a category has
func (category *Category) Depth() int {
depth := 0
current := category
for current.Parent.Valid {
current = CategoriesFlat[int(current.Parent.Int64)]
depth ++
}
return depth
}
// Helper function for templates (add form select list)
func (category *Category) ToString() string {
return strings.Repeat("- ", category.Depth()) + category.Name
2015-05-12 05:06:28 +00:00
}