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  }