Skip to content

Commit 5ea3d32

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 50f1bb1 + 0750531 commit 5ea3d32

11 files changed

Lines changed: 84 additions & 63 deletions

File tree

app/app.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ func NewApplication(fullConfigPath string) (*Application, error) {
3737
}
3838

3939
c := config.NewConfig(fullConfigPath)
40-
api := mite.NewApi(c.GetApiUrl(), c.GetApiKey(), version)
40+
api, err := mite.NewApi(c.GetApiUrl(), c.GetApiKey(), version)
41+
if err != nil {
42+
return nil, err
43+
}
4144

4245
if c.GetApiUrl() == "" {
4346
_, _ = fmt.Fprintln(os.Stderr, "please configure your API url by executing: 'mite config api.url=<your mite api url>'")

mite/api.go

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ import (
99
"net/url"
1010
)
1111

12-
const contentType = "application/json"
13-
const userAgentTemplate = "mite-go/%s (+github.com/leanovate/mite-go)"
12+
const (
13+
headerContentType = "Content-Type"
14+
headerUserAgent = "User-Agent"
15+
headerXMiteApiKey = "X-MiteApiKey"
16+
mediaTypeApplicationJson = "application/json"
17+
userAgentTemplate = "mite-go/%s (+github.com/leanovate/mite-go)"
18+
)
1419

1520
type Api interface {
1621
domain.AccountApi
@@ -23,25 +28,31 @@ type Api interface {
2328
}
2429

2530
type api struct {
26-
base string
27-
key string
28-
userAgent string
29-
client *http.Client
31+
base *url.URL
32+
key string
33+
agent string
34+
client *http.Client
3035
}
3136

32-
func NewApi(base string, key string, version string) Api {
33-
ua := fmt.Sprintf(userAgentTemplate, version)
34-
return &api{base: base, key: key, userAgent: ua, client: &http.Client{}}
37+
func NewApi(miteUrl string, miteKey string, clientVersion string) (Api, error) {
38+
base, err := url.Parse(miteUrl)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
userAgent := fmt.Sprintf(userAgentTemplate, clientVersion)
44+
45+
return &api{base: base, key: miteKey, agent: userAgent, client: &http.Client{}}, nil
3546
}
3647

37-
func (a *api) get(resource string, result interface{}) error {
38-
req, err := http.NewRequest(http.MethodGet, a.url(resource), nil)
48+
func (a *api) get(resource string, query url.Values, result interface{}) error {
49+
req, err := http.NewRequest(http.MethodGet, a.encode(resource, query), nil)
3950
if err != nil {
4051
return err
4152
}
4253

43-
req.Header.Add("User-Agent", a.userAgent)
44-
req.Header.Add("X-MiteApiKey", a.key)
54+
req.Header.Add(headerUserAgent, a.agent)
55+
req.Header.Add(headerXMiteApiKey, a.key)
4556

4657
res, err := a.client.Do(req)
4758
if err != nil {
@@ -56,28 +67,20 @@ func (a *api) get(resource string, result interface{}) error {
5667
return json.NewDecoder(res.Body).Decode(result)
5768
}
5869

59-
func (a *api) getParametrized(resource string, values url.Values, result interface{}) error {
60-
u := &url.URL{}
61-
u.Path = resource
62-
u.RawQuery = values.Encode()
63-
64-
return a.get(u.String(), result)
65-
}
66-
6770
func (a *api) post(resource string, body interface{}, result interface{}) error {
6871
b, err := json.Marshal(body)
6972
if err != nil {
7073
return err
7174
}
7275

73-
req, err := http.NewRequest(http.MethodPost, a.url(resource), bytes.NewBuffer(b))
76+
req, err := http.NewRequest(http.MethodPost, a.encode(resource, nil), bytes.NewBuffer(b))
7477
if err != nil {
7578
return err
7679
}
7780

78-
req.Header.Add("Content-Type", contentType)
79-
req.Header.Add("User-Agent", a.userAgent)
80-
req.Header.Add("X-MiteApiKey", a.key)
81+
req.Header.Add(headerContentType, mediaTypeApplicationJson)
82+
req.Header.Add(headerUserAgent, a.agent)
83+
req.Header.Add(headerXMiteApiKey, a.key)
8184

8285
res, err := a.client.Do(req)
8386
if err != nil {
@@ -102,14 +105,14 @@ func (a *api) patch(resource string, body interface{}, result interface{}) error
102105
return err
103106
}
104107

105-
req, err := http.NewRequest(http.MethodPatch, a.url(resource), bytes.NewBuffer(b))
108+
req, err := http.NewRequest(http.MethodPatch, a.encode(resource, nil), bytes.NewBuffer(b))
106109
if err != nil {
107110
return err
108111
}
109112

110-
req.Header.Add("Content-Type", contentType)
111-
req.Header.Add("User-Agent", a.userAgent)
112-
req.Header.Add("X-MiteApiKey", a.key)
113+
req.Header.Add(headerContentType, mediaTypeApplicationJson)
114+
req.Header.Add(headerUserAgent, a.agent)
115+
req.Header.Add(headerXMiteApiKey, a.key)
113116

114117
res, err := a.client.Do(req)
115118
if err != nil {
@@ -129,13 +132,13 @@ func (a *api) patch(resource string, body interface{}, result interface{}) error
129132
}
130133

131134
func (a *api) delete(resource string, result interface{}) error {
132-
req, err := http.NewRequest(http.MethodDelete, a.url(resource), nil)
135+
req, err := http.NewRequest(http.MethodDelete, a.encode(resource, nil), nil)
133136
if err != nil {
134137
return err
135138
}
136139

137-
req.Header.Add("User-Agent", a.userAgent)
138-
req.Header.Add("X-MiteApiKey", a.key)
140+
req.Header.Add(headerUserAgent, a.agent)
141+
req.Header.Add(headerXMiteApiKey, a.key)
139142

140143
res, err := a.client.Do(req)
141144
if err != nil {
@@ -154,8 +157,8 @@ func (a *api) delete(resource string, result interface{}) error {
154157
return nil
155158
}
156159

157-
func (a *api) url(resource string) string {
158-
return fmt.Sprintf("%s/%s", a.base, resource)
160+
func (a *api) encode(resource string, query url.Values) string {
161+
return a.base.ResolveReference(&url.URL{Path: resource, RawQuery: query.Encode()}).String()
159162
}
160163

161164
func (a *api) check(res *http.Response) error {

mite/api_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import (
55
"encoding/json"
66
)
77

8-
const testApiKey = "f00bar"
9-
const testClientVersion = "vX"
10-
const testUserAgent = "mite-go/" + testClientVersion + " (+github.com/leanovate/mite-go)"
8+
const (
9+
testApiKey = "key"
10+
testClientVersion = "test"
11+
testUserAgent = "mite-go/" + testClientVersion + " (+github.com/leanovate/mite-go)"
12+
)
1113

1214
type recorder struct {
1315
method string

mite/project.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (r *projectResponse) toProject() *domain.Project {
2222

2323
func (a *api) Projects() ([]*domain.Project, error) {
2424
var prs []projectResponse
25-
err := a.get("projects.json", &prs)
25+
err := a.get("/projects.json", nil, &prs)
2626
if err != nil {
2727
return nil, err
2828
}

mite/project_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ func TestApi_Projects(t *testing.T) {
5959

6060
defer srv.Close()
6161

62-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
62+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
63+
assert.Nil(t, err)
6364

6465
// when
6566
projects, err := api.Projects()

mite/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (r *serviceResponse) toService() *domain.Service {
2222

2323
func (a *api) Services() ([]*domain.Service, error) {
2424
var srs []serviceResponse
25-
err := a.get("services.json", &srs)
25+
err := a.get("/services.json", nil, &srs)
2626
if err != nil {
2727
return nil, err
2828
}

mite/service_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ func TestApi_Services(t *testing.T) {
4545

4646
defer srv.Close()
4747

48-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
48+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
49+
assert.Nil(t, err)
4950

5051
// when
5152
services, err := api.Services()

mite/time_entry.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func (r *timeEntryResponse) toTimeEntry() *domain.TimeEntry {
106106

107107
func (a *api) TimeEntries(query *domain.TimeEntryQuery) ([]*domain.TimeEntry, error) {
108108
var ter []timeEntryResponse
109-
err := a.getParametrized("time_entries.json", fromQuery(query), &ter)
109+
err := a.get("/time_entries.json", fromQuery(query), &ter)
110110
if err != nil {
111111
return nil, err
112112
}
@@ -121,7 +121,7 @@ func (a *api) TimeEntries(query *domain.TimeEntryQuery) ([]*domain.TimeEntry, er
121121

122122
func (a *api) TimeEntry(id domain.TimeEntryId) (*domain.TimeEntry, error) {
123123
ter := timeEntryResponse{}
124-
err := a.get(fmt.Sprintf("time_entries/%s.json", id), &ter)
124+
err := a.get(fmt.Sprintf("/time_entries/%s.json", id), nil, &ter)
125125
if err != nil {
126126
return nil, err
127127
}
@@ -131,7 +131,7 @@ func (a *api) TimeEntry(id domain.TimeEntryId) (*domain.TimeEntry, error) {
131131

132132
func (a *api) CreateTimeEntry(command *domain.TimeEntryCommand) (*domain.TimeEntry, error) {
133133
ter := timeEntryResponse{}
134-
err := a.post("time_entries.json", fromCommand(command), &ter)
134+
err := a.post("/time_entries.json", fromCommand(command), &ter)
135135
if err != nil {
136136
return nil, err
137137
}
@@ -140,9 +140,9 @@ func (a *api) CreateTimeEntry(command *domain.TimeEntryCommand) (*domain.TimeEnt
140140
}
141141

142142
func (a *api) EditTimeEntry(id domain.TimeEntryId, command *domain.TimeEntryCommand) error {
143-
return a.patch(fmt.Sprintf("time_entries/%s.json", id), fromCommand(command), nil)
143+
return a.patch(fmt.Sprintf("/time_entries/%s.json", id), fromCommand(command), nil)
144144
}
145145

146146
func (a *api) DeleteTimeEntry(id domain.TimeEntryId) error {
147-
return a.delete(fmt.Sprintf("time_entries/%s.json", id), nil)
147+
return a.delete(fmt.Sprintf("/time_entries/%s.json", id), nil)
148148
}

mite/time_entry_test.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ func TestApi_TimeEntries(t *testing.T) {
8282

8383
defer srv.Close()
8484

85-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
85+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
86+
assert.Nil(t, err)
8687

8788
// when
8889
timeEntries, err := api.TimeEntries(nil)
@@ -113,7 +114,8 @@ func TestApi_TimeEntries_WithQuery(t *testing.T) {
113114

114115
defer srv.Close()
115116

116-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
117+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
118+
assert.Nil(t, err)
117119

118120
// when
119121
today := domain.Today()
@@ -150,7 +152,8 @@ func TestApi_TimeEntry(t *testing.T) {
150152

151153
defer srv.Close()
152154

153-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
155+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
156+
assert.Nil(t, err)
154157

155158
// when
156159
timeEntry, err := api.TimeEntry(timeEntryObject.Id)
@@ -186,7 +189,8 @@ func TestApi_CreateTimeEntry(t *testing.T) {
186189

187190
defer srv.Close()
188191

189-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
192+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
193+
assert.Nil(t, err)
190194

191195
// when
192196
command := &domain.TimeEntryCommand{
@@ -229,7 +233,8 @@ func TestApi_EditTimeEntry(t *testing.T) {
229233

230234
defer srv.Close()
231235

232-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
236+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
237+
assert.Nil(t, err)
233238

234239
// when
235240
command := &domain.TimeEntryCommand{
@@ -239,7 +244,7 @@ func TestApi_EditTimeEntry(t *testing.T) {
239244
ProjectId: timeEntryObject.ProjectId,
240245
ServiceId: timeEntryObject.ServiceId,
241246
}
242-
err := api.EditTimeEntry(timeEntryObject.Id, command)
247+
err = api.EditTimeEntry(timeEntryObject.Id, command)
243248

244249
// then
245250
assert.Nil(t, err)
@@ -265,10 +270,11 @@ func TestApi_DeleteTimeEntry(t *testing.T) {
265270

266271
defer srv.Close()
267272

268-
api := mite.NewApi(srv.URL, testApiKey, testClientVersion)
273+
api, err := mite.NewApi(srv.URL, testApiKey, testClientVersion)
274+
assert.Nil(t, err)
269275

270276
// when
271-
err := api.DeleteTimeEntry(timeEntryObject.Id)
277+
err = api.DeleteTimeEntry(timeEntryObject.Id)
272278

273279
// then
274280
assert.Nil(t, err)

mite/tracker.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (r *trackerResponse) toStoppedTimeEntry() *domain.StoppedTimeEntry {
4545

4646
func (a *api) Tracker() (*domain.TrackingTimeEntry, error) {
4747
tr := trackerResponse{}
48-
err := a.get("tracker.json", &tr)
48+
err := a.get("/tracker.json", nil, &tr)
4949
if err != nil {
5050
return nil, err
5151
}
@@ -55,7 +55,7 @@ func (a *api) Tracker() (*domain.TrackingTimeEntry, error) {
5555

5656
func (a *api) StartTracker(id domain.TimeEntryId) (*domain.TrackingTimeEntry, *domain.StoppedTimeEntry, error) {
5757
tr := &trackerResponse{}
58-
err := a.patch(fmt.Sprintf("tracker/%s.json", id), nil, tr)
58+
err := a.patch(fmt.Sprintf("/tracker/%s.json", id), nil, tr)
5959
if err != nil {
6060
return nil, nil, err
6161
}
@@ -65,7 +65,7 @@ func (a *api) StartTracker(id domain.TimeEntryId) (*domain.TrackingTimeEntry, *d
6565

6666
func (a *api) StopTracker(id domain.TimeEntryId) (*domain.StoppedTimeEntry, error) {
6767
tr := &trackerResponse{}
68-
err := a.delete(fmt.Sprintf("tracker/%s.json", id), tr)
68+
err := a.delete(fmt.Sprintf("/tracker/%s.json", id), tr)
6969
if err != nil {
7070
return nil, err
7171
}

0 commit comments

Comments
 (0)