1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
Chris Cummer 140dd553e0
WTF-781 Todoist project ID conversion (#789)
* WTF-781 Switch Todoist IDs from `int` to `string`

On platforms that convert an `int` to `int32`, like the Raspberry Pi,
an `int` is not large enough to store Todoist project IDs.

Using a `string` ensures this never becomes a problem.

Fixes #781

Signed-off-by: Chris Cummer <chriscummer@me.com>
2019-12-16 20:25:52 -08:00

150 lines
2.8 KiB
Go

package todoist
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
// Project is a model of todoist project entity
type Project struct {
ID uint `json:"id"`
Name string `json:"name"`
CommentCount int `json:"comment_count"`
Order int `json:"order"`
Indent int `json:"indent"`
}
func decodeProject(body io.ReadCloser) (Project, error) {
defer body.Close()
decoder := json.NewDecoder(body)
var project Project
if err := decoder.Decode(&project); err != nil {
return Project{}, err
}
return project, nil
}
// ListProject return all projects
//
// Example:
// todoist.Token = "your token"
// projects, err := todoist.ListProject()
// if err != nil {
// panic(err)
// }
// fmt.Println(projects)
func ListProject() ([]Project, error) {
res, err := makeRequest(http.MethodGet, "projects", nil)
if err != nil {
return []Project{}, err
}
defer res.Body.Close()
decoder := json.NewDecoder(res.Body)
var projects []Project
if err := decoder.Decode(&projects); err != nil {
return []Project{}, err
}
return projects, nil
}
// GetProject return a project by id
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func GetProject(id uint) (Project, error) {
path := fmt.Sprintf("projects/%d", id)
res, err := makeRequest(http.MethodGet, path, nil)
if err != nil {
return Project{}, err
}
return decodeProject(res.Body)
}
// CreateProject create a new project with a name
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.CreateProject("New Project")
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func CreateProject(name string) (Project, error) {
project := struct {
Name string `json:"name"`
}{
name,
}
res, err := makeRequest(http.MethodPost, "projects", project)
if err != nil {
return Project{}, err
}
return decodeProject(res.Body)
}
// Delete project
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// err = project.Delete()
// if err != nil {
// panic(err)
// }
func (p Project) Delete() error {
path := fmt.Sprintf("projects/%d", p.ID)
_, err := makeRequest(http.MethodDelete, path, nil)
if err != nil {
return err
}
return nil
}
// Update project
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// project.Name = "updated"
// err = project.Update()
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func (p Project) Update() error {
path := fmt.Sprintf("projects/%d", p.ID)
project := struct {
Name string `json:"name"`
}{
p.Name,
}
_, err := makeRequest(http.MethodPost, path, project)
if err != nil {
return err
}
return nil
}