Dan Anglin
3e5cd598d0
- Introduced internal packages for different components of the kanban board. - Simplified and refactored the database tests based on linting feedback. - Add tests for the board package.
140 lines
3.3 KiB
Go
140 lines
3.3 KiB
Go
package board
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
|
|
"forge.dananglin.me.uk/code/dananglin/pelican/internal/card"
|
|
"forge.dananglin.me.uk/code/dananglin/pelican/internal/database"
|
|
"forge.dananglin.me.uk/code/dananglin/pelican/internal/status"
|
|
bolt "go.etcd.io/bbolt"
|
|
)
|
|
|
|
// LoadBoard reads the board from the database. If no board exists then a new one will be created.
|
|
func LoadBoard(path string) (*bolt.DB, error) {
|
|
db, err := database.OpenDatabase(path)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to open the database, %w", err)
|
|
}
|
|
|
|
statusList, err := ReadStatusList(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(statusList) == 0 {
|
|
newStatusList := status.NewDefaultStatusList()
|
|
if err := database.WriteStatusList(db, newStatusList); err != nil {
|
|
return nil, fmt.Errorf("unable to save the default status list to the database, %w", err)
|
|
}
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
// ReadStatusList returns an ordered list of statuses from the database.
|
|
func ReadStatusList(db *bolt.DB) ([]status.Status, error) {
|
|
statuses, err := database.ReadStatusList(db)
|
|
if err != nil {
|
|
return statuses, fmt.Errorf("unable to read the status list, %w", err)
|
|
}
|
|
|
|
sort.Sort(status.ByStatusOrder(statuses))
|
|
|
|
return statuses, nil
|
|
}
|
|
|
|
// TODO: Finish implementation.
|
|
func ReadStatus(db *bolt.DB) (status.Status, error) {
|
|
return status.Status{}, nil
|
|
}
|
|
|
|
// TODO: Finish implementation.
|
|
func CreateStatus(db *bolt.DB) error {
|
|
return nil
|
|
}
|
|
|
|
// TODO: Finish implementation.
|
|
func UpdateStatus(db *bolt.DB) error {
|
|
return nil
|
|
}
|
|
|
|
// TODO: Finish implementation.
|
|
func DeleteStatus(db *bolt.DB) error {
|
|
return nil
|
|
}
|
|
|
|
// CreateCard creates a card in the database.
|
|
func CreateCard(db *bolt.DB, title, content string) error {
|
|
statusList, err := database.ReadStatusList(db)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to read the status list, %w", err)
|
|
}
|
|
|
|
if len(statusList) == 0 {
|
|
return statusListEmptyError{}
|
|
}
|
|
|
|
card := card.Card{
|
|
ID: -1,
|
|
Title: title,
|
|
Content: content,
|
|
}
|
|
|
|
cardID, err := database.WriteCard(db, card)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to write card to the database, %w", err)
|
|
}
|
|
|
|
cardIDs := statusList[0].CardIds
|
|
|
|
cardIDs = append(cardIDs, cardID)
|
|
|
|
statusList[0].CardIds = cardIDs
|
|
|
|
// TODO: change the below to save a single status
|
|
if err := database.WriteStatusList(db, statusList); err != nil {
|
|
return fmt.Errorf("unable to write status list to the database, %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ReadCard returns a Card value from the database.
|
|
func ReadCard(db *bolt.DB, id int) (card.Card, error) {
|
|
c, err := database.ReadCard(db, id)
|
|
if err != nil {
|
|
return card.Card{}, fmt.Errorf("unable to read card [%d] from the database, %w", id, err)
|
|
}
|
|
|
|
return c, nil
|
|
}
|
|
|
|
// UpdateCard modifies an existing card and saves the modification to the database.
|
|
func UpdateCard(db *bolt.DB, id int, title, content string) error {
|
|
c, err := ReadCard(db, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Title = title
|
|
c.Content = content
|
|
|
|
if _, err := database.WriteCard(db, c); err != nil {
|
|
return fmt.Errorf("unable to write card to the database, %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MoveCard moves a card between statuses.
|
|
// TODO: finish implementation.
|
|
func MoveCard(db *bolt.DB, fromStatusID, toStatusID int) error {
|
|
return nil
|
|
}
|
|
|
|
// DeleteCard deletes a card from the database.
|
|
// TODO: finish implementation.
|
|
func DeleteCard(db *bolt.DB, id int) error {
|
|
return nil
|
|
}
|