80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package main
|
|
|
|
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
|
|
Order int
|
|
}
|
|
|
|
// 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)
|
|
}
|