Skip to content

Commit

Permalink
implement project get methods
Browse files Browse the repository at this point in the history
  • Loading branch information
kobtea committed Jan 23, 2017
1 parent 5871048 commit 70acade
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
22 changes: 22 additions & 0 deletions todoist/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type Client struct {
SyncState *SyncState
Logger *log.Logger
Item *ItemManager
Project *ProjectManager
queue []Command
}

Expand Down Expand Up @@ -68,6 +69,7 @@ func NewClient(endpoint, token, sync_token, cache_dir string, logger *log.Logger
Logger: logger,
}
c.Item = &ItemManager{c}
c.Project = &ProjectManager{c}
if err = c.readCache(); err != nil {
c.resetState()
}
Expand Down Expand Up @@ -199,6 +201,26 @@ func (c *Client) updateState(state *SyncState) {
}
}
}
for _, project := range state.Projects {
cachedProject := c.Project.Resolve(project.ID)
if cachedProject == nil {
if !project.IsDeleted {
c.SyncState.Projects = append(c.SyncState.Projects, project)
}
} else {
if project.IsDeleted {
var res []Project
for _, p := range c.SyncState.Projects {
if !p.Equal(cachedProject) {
res = append(res, p)
}
}
c.SyncState.Projects = res
} else {
cachedProject = &project
}
}
}
c.SyncState = state
}

Expand Down
76 changes: 76 additions & 0 deletions todoist/project.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package todoist

import (
"context"
"errors"
"fmt"
"github.com/stretchr/goweb/http"
"net/url"
)

type Project struct {
Expand Down Expand Up @@ -86,3 +89,76 @@ func (m *ProjectManager) Unarchive(ids []ID) error {
m.queue = append(m.queue, command)
return nil
}

type ProjectGetResponse struct {
Project Project
Notes []Note
}

func (m *ProjectManager) Get(ctx context.Context, id ID) (*ProjectGetResponse, error) {
values := url.Values{"project_id": {id.String()}}
req, err := m.NewRequest(ctx, http.MethodGet, "projects/get", values)
if err != nil {
return nil, err
}
res, err := m.HTTPClient.Do(req)
if err != nil {
return nil, err
}
var out ProjectGetResponse
err = decodeBody(res, &out)
if err != nil {
return nil, err
}
return &out, nil
}

type ProjectGetDataResponse struct {
Project Project
Items []Item
}

func (m *ProjectManager) GetData(ctx context.Context, id ID) (*ProjectGetDataResponse, error) {
values := url.Values{"project_id": {id.String()}}
req, err := m.NewRequest(ctx, http.MethodGet, "projects/get_data", values)
if err != nil {
return nil, err
}
res, err := m.HTTPClient.Do(req)
if err != nil {
return nil, err
}
var out ProjectGetDataResponse
err = decodeBody(res, &out)
if err != nil {
return nil, err
}
return &out, nil
}

func (m *ProjectManager) GetArchived(ctx context.Context) (*[]Project, error) {
values := url.Values{}
req, err := m.NewRequest(ctx, http.MethodGet, "projects/get_archived", values)
if err != nil {
return nil, err
}
res, err := m.HTTPClient.Do(req)
if err != nil {
return nil, err
}
var out []Project
err = decodeBody(res, &out)
if err != nil {
return nil, err
}
return &out, nil
}

func (m *ProjectManager) Resolve(id ID) *Project {
for _, project := range m.SyncState.Projects {
if project.ID == id {
return &project
}
}
return nil
}

0 comments on commit 70acade

Please sign in to comment.