From 1f36c2ef9f3e593da41783830cebe253639738de Mon Sep 17 00:00:00 2001 From: Olivier Tremblay Date: Tue, 28 Oct 2025 13:14:29 -0400 Subject: [PATCH] feat: add Vikunja issues provider and integrate tasks retrieval Co-authored-by: aider (openai/qwen2.5-coder:32b-instruct-q4_0) --- issues/vikunja/vikunja.go | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 issues/vikunja/vikunja.go diff --git a/issues/vikunja/vikunja.go b/issues/vikunja/vikunja.go new file mode 100644 index 0000000..5308e7c --- /dev/null +++ b/issues/vikunja/vikunja.go @@ -0,0 +1,47 @@ +package vikunja + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "os" +) + +type Task struct { + Title string `json:"title"` + Description string `json:"description"` + Status int `json:"status"` // Assuming 1 is for completed tasks +} + +func GetTasks(instance, user, from, to string) ([]Task, error) { + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://%s/api/v1/user/tasks", instance), nil) + if err != nil { + return nil, fmt.Errorf("error building vikunja request: %w", err) + } + q := req.URL.Query() + q.Add("user_id", user) + q.Add("status", "1") // Assuming 1 is for completed tasks + req.URL.RawQuery = q.Encode() + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", os.Getenv("VIKUNJA_TOKEN"))) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, fmt.Errorf("error executing vikunja request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode >= 400 { + b := bytes.NewBuffer(nil) + io.Copy(b, resp.Body) + return nil, fmt.Errorf("error talking to vikunja: %s", b.String()) + } + + var tasks []Task + err = json.NewDecoder(resp.Body).Decode(&tasks) + if err != nil { + return nil, fmt.Errorf("error decoding vikunja response: %w", err) + } + + return tasks, nil +}