From 274399e5abb14c8e4a491d74d105a73832c3f731 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 10 Sep 2021 04:57:54 +0000 Subject: [PATCH] Fetching sections and tasks --- asana/client.go | 225 +++++++++++++++++++++++++++++++----------------- main.go | 55 ++++++++---- 2 files changed, 181 insertions(+), 99 deletions(-) diff --git a/asana/client.go b/asana/client.go index ea23a48..f79e3ad 100644 --- a/asana/client.go +++ b/asana/client.go @@ -10,144 +10,207 @@ import "os" import "github.com/firestuff/asana-rules/headers" type Client struct { - client *http.Client + client *http.Client } type Project struct { - GID string `json:"gid"` - Name string `json:"name"` + GID string `json:"gid"` + Name string `json:"name"` +} + +type Section struct { + GID string `json:"gid"` + Name string `json:"name"` } type Task struct { - GID string `json:"gid"` - Name string `json:"name"` + GID string `json:"gid"` + Name string `json:"name"` } type User struct { - GID string `json:"gid"` - Name string `json:"name"` - Email string `json:"email"` + GID string `json:"gid"` + Name string `json:"name"` + Email string `json:"email"` +} + +type UserTaskList struct { + GID string `json:"gid"` + Name string `json:"name"` } type Workspace struct { - GID string `json:"gid"` - Name string `json:"name"` + GID string `json:"gid"` + Name string `json:"name"` } type projectsResponse struct { - Data []*Project `json:"data"` + Data []*Project `json:"data"` +} + +type sectionsResponse struct { + Data []*Section `json:"data"` +} + +type tasksResponse struct { + Data []*Task `json:"data"` } type userResponse struct { - Data *User `json:"data"` + Data *User `json:"data"` +} + +type userTaskListResponse struct { + Data *UserTaskList `json:"data"` } type workspacesResponse struct { - Data []*Workspace `json:"data"` + Data []*Workspace `json:"data"` } func NewClient(token string) *Client { - c := &Client{ - client: &http.Client{}, - } + c := &Client{ + client: &http.Client{}, + } - hdrs := headers.NewHeaders(c.client) + hdrs := headers.NewHeaders(c.client) hdrs.Add("Accept", "application/json") hdrs.Add("Authorization", fmt.Sprintf("Bearer %s", token)) - return c + return c } func NewClientFromEnv() *Client { - return NewClient(os.Getenv("ASANA_TOKEN")) + return NewClient(os.Getenv("ASANA_TOKEN")) } func (c *Client) GetMe() (*User, error) { - resp := &userResponse{} - err := c.get("users/me", nil, resp) - if err != nil { - return nil, err - } - return resp.Data, nil + resp := &userResponse{} + err := c.get("users/me", nil, resp) + if err != nil { + return nil, err + } + return resp.Data, nil } func (c *Client) GetProjects(workspaceGID string) ([]*Project, error) { - resp := &projectsResponse{} - path := fmt.Sprintf("workspaces/%s/projects", workspaceGID) - err := c.get(path, nil, resp) - if err != nil { - return nil, err - } - return resp.Data, nil + path := fmt.Sprintf("workspaces/%s/projects", workspaceGID) + resp := &projectsResponse{} + err := c.get(path, nil, resp) + if err != nil { + return nil, err + } + return resp.Data, nil } -func (c *Client) GetUserTaskList(userGID string) (*UserTaskList, error) { - resp := &userTaskListResponse{} - path := fmt.Sprintf("users/%s/user_task_list", userGID) - err := c.get(path, nil, resp) - if err != nil { - return nil, err - } - return resp.Data, nil +func (c *Client) GetSections(projectGID string) ([]*Section, error) { + path := fmt.Sprintf("projects/%s/sections", projectGID) + resp := §ionsResponse{} + err := c.get(path, nil, resp) + if err != nil { + return nil, err + } + return resp.Data, nil +} + +func (c *Client) GetTasksFromSection(sectionGID string) ([]*Task, error) { + path := fmt.Sprintf("sections/%s/tasks", sectionGID) + resp := &tasksResponse{} + err := c.get(path, nil, resp) + if err != nil { + return nil, err + } + return resp.Data, nil +} + +func (c *Client) GetUserTaskList(userGID, workspaceGID string) (*UserTaskList, error) { + path := fmt.Sprintf("users/%s/user_task_list", userGID) + values := &url.Values{} + values.Add("workspace", workspaceGID) + resp := &userTaskListResponse{} + err := c.get(path, values, resp) + if err != nil { + return nil, err + } + return resp.Data, nil } func (c *Client) GetWorkspaces() ([]*Workspace, error) { - resp := &workspacesResponse{} - err := c.get("workspaces", nil, resp) - if err != nil { - return nil, err - } - return resp.Data, nil + resp := &workspacesResponse{} + err := c.get("workspaces", nil, resp) + if err != nil { + return nil, err + } + return resp.Data, nil } // Returns one workspace if there is only one func (c *Client) GetWorkspace() (*Workspace, error) { - workspaces, err := c.GetWorkspaces() - if err != nil { - return nil, err - } + workspaces, err := c.GetWorkspaces() + if err != nil { + return nil, err + } - if len(workspaces) != 1 { - return nil, fmt.Errorf("%d workspaces found", len(workspaces)) - } + if len(workspaces) != 1 { + return nil, fmt.Errorf("%d workspaces found", len(workspaces)) + } - return workspaces[0], nil + return workspaces[0], nil } const baseURL = "https://app.asana.com/api/1.0/" func (c *Client) get(path string, values *url.Values, out interface{}) error { - if values == nil { - values = &url.Values{} - } - values.Add("limit", "100") + if values == nil { + values = &url.Values{} + } + values.Add("limit", "100") - url := fmt.Sprintf("%s%s?%s", baseURL, path, values.Encode()) - fmt.Printf("%s\n", url) + url := fmt.Sprintf("%s%s?%s", baseURL, path, values.Encode()) - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return err - } + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return err + } - resp, err := c.client.Do(req) - if err != nil { - return err - } + resp, err := c.client.Do(req) + if err != nil { + return err + } - if resp.StatusCode != 200 { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - return fmt.Errorf("%s: %s", resp.Status, string(body)) - } + if resp.StatusCode != 200 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + return fmt.Errorf("%s: %s", resp.Status, string(body)) + } - dec := json.NewDecoder(resp.Body) - err = dec.Decode(out) - if err != nil { - return err - } + dec := json.NewDecoder(resp.Body) + err = dec.Decode(out) + if err != nil { + return err + } - return nil + return nil +} + +func (s *Section) String() string { + return fmt.Sprintf("%s (%s)", s.GID, s.Name) +} + +func (t *Task) String() string { + return fmt.Sprintf("%s (%s)", t.GID, t.Name) +} + +func (u *User) String() string { + return fmt.Sprintf("%s (%s <%s>)", u.GID, u.Name, u.Email) +} + +func (utl *UserTaskList) String() string { + return fmt.Sprintf("%s (%s)", utl.GID, utl.Name) +} + +func (wrk *Workspace) String() string { + return fmt.Sprintf("%s (%s)", wrk.GID, wrk.Name) } diff --git a/main.go b/main.go index 91761be..0b20d96 100644 --- a/main.go +++ b/main.go @@ -5,26 +5,45 @@ import "fmt" import "github.com/firestuff/asana-rules/asana" func main() { - a := asana.NewClientFromEnv() + a := asana.NewClientFromEnv() - /* - me, err := a.GetMe() - if err != nil { - panic(err) - } - */ + me, err := a.GetMe() + if err != nil { + panic(err) + } - wrk, err := a.GetWorkspace() - if err != nil { - panic(err) - } + fmt.Printf("User: %s\n", me) - prjs, err := a.GetProjects(wrk.GID) - if err != nil { - panic(err) - } + wrk, err := a.GetWorkspace() + if err != nil { + panic(err) + } - for _, prj := range prjs { - fmt.Printf("%#v\n", prj) - } + fmt.Printf("Workspace: %s\n", wrk) + + utl, err := a.GetUserTaskList(me.GID, wrk.GID) + if err != nil { + panic(err) + } + + fmt.Printf("User Task List: %s\n", utl) + + secs, err := a.GetSections(utl.GID) + if err != nil { + panic(err) + } + + fmt.Printf("Sections:\n") + for _, sec := range secs { + fmt.Printf("\t%s\n", sec) + + tasks, err := a.GetTasksFromSection(sec.GID) + if err != nil { + panic(err) + } + + for _, task := range tasks { + fmt.Printf("\t\t%s\n", task) + } + } }