pelican/kanban.go

81 lines
1.6 KiB
Go
Raw Normal View History

package main
2021-09-15 10:23:19 +01:00
import (
"fmt"
"sort"
bolt "go.etcd.io/bbolt"
)
// Card represents a card on a Kanban board.
type Card struct {
ID int
Title string
Content string
}
// Status represents the status of the Kanban board.
type Status struct {
ID int
Name string
CardIds []int
2021-09-15 10:23:19 +01:00
Order int
}
2021-09-15 10:23:19 +01:00
// ByStatusOrder implements sort.Interface for []Status based on the Order field.
type ByStatusOrder []Status
func (s ByStatusOrder) Len() int {
return len(s)
}
func (s ByStatusOrder) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s ByStatusOrder) Less(i, j int) bool {
return s[i].Order < s[j].Order
}
// readStatuses reads all statuses from the database. If there are no statuses in the database then the default
// status list is created and stored in the database. Before returning the status list, the list is ordered based
// on the status' 'Order' field.
// TODO: function needs to be unit tested.
func readStatuses(db *bolt.DB) ([]Status, error) {
statuses, err := loadAllStatuses(db)
if err != nil {
return statuses, fmt.Errorf("unable to read statuses, %w", err)
}
if len(statuses) == 0 {
if err := createDefaultStatusList(db); err != nil {
return statuses, fmt.Errorf("unable to create the default statuses, %w", err)
}
readStatuses(db)
}
sort.Sort(ByStatusOrder(statuses))
return statuses, nil
}
// createDefaultStatusList creates the default list of statuses and saves the statuses to the database.
func createDefaultStatusList(db *bolt.DB) error {
s := []Status{
{
Name: "To Do",
Order: 1,
},
{
Name: "Doing",
Order: 2,
},
{
Name: "Done",
Order: 3,
},
}
return saveStatuses(db, s)
}