From 16547ab7b86971c92b2c2c7e2f582d4a81c51342 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Fri, 16 Aug 2024 13:25:06 +0100 Subject: [PATCH] mem projects --- go.mod | 2 +- main.go | 6 +- service/memory.go | 33 +++++++++++ service/memory_test.go | 20 +++++++ service/project.go | 6 ++ service/storage.go | 13 +++++ {task => service}/task.go | 2 +- service/todoist.go | 112 ++++++++++++++++++++++++++++++++++++++ todoist.go | 34 ------------ 9 files changed, 188 insertions(+), 40 deletions(-) create mode 100644 service/memory.go create mode 100644 service/memory_test.go create mode 100644 service/project.go create mode 100644 service/storage.go rename {task => service}/task.go (98%) create mode 100644 service/todoist.go delete mode 100644 todoist.go diff --git a/go.mod b/go.mod index a543e4d..c1d7817 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module code.ewintr.nl/hatd-planner +module code.ewintr.nl/planner go 1.21.5 diff --git a/main.go b/main.go index 6b4c6c1..aab234c 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,6 @@ package main -import "os" - func main() { - td := NewTodoist(os.Getenv("TODOIS_API_TOKEN")) - td.Run() + // td := NewTodoist(os.Getenv("TODOIST_API_TOKEN"), "https://api.todoist.com") + // td.Run() } diff --git a/service/memory.go b/service/memory.go new file mode 100644 index 0000000..16f4226 --- /dev/null +++ b/service/memory.go @@ -0,0 +1,33 @@ +package service + +type Memory struct { + projects map[string]Project +} + +func NewMemory() *Memory { + return &Memory{ + projects: make(map[string]Project), + } +} + +func (m *Memory) StoreProject(project Project) error { + m.projects[project.ID] = project + + return nil +} + +func (m *Memory) FindProject(id string) (Project, error) { + project, ok := m.projects[id] + if !ok { + return Project{}, ErrNotFound + } + return project, nil +} + +func (m *Memory) FindAllProjects() ([]Project, error) { + projects := make([]Project, 0, len(m.projects)) + for _, p := range m.projects { + projects = append(projects, p) + } + return projects, nil +} diff --git a/service/memory_test.go b/service/memory_test.go new file mode 100644 index 0000000..5454ea8 --- /dev/null +++ b/service/memory_test.go @@ -0,0 +1,20 @@ +package service_test + +import ( + "testing" + + "code.ewintr.nl/planner/service" +) + +func TestMemoryProjects(t *testing.T) { + t.Parallel() + + mem := service.NewMemory() + actProjects, actErr := mem.FindAllProjects() + if actErr != nil { + t.Errorf("exp nil, got %v", actErr) + } + if len(actProjects) != 0 { + t.Errorf("exp 0, got %d", len(actProjects)) + } +} diff --git a/service/project.go b/service/project.go new file mode 100644 index 0000000..7e3624d --- /dev/null +++ b/service/project.go @@ -0,0 +1,6 @@ +package service + +type Project struct { + ID string + Name string +} diff --git a/service/storage.go b/service/storage.go new file mode 100644 index 0000000..ab69c47 --- /dev/null +++ b/service/storage.go @@ -0,0 +1,13 @@ +package service + +import "errors" + +var ( + ErrNotFound = errors.New("not found") +) + +type Repository interface { + FindProject(id string) (Project, error) + FindAllProjects() ([]Project, error) + StoreProject(project Project) error +} diff --git a/task/task.go b/service/task.go similarity index 98% rename from task/task.go rename to service/task.go index 79f2ff0..f7bddfe 100644 --- a/task/task.go +++ b/service/task.go @@ -1,4 +1,4 @@ -package task +package service import ( "encoding/json" diff --git a/service/todoist.go b/service/todoist.go new file mode 100644 index 0000000..d4f055e --- /dev/null +++ b/service/todoist.go @@ -0,0 +1,112 @@ +package service + +import ( + "fmt" + "io" + "net/http" + "net/url" + "time" +) + +type Todoist struct { + apiKey string + baseURL string + client *http.Client + syncToken string + done chan bool +} + +func NewTodoist(apiKey, baseURL string) *Todoist { + td := &Todoist{ + apiKey: apiKey, + baseURL: baseURL, + done: make(chan bool), + client: http.DefaultClient, + } + + return td +} + +func (td *Todoist) Run() { + ticker := time.NewTicker(time.Second) + for { + select { + case <-td.done: + return + case <-ticker.C: + fmt.Println("hoi") + if err := td.Sync(); err != nil { + fmt.Println(err) + } + } + } +} + +func (td *Todoist) Sync() error { + if td.syncToken == "" { + return td.FullSync() + } + + return nil +} + +func (td *Todoist) FullSync() error { + res := td.do(http.MethodGet) + if res.Error != nil { + return res.Error + } + + return nil +} + +type tdResp struct { + Status int + Body []byte + Error error +} + +func (td *Todoist) do(method string) tdResp { + u, err := url.Parse(fmt.Sprintf("%s/sync/v9/sync", td.baseURL)) + if err != nil { + return tdResp{ + Error: err, + } + } + formData := url.Values{ + "syncToken": {"*"}, + "resource_types": {`["projects"]`}, + } + u.RawQuery = formData.Encode() + req, err := http.NewRequest(method, u.String(), nil) + if err != nil { + return tdResp{ + Error: err, + } + } + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", td.apiKey)) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + res, err := td.client.Do(req) + if err != nil { + return tdResp{ + Error: err, + } + } + + if res.StatusCode != http.StatusOK { + return tdResp{ + Error: fmt.Errorf("status code: %d", res.StatusCode), + } + } + + var body []byte + if body, err = io.ReadAll(res.Body); err != nil { + return tdResp{ + Error: err, + } + } + return tdResp{ + Body: body, + } + +} diff --git a/todoist.go b/todoist.go deleted file mode 100644 index 2278773..0000000 --- a/todoist.go +++ /dev/null @@ -1,34 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "time" -) - -type Todoist struct { - apiKey string - client http.Client - done chan bool -} - -func NewTodoist(apiKey string) *Todoist { - td := &Todoist{ - apiKey: apiKey, - done: make(chan bool), - } - - return td -} - -func (td *Todoist) Run() { - ticker := time.NewTicker(time.Second) - for { - select { - case <-td.done: - return - case <-ticker.C: - fmt.Println("hoi") - } - } -}