You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.2 KiB
143 lines
3.2 KiB
package task
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"git.drinkme.beer/yinghe/log"
|
|
|
|
"git.drinkme.beer/yinghe/asana/module"
|
|
"git.drinkme.beer/yinghe/asana/util"
|
|
)
|
|
|
|
type Data struct {
|
|
Request Request `json:"data"`
|
|
}
|
|
|
|
type Request struct {
|
|
ResourceSubtype string `json:"resource_subtype,omitempty"`
|
|
Assignee string `json:"assignee,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Completed bool `json:"completed"`
|
|
DueOn string `json:"due_on,omitempty"`
|
|
Liked bool `json:"linked,omitempty"`
|
|
// Notes refer to the content of each Ticket
|
|
Notes string `json:"notes,omitempty"`
|
|
HtmlNotes string `json:"html_notes,omitempty"`
|
|
StartOn string `json:"start_on,omitempty"`
|
|
CustomFields map[string]string `json:"custom_fields,omitempty"`
|
|
Projects []string `json:"projects,omitempty"`
|
|
Workspace string `json:"workspace,omitempty"`
|
|
|
|
TicketID string `json:"-"`
|
|
TicketType string `json:"-"`
|
|
paToken string
|
|
}
|
|
|
|
func (r *Request) GetPAToken() string {
|
|
return r.paToken
|
|
}
|
|
|
|
func (r *Request) SetPAToken(token string) {
|
|
r.paToken = token
|
|
}
|
|
|
|
type Response struct {
|
|
ID string `json:"gid"`
|
|
Name string `json:"name"`
|
|
ResourceType string `json:"resource_type"`
|
|
AssigneeStatus string `json:"assignee_status"`
|
|
}
|
|
|
|
const (
|
|
URICreateTask = "/api/1.0/tasks"
|
|
URIUpdateTask = "/api/1.0/tasks/%s"
|
|
ResourceSubtype = "default_task"
|
|
)
|
|
|
|
func (r Request) Update(taskID string) error {
|
|
var (
|
|
uri = fmt.Sprintf(URIUpdateTask, taskID)
|
|
err error
|
|
)
|
|
c, err := r.call(uri, util.HttpPutMethod)
|
|
if nil != err || nil == c {
|
|
return err
|
|
}
|
|
if http.StatusOK != c.HTTPStatus {
|
|
c.Print()
|
|
log.Errorf("unexpected response")
|
|
err = errors.New("unexpected response")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r Request) Create() (resp *Response, err error) {
|
|
var (
|
|
respData struct {
|
|
Response Response `json:"data"`
|
|
Errors module.Errors `json:"errors"`
|
|
}
|
|
)
|
|
client, err := r.call(URICreateTask, util.HttpPostMethod)
|
|
|
|
log.Infof("response status: %d", client.HTTPStatus)
|
|
if http.StatusCreated != client.HTTPStatus {
|
|
client.Print()
|
|
log.Errorf("unexpected response")
|
|
err = errors.New("unexpected response")
|
|
return
|
|
}
|
|
|
|
err = json.Unmarshal(client.Body, &respData)
|
|
if nil != err {
|
|
client.Print()
|
|
log.Errorf("illegal task result: %s", err.Error())
|
|
return
|
|
}
|
|
|
|
resp = &respData.Response
|
|
log.Infof("[%s]new task ID:%s", r.TicketID, resp.ID)
|
|
|
|
return
|
|
}
|
|
|
|
func (r Request) call(uri, httpMethod string) (*util.Client, error) {
|
|
var (
|
|
err error
|
|
reqData Data
|
|
client = new(util.Client)
|
|
)
|
|
|
|
headers := make(map[string]string)
|
|
headers["Authorization"] = r.paToken
|
|
headers["Content-Type"] = util.ContentType
|
|
|
|
if "" == r.ResourceSubtype {
|
|
r.ResourceSubtype = ResourceSubtype
|
|
}
|
|
|
|
reqData.Request = r
|
|
|
|
buf, err := json.Marshal(&reqData)
|
|
if nil != err {
|
|
log.Errorf("failed to generate task request: %s", err.Error())
|
|
return client, err
|
|
}
|
|
|
|
log.Infof("request: %s", string(buf))
|
|
|
|
client = util.NewHttpClient(util.AsanaHost, uri, httpMethod, buf)
|
|
client.Headers = headers
|
|
|
|
err = client.Request()
|
|
if nil != err {
|
|
log.Errorf("failed to create new Asana task: %s", err.Error())
|
|
return client, err
|
|
}
|
|
|
|
return client, nil
|
|
}
|