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) }