github.com/wtfutil/wtf@v0.43.0/modules/todo_plus/backend/todoist.go (about) 1 package backend 2 3 import ( 4 "fmt" 5 6 "github.com/olebedev/config" 7 "github.com/wtfutil/todoist" 8 ) 9 10 type Todoist struct { 11 projects []interface{} 12 } 13 14 func (todo *Todoist) Title() string { 15 return "Todoist" 16 } 17 18 func (todo *Todoist) Setup(config *config.Config) { 19 todoist.Token = config.UString("apiKey") 20 todo.projects = config.UList("projects") 21 } 22 23 func (todo *Todoist) BuildProjects() []*Project { 24 projects := []*Project{} 25 26 for _, id := range todo.projects { 27 i := fmt.Sprintf("%v", id) 28 proj := todo.GetProject(i) 29 projects = append(projects, proj) 30 } 31 return projects 32 } 33 34 func (todo *Todoist) GetProject(id string) *Project { 35 // Todoist seems to experience a lot of network issues on their side 36 // If we can't connect, handle it with an empty project until we can 37 proj := &Project{ 38 Index: -1, 39 backend: todo, 40 } 41 project, err := todoist.GetProject(id) 42 if err != nil { 43 proj.Err = err 44 return proj 45 } 46 47 proj.ID = project.ID 48 proj.Name = project.Name 49 50 tasks, err := todo.LoadTasks(proj.ID) 51 proj.Err = err 52 proj.Tasks = tasks 53 54 return proj 55 } 56 57 func toTask(task todoist.Task) Task { 58 return Task{ 59 ID: task.ID, 60 Completed: task.Completed, 61 Name: task.Content, 62 } 63 } 64 65 func (todo *Todoist) LoadTasks(id string) ([]Task, error) { 66 tasks, err := todoist.ListTask(todoist.QueryParam{"project_id": id}) 67 68 if err != nil { 69 return nil, err 70 } 71 var finalTasks []Task 72 for _, item := range tasks { 73 finalTasks = append(finalTasks, toTask(item)) 74 } 75 return finalTasks, nil 76 } 77 78 func (todo *Todoist) CloseTask(task *Task) error { 79 if task != nil { 80 internal := todoist.Task{ID: task.ID} 81 return internal.Close() 82 } 83 return nil 84 } 85 86 func (todo *Todoist) DeleteTask(task *Task) error { 87 if task != nil { 88 internal := todoist.Task{ID: task.ID} 89 return internal.Delete() 90 } 91 return nil 92 } 93 94 func (todo *Todoist) Sources() []string { 95 var result []string 96 for _, id := range todo.projects { 97 i := fmt.Sprintf("%v", id) 98 result = append(result, i) 99 } 100 return result 101 }