-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpixel.go
173 lines (145 loc) · 5.4 KB
/
pixel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package pixela
import (
"encoding/json"
"fmt"
"net/http"
"github.com/pkg/errors"
)
// A Pixel manages communication with the Pixela pixel API.
type Pixel struct {
UserName string
Token string
GraphID string
}
// Create records the quantity of the specified date as a "Pixel".
func (p *Pixel) Create(date string, quantity, optionalData string) (*Result, error) {
param, err := p.createCreateRequestParameter(date, quantity, optionalData)
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to create pixel create parameter")
}
return doRequestAndParseResponse(param)
}
func (p *Pixel) createCreateRequestParameter(date, quantity, optionalData string) (*requestParameter, error) {
create := pixelCreate{Date: date, Quantity: quantity, OptionalData: optionalData}
b, err := json.Marshal(&create)
if err != nil {
return &requestParameter{}, errors.Wrap(err, "failed to marshal json")
}
return &requestParameter{
Method: http.MethodPost,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s", p.UserName, p.GraphID),
Header: map[string]string{userToken: p.Token},
Body: b,
}, nil
}
type pixelCreate struct {
Date string `json:"date"`
Quantity string `json:"quantity"`
OptionalData string `json:"optionalData"`
}
// Increment increments quantity "Pixel" of the day (it is used "timezone" setting if Graph's "timezone" is specified, if not specified, calculates it in "UTC").
// If the graph type is int then 1 added, and for float then 0.01 added.
func (p *Pixel) Increment() (*Result, error) {
param, err := p.createIncrementRequestParameter()
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to create pixel increment parameter")
}
return doRequestAndParseResponse(param)
}
func (p *Pixel) createIncrementRequestParameter() (*requestParameter, error) {
return &requestParameter{
Method: http.MethodPut,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s/increment", p.UserName, p.GraphID),
Header: map[string]string{contentLength: "0", userToken: p.Token},
Body: []byte{},
}, nil
}
// Decrement decrements quantity "Pixel" of the day (it is used "timezone" setting if Graph's "timezone" is specified, if not specified, calculates it in "UTC").
// If the graph type is int then -1 added, and for float then -0.01 added.
func (p *Pixel) Decrement() (*Result, error) {
param, err := p.createDecrementRequestParameter()
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to create pixel decrement parameter")
}
return doRequestAndParseResponse(param)
}
func (p *Pixel) createDecrementRequestParameter() (*requestParameter, error) {
return &requestParameter{
Method: http.MethodPut,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s/decrement", p.UserName, p.GraphID),
Header: map[string]string{contentLength: "0", userToken: p.Token},
Body: []byte{},
}, nil
}
// Get gets registered quantity as "Pixel".
func (p *Pixel) Get(date string) (*Quantity, error) {
param, err := p.createGetRequestParameter(date)
if err != nil {
return &Quantity{}, errors.Wrapf(err, "failed to create pixel get parameter")
}
b, err := doRequest(param)
if err != nil {
return &Quantity{}, errors.Wrapf(err, "failed to do request")
}
var quantity Quantity
if err := json.Unmarshal(b, &quantity); err != nil {
return &Quantity{}, errors.Wrapf(err, "failed to unmarshal json")
}
quantity.IsSuccess = quantity.Message == ""
return &quantity, nil
}
func (p *Pixel) createGetRequestParameter(date string) (*requestParameter, error) {
return &requestParameter{
Method: http.MethodGet,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s/%s", p.UserName, p.GraphID, date),
Header: map[string]string{userToken: p.Token},
Body: []byte{},
}, nil
}
// Quantity ... registered quantity.
type Quantity struct {
Quantity string `json:"quantity"`
OptionalData string `json:"optionalData"`
Result
}
// Update updates the quantity already registered as a "Pixel".
func (p *Pixel) Update(date, quantity, optionalData string) (*Result, error) {
param, err := p.createUpdateRequestParameter(date, quantity, optionalData)
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to create pixel update parameter")
}
return doRequestAndParseResponse(param)
}
func (p *Pixel) createUpdateRequestParameter(date, quantity, optionalData string) (*requestParameter, error) {
update := pixelUpdate{Quantity: quantity, OptionalData: optionalData}
b, err := json.Marshal(update)
if err != nil {
return &requestParameter{}, errors.Wrap(err, "failed to marshal json")
}
return &requestParameter{
Method: http.MethodPut,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s/%s", p.UserName, p.GraphID, date),
Header: map[string]string{userToken: p.Token},
Body: b,
}, nil
}
type pixelUpdate struct {
Quantity string `json:"quantity"`
OptionalData string `json:"optionalData"`
}
// Delete deletes the registered "Pixel".
func (p *Pixel) Delete(date string) (*Result, error) {
param, err := p.createDeleteRequestParameter(date)
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to create pixel delete parameter")
}
return doRequestAndParseResponse(param)
}
func (p *Pixel) createDeleteRequestParameter(date string) (*requestParameter, error) {
return &requestParameter{
Method: http.MethodDelete,
URL: fmt.Sprintf(APIBaseURL+"/users/%s/graphs/%s/%s", p.UserName, p.GraphID, date),
Header: map[string]string{userToken: p.Token},
Body: []byte{},
}, nil
}