MyTinyTodo2/mytinytodo/remote/client.go

141 lines
3.6 KiB
Go

package remote
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
)
type Client struct {
config *Config
http *http.Client
session *http.Cookie
}
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 arg {
case "list":
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 "close":
taskID := c.config.args[i+1]
i += 1
log.Printf("close: %v", fmt.Sprint(c.CloseTask(Task{ID: taskID})))
case "open":
taskID := c.config.args[i+1]
i += 1
log.Printf("open: %v", fmt.Sprint(c.OpenTask(Task{ID: taskID})))
default:
log.Printf("unknown arg %q", arg)
}
}
return nil
}
func (c *Client) Lists() ([]List, 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, nil
}
func (c *Client) Tasks(list List) ([]Task, 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, nil
}
func (c *Client) NewTask(list List, task Task, tags string) error {
log.Printf("new: %v < %v", list, task.Title)
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)
}
log.Print(lists)
return nil
}
func (c *Client) CloseTask(task Task) error {
log.Printf("close: %v", task.ID)
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)
}
log.Print(lists)
return nil
}
func (c *Client) OpenTask(task Task) error {
log.Printf("open: %v", task.ID)
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)
}
log.Print(lists)
return nil
}