140 lines
3.7 KiB
Go
140 lines
3.7 KiB
Go
package remote
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
type Client struct {
|
|
config *Config
|
|
http *http.Client
|
|
}
|
|
|
|
func NewClient(config *Config) (*Client, error) {
|
|
return &Client{
|
|
config: config,
|
|
}, nil
|
|
}
|
|
|
|
func (c *Client) ParseArgs() error {
|
|
for i := 0; i < len(c.config.args); i++ {
|
|
arg := c.config.args[i]
|
|
switch fromString(arg) {
|
|
case LISTS:
|
|
log.Printf("lists: %v", fmt.Sprint(c.Lists()))
|
|
case TASKS:
|
|
listID := c.config.args[i+1]
|
|
i += 1
|
|
log.Printf("tasks: %v", fmt.Sprint(c.Tasks(List{ID: listID})))
|
|
case NEW:
|
|
listID := c.config.args[i+1]
|
|
i += 1
|
|
taskTitle := c.config.args[i+1]
|
|
i += 1
|
|
tagsCSV := c.config.args[i+1]
|
|
i += 1
|
|
log.Printf("new: %v", fmt.Sprint(c.NewTask(List{ID: listID}, Task{Title: taskTitle}, tagsCSV)))
|
|
case OPEN:
|
|
taskID := c.config.args[i+1]
|
|
i += 1
|
|
log.Printf("open: %v", fmt.Sprint(c.OpenTask(Task{ID: taskID})))
|
|
case CLOSE:
|
|
taskID := c.config.args[i+1]
|
|
i += 1
|
|
log.Printf("close: %v", fmt.Sprint(c.CloseTask(Task{ID: taskID})))
|
|
default:
|
|
log.Printf("unknown arg %q", arg)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Client) Lists() (Lists, error) {
|
|
client, err := NewHTTP(c.config.remote, c.config.password)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var lists loadListsResponse
|
|
if resp, err := client.Get("ajax.php?loadLists"); err != nil {
|
|
return nil, err
|
|
} else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil {
|
|
return nil, fmt.Errorf("cannot read lists: %v", err)
|
|
}
|
|
return Lists(lists.Lists), nil
|
|
}
|
|
|
|
func (c *Client) Tasks(list List) (Tasks, error) {
|
|
client, err := NewHTTP(c.config.remote, c.config.password)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var tasks loadTasksResponse
|
|
if resp, err := client.Get("ajax.php?loadTasks&list=" + list.ID); err != nil {
|
|
return nil, err
|
|
} else if err := json.NewDecoder(resp.Body).Decode(&tasks); err != nil {
|
|
return nil, fmt.Errorf("cannot read tasks: %v", err)
|
|
}
|
|
return Tasks(tasks.Tasks), nil
|
|
}
|
|
|
|
func (c *Client) NewTask(list List, task Task, tags string) error {
|
|
client, err := NewHTTP(c.config.remote, c.config.password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
form := url.Values{}
|
|
form.Add("list", list.ID)
|
|
form.Add("title", task.Title)
|
|
form.Add("tag", "/"+tags+"/")
|
|
var lists loadListsResponse
|
|
if resp, err := client.Post("ajax.php?newTask", form.Encode()); err != nil {
|
|
return err
|
|
} else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil {
|
|
return fmt.Errorf("cannot make task: %v", err)
|
|
} else if resp.StatusCode != http.StatusOK {
|
|
return fmt.Errorf("non 200 status on new task: %v", resp.StatusCode)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Client) CloseTask(task Task) error {
|
|
client, err := NewHTTP(c.config.remote, c.config.password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
form := url.Values{}
|
|
form.Add("id", task.ID)
|
|
form.Add("compl", "1")
|
|
var lists loadListsResponse
|
|
if resp, err := client.Post("ajax.php?completeTask="+task.ID, form.Encode()); err != nil {
|
|
return err
|
|
} else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil {
|
|
return fmt.Errorf("cannot close task: %v", err)
|
|
} else if resp.StatusCode != http.StatusOK {
|
|
return fmt.Errorf("non 200 status on close task: %v", resp.StatusCode)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Client) OpenTask(task Task) error {
|
|
client, err := NewHTTP(c.config.remote, c.config.password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
form := url.Values{}
|
|
form.Add("id", task.ID)
|
|
form.Add("compl", "0")
|
|
var lists loadListsResponse
|
|
if resp, err := client.Post("ajax.php?completeTask="+task.ID, form.Encode()); err != nil {
|
|
return err
|
|
} else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil {
|
|
return fmt.Errorf("cannot close task: %v", err)
|
|
} else if resp.StatusCode != http.StatusOK {
|
|
return fmt.Errorf("non 200 status on open task: %v", resp.StatusCode)
|
|
}
|
|
return nil
|
|
}
|