github.com/wtfutil/wtf@v0.43.0/modules/todo_plus/backend/trello.go (about) 1 package backend 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/adlio/trello" 8 "github.com/olebedev/config" 9 ) 10 11 type Trello struct { 12 username string 13 boardName string 14 client *trello.Client 15 board string 16 projects []interface{} 17 } 18 19 func (todo *Trello) Title() string { 20 return "Trello" 21 } 22 23 func (todo *Trello) Setup(config *config.Config) { 24 todo.username = config.UString("username") 25 todo.boardName = config.UString("board") 26 todo.client = trello.NewClient( 27 config.UString("apiKey"), 28 config.UString("accessToken"), 29 ) 30 board, err := getBoardID(todo.client, todo.username, todo.boardName) 31 if err != nil { 32 log.Fatal(err) 33 } 34 todo.board = board 35 todo.projects = config.UList("lists") 36 } 37 38 func getBoardID(client *trello.Client, username, boardName string) (string, error) { 39 member, err := client.GetMember(username, trello.Defaults()) 40 if err != nil { 41 return "", err 42 } 43 44 boards, err := member.GetBoards(trello.Defaults()) 45 if err != nil { 46 return "", err 47 } 48 49 for _, board := range boards { 50 if board.Name == boardName { 51 return board.ID, nil 52 } 53 } 54 55 return "", fmt.Errorf("could not find board with name %s", boardName) 56 } 57 58 func getListId(client *trello.Client, boardID string, listName string) (string, error) { 59 board, err := client.GetBoard(boardID, trello.Defaults()) 60 if err != nil { 61 return "", err 62 } 63 64 boardLists, err := board.GetLists(trello.Defaults()) 65 if err != nil { 66 return "", err 67 } 68 69 for _, list := range boardLists { 70 if list.Name == listName { 71 return list.ID, nil 72 } 73 } 74 75 return "", nil 76 } 77 78 func getCardsOnList(client *trello.Client, listID string) ([]*trello.Card, error) { 79 list, err := client.GetList(listID, trello.Defaults()) 80 if err != nil { 81 return nil, err 82 } 83 84 cards, err := list.GetCards(trello.Defaults()) 85 if err != nil { 86 return nil, err 87 } 88 89 return cards, nil 90 } 91 92 func (todo *Trello) BuildProjects() []*Project { 93 projects := []*Project{} 94 95 for _, id := range todo.projects { 96 proj := todo.GetProject(id.(string)) 97 projects = append(projects, proj) 98 } 99 return projects 100 } 101 102 func (todo *Trello) GetProject(id string) *Project { 103 proj := &Project{ 104 Index: -1, 105 backend: todo, 106 } 107 108 listId, err := getListId(todo.client, todo.board, id) 109 if err != nil { 110 proj.Err = err 111 return proj 112 } 113 proj.ID = listId 114 proj.Name = id 115 116 tasks, err := todo.LoadTasks(listId) 117 proj.Err = err 118 proj.Tasks = tasks 119 120 return proj 121 } 122 123 func fromTrello(task *trello.Card) Task { 124 return Task{ 125 ID: task.ID, 126 Completed: task.Closed, 127 Name: task.Name, 128 } 129 } 130 131 func (todo *Trello) LoadTasks(id string) ([]Task, error) { 132 tasks, err := getCardsOnList(todo.client, id) 133 134 if err != nil { 135 return nil, err 136 } 137 var finalTasks []Task 138 for _, item := range tasks { 139 finalTasks = append(finalTasks, fromTrello(item)) 140 } 141 return finalTasks, nil 142 } 143 144 func (todo *Trello) CloseTask(task *Task) error { 145 args := trello.Arguments{ 146 "closed": "true", 147 } 148 if task != nil { 149 // Card has an internal client rep which we can't access 150 // Just force a lookup 151 internal, err := todo.client.GetCard(task.ID, trello.Arguments{}) 152 if err != nil { 153 return err 154 } 155 return internal.Update(args) 156 } 157 return nil 158 } 159 160 func (todo *Trello) DeleteTask(_ *Task) error { 161 return nil 162 } 163 164 func (todo *Trello) Sources() []string { 165 var result []string 166 for _, id := range todo.projects { 167 result = append(result, id.(string)) 168 } 169 return result 170 }