status.go
changeset 120 579912e9d0ef
parent 110 0ee4bfc17cc8
child 130 c450bb73f59a
equal deleted inserted replaced
119:22c8c58ad61b 120:579912e9d0ef
     1 package gondole
     1 package gondole
     2 
     2 
     3 import (
     3 import (
     4 	"encoding/json"
       
     5 	"fmt"
     4 	"fmt"
     6 	"strconv"
     5 	"strconv"
     7 
     6 
     8 	"github.com/sendgrid/rest"
     7 	"github.com/sendgrid/rest"
     9 )
     8 )
    21 	SpoilerText string
    20 	SpoilerText string
    22 	Visibility  string // "direct", "private", "unlisted" or "public"
    21 	Visibility  string // "direct", "private", "unlisted" or "public"
    23 }
    22 }
    24 
    23 
    25 // queryStatusData queries the statuses API
    24 // queryStatusData queries the statuses API
    26 // The subquery can be empty or "status" (the status itself), "context",
    25 // The operation 'op' can be empty or "status" (the status itself), "context",
    27 // "card", "reblogged_by", "favourited_by".
    26 // "card", "reblogged_by", "favourited_by".
    28 // The data argument will receive the object(s) returned by the API server.
    27 // The data argument will receive the object(s) returned by the API server.
    29 func (g *Client) queryStatusData(statusID int, subquery string, data interface{}) error {
    28 func (g *Client) queryStatusData(statusID int, op string, data interface{}) error {
    30 	endPoint := "statuses/" + strconv.Itoa(statusID)
       
    31 
       
    32 	if statusID < 1 {
    29 	if statusID < 1 {
    33 		return ErrInvalidID
    30 		return ErrInvalidID
    34 	}
    31 	}
    35 
    32 
    36 	if subquery != "" && subquery != "status" {
    33 	endPoint := "statuses/" + strconv.Itoa(statusID)
    37 		switch subquery {
    34 
       
    35 	if op != "" && op != "status" {
       
    36 		switch op {
    38 		case "context", "card", "reblogged_by", "favourited_by":
    37 		case "context", "card", "reblogged_by", "favourited_by":
    39 		default:
    38 		default:
    40 			return ErrInvalidParameter
    39 			return ErrInvalidParameter
    41 		}
    40 		}
    42 
    41 
    43 		endPoint += "/" + subquery
    42 		endPoint += "/" + op
    44 	}
    43 	}
    45 	req := g.prepareRequest(endPoint)
    44 
    46 	r, err := rest.API(req)
    45 	return g.apiCall(endPoint, rest.Get, nil, data)
    47 	if err != nil {
       
    48 		return fmt.Errorf("status/%s API query: %s", subquery, err.Error())
       
    49 	}
       
    50 
       
    51 	// Check for error reply
       
    52 	var errorResult Error
       
    53 	if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil {
       
    54 		// The empty object is not an error
       
    55 		if errorResult.Text != "" {
       
    56 			return fmt.Errorf("%s", errorResult.Text)
       
    57 		}
       
    58 	}
       
    59 
       
    60 	// Not an error reply; let's unmarshal the data
       
    61 	err = json.Unmarshal([]byte(r.Body), &data)
       
    62 	if err != nil {
       
    63 		return fmt.Errorf("status/%s API: %s", subquery, err.Error())
       
    64 	}
       
    65 	return nil
       
    66 }
    46 }
    67 
    47 
    68 // updateStatusData updates the statuses
    48 // updateStatusData updates the statuses
    69 // The subquery can be empty or "status" (to post a status), "delete" (for
    49 // The operation 'op' can be empty or "status" (to post a status), "delete"
    70 // deleting a status), "reblog", "unreblog", "favourite", "unfavourite".
    50 // (for deleting a status), "reblog", "unreblog", "favourite", "unfavourite".
    71 // The data argument will receive the object(s) returned by the API server.
    51 // The data argument will receive the object(s) returned by the API server.
    72 func (g *Client) updateStatusData(subquery string, opts updateStatusOptions, data interface{}) error {
    52 func (g *Client) updateStatusData(op string, opts updateStatusOptions, data interface{}) error {
    73 	method := rest.Post
    53 	method := rest.Post
    74 	endPoint := "statuses"
    54 	endPoint := "statuses"
    75 
    55 	params := make(apiCallParams)
    76 	switch subquery {
    56 
       
    57 	switch op {
    77 	case "", "status":
    58 	case "", "status":
    78 		subquery = "status"
    59 		op = "status"
    79 		if opts.Status == "" {
    60 		if opts.Status == "" {
    80 			return ErrInvalidParameter
    61 			return ErrInvalidParameter
    81 		}
    62 		}
    82 		switch opts.Visibility {
    63 		switch opts.Visibility {
    83 		case "", "direct", "private", "unlisted", "public":
    64 		case "", "direct", "private", "unlisted", "public":
    96 		endPoint += "/" + strconv.Itoa(opts.ID)
    77 		endPoint += "/" + strconv.Itoa(opts.ID)
    97 	case "reblog", "unreblog", "favourite", "unfavourite":
    78 	case "reblog", "unreblog", "favourite", "unfavourite":
    98 		if opts.ID < 1 {
    79 		if opts.ID < 1 {
    99 			return ErrInvalidID
    80 			return ErrInvalidID
   100 		}
    81 		}
   101 		endPoint += "/" + strconv.Itoa(opts.ID) + "/" + subquery
    82 		endPoint += "/" + strconv.Itoa(opts.ID) + "/" + op
   102 	default:
    83 	default:
   103 		return ErrInvalidParameter
    84 		return ErrInvalidParameter
   104 	}
    85 	}
   105 
    86 
   106 	req := g.prepareRequest(endPoint)
       
   107 	req.Method = method
       
   108 
       
   109 	// Form items for a new toot
    87 	// Form items for a new toot
   110 	if subquery == "status" {
    88 	if op == "status" {
   111 		req.QueryParams["status"] = opts.Status
    89 		params["status"] = opts.Status
   112 		if opts.InReplyToID > 0 {
    90 		if opts.InReplyToID > 0 {
   113 			req.QueryParams["in_reply_to_id"] = strconv.Itoa(opts.InReplyToID)
    91 			params["in_reply_to_id"] = strconv.Itoa(opts.InReplyToID)
   114 		}
    92 		}
   115 		for i, id := range opts.MediaIDs {
    93 		for i, id := range opts.MediaIDs {
   116 			qID := fmt.Sprintf("media_ids[%d]", i+1)
    94 			qID := fmt.Sprintf("media_ids[%d]", i+1)
   117 			req.QueryParams[qID] = strconv.Itoa(id)
    95 			params[qID] = strconv.Itoa(id)
   118 		}
    96 		}
   119 		if opts.Sensitive {
    97 		if opts.Sensitive {
   120 			req.QueryParams["sensitive"] = "true"
    98 			params["sensitive"] = "true"
   121 		}
    99 		}
   122 		if opts.SpoilerText != "" {
   100 		if opts.SpoilerText != "" {
   123 			req.QueryParams["spoiler_text"] = opts.SpoilerText
   101 			params["spoiler_text"] = opts.SpoilerText
   124 		}
   102 		}
   125 		if opts.Visibility != "" {
   103 		if opts.Visibility != "" {
   126 			req.QueryParams["visibility"] = opts.Visibility
   104 			params["visibility"] = opts.Visibility
   127 		}
   105 		}
   128 	}
   106 	}
   129 
   107 
   130 	r, err := rest.API(req)
   108 	return g.apiCall(endPoint, method, params, data)
   131 	if err != nil {
       
   132 		return fmt.Errorf("status/%s API query: %s", subquery, err.Error())
       
   133 	}
       
   134 
       
   135 	// Check for error reply
       
   136 	var errorResult Error
       
   137 	if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil {
       
   138 		// The empty object is not an error
       
   139 		if errorResult.Text != "" {
       
   140 			return fmt.Errorf("%s", errorResult.Text)
       
   141 		}
       
   142 	}
       
   143 
       
   144 	// Not an error reply; let's unmarshal the data
       
   145 	err = json.Unmarshal([]byte(r.Body), &data)
       
   146 	if err != nil {
       
   147 		return fmt.Errorf("status/%s API: %s", subquery, err.Error())
       
   148 	}
       
   149 	return nil
       
   150 }
   109 }
   151 
   110 
   152 // GetStatus returns a status
   111 // GetStatus returns a status
   153 // The returned status can be nil if there is an error or if the
   112 // The returned status can be nil if there is an error or if the
   154 // requested ID does not exist.
   113 // requested ID does not exist.