Skip to content

Commit 4aae460

Browse files
committed
unify repetitive response handling code
1 parent 1415348 commit 4aae460

19 files changed

+245
-464
lines changed

api.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,34 @@ type APIResponse struct {
1515
Message string `json:"message,omitempty"`
1616
}
1717

18-
func handleAPIResponse(bts []byte) (*APIResponse, error) {
19-
var response *APIResponse
20-
if err := json.Unmarshal(bts, &response); err != nil {
21-
return nil, err
18+
type Response interface {
19+
GetError() error
20+
}
21+
22+
func (r APIResponse) GetError() error {
23+
if len(r.Errors) != 0 {
24+
for _, err := range r.Errors {
25+
return err
26+
}
2227
}
2328

24-
return response, nil
29+
return nil
2530
}
2631

27-
func handleDeleteResponse(bts []byte) error {
28-
rsp, err := handleAPIResponse(bts)
29-
if err != nil {
32+
func checkAPIResponse(bts []byte, r Response) error {
33+
if r == nil {
34+
r = new(APIResponse)
35+
}
36+
37+
if err := json.Unmarshal(bts, &r); err != nil {
3038
return err
3139
}
3240

33-
if len(rsp.Errors) != 0 {
34-
return rsp.Errors[0]
41+
if r == nil {
42+
return ErrNoResponseData
3543
}
3644

37-
return nil
45+
return r.GetError()
3846
}
3947

4048
func buildPath(parts ...string) string {

api_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package aiven
2+
3+
import "testing"
4+
5+
func Test_checkAPIResponse(t *testing.T) {
6+
type args struct {
7+
bts []byte
8+
r Response
9+
}
10+
tests := []struct {
11+
name string
12+
args args
13+
wantErr bool
14+
}{
15+
{
16+
"invalid-json",
17+
args{
18+
bts: []byte(`Invalid JSON`),
19+
r: nil,
20+
},
21+
true,
22+
},
23+
{
24+
"error-response",
25+
args{
26+
bts: []byte(`{
27+
"message": "Authentication failed",
28+
"errors": [
29+
{
30+
"status": "403",
31+
"message": "Authentication failed"
32+
}
33+
]
34+
}`),
35+
r: nil,
36+
},
37+
true,
38+
},
39+
{
40+
"error-response",
41+
args{
42+
bts: []byte(`{
43+
"message": "",
44+
"errors": [
45+
]
46+
}`),
47+
r: nil,
48+
},
49+
false,
50+
},
51+
}
52+
for _, tt := range tests {
53+
t.Run(tt.name, func(t *testing.T) {
54+
if err := checkAPIResponse(tt.args.bts, tt.args.r); (err != nil) != tt.wantErr {
55+
t.Errorf("checkAPIResponse() error = %v, wantErr %v", err, tt.wantErr)
56+
}
57+
})
58+
}
59+
}
60+
61+
func TestAPIResponse_GetError(t *testing.T) {
62+
type fields struct {
63+
Errors []Error
64+
Message string
65+
}
66+
tests := []struct {
67+
name string
68+
fields fields
69+
wantErr bool
70+
}{
71+
{
72+
"empty",
73+
fields{
74+
Errors: nil,
75+
Message: "",
76+
},
77+
false,
78+
},
79+
{
80+
"has-error",
81+
fields{
82+
Errors: []Error{
83+
{
84+
Message: "error-message",
85+
MoreInfo: "some-info",
86+
Status: 500,
87+
},
88+
},
89+
Message: "error-message",
90+
},
91+
true,
92+
},
93+
}
94+
for _, tt := range tests {
95+
t.Run(tt.name, func(t *testing.T) {
96+
r := APIResponse{
97+
Errors: tt.fields.Errors,
98+
Message: tt.fields.Message,
99+
}
100+
if err := r.GetError(); (err != nil) != tt.wantErr {
101+
t.Errorf("GetError() error = %v, wantErr %v", err, tt.wantErr)
102+
}
103+
})
104+
}
105+
}

ca.go

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33

44
package aiven
55

6-
import (
7-
"encoding/json"
8-
"errors"
9-
)
10-
116
type (
127
// CAHandler is the client which interacts with the Projects CA endpoint
138
// on Aiven.
@@ -29,21 +24,8 @@ func (h *CAHandler) Get(project string) (string, error) {
2924
return "", err
3025
}
3126

32-
if bts == nil {
33-
return "", ErrNoResponseData
34-
}
27+
var r ProjectCAResponse
28+
errR := checkAPIResponse(bts, &r)
3529

36-
var rsp *ProjectCAResponse
37-
if err := json.Unmarshal(bts, &rsp); err != nil {
38-
return "", err
39-
}
40-
41-
if rsp == nil {
42-
return "", ErrNoResponseData
43-
}
44-
45-
if rsp.Errors != nil && len(rsp.Errors) != 0 {
46-
return "", errors.New(rsp.Message)
47-
}
48-
return rsp.CACertificate, nil
30+
return r.CACertificate, errR
4931
}

card.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
package aiven
55

66
import (
7-
"encoding/json"
8-
"errors"
97
"fmt"
108
)
119

@@ -38,21 +36,15 @@ type (
3836

3937
// List lists all the cards linked to the authenticated account/
4038
func (h *CardsHandler) List() ([]*Card, error) {
41-
rsp, err := h.client.doGetRequest("/card", nil)
39+
bts, err := h.client.doGetRequest("/card", nil)
4240
if err != nil {
4341
return nil, err
4442
}
4543

46-
var response *CardListResponse
47-
if err := json.Unmarshal(rsp, &response); err != nil {
48-
return nil, err
49-
}
50-
51-
if len(response.Errors) != 0 {
52-
return nil, errors.New(response.Message)
53-
}
44+
var r CardListResponse
45+
errR := checkAPIResponse(bts, &r)
5446

55-
return response.Cards, nil
47+
return r.Cards, errR
5648
}
5749

5850
// Get card by card id. The id may be either last 4 digits of the card or the actual id

connection_pool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,5 @@ func (h *ConnectionPoolsHandler) Delete(project, serviceName, poolName string) e
102102
return err
103103
}
104104

105-
return handleDeleteResponse(bts)
105+
return checkAPIResponse(bts, nil)
106106
}

database.go

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
package aiven
55

66
import (
7-
"encoding/json"
8-
"errors"
97
"fmt"
108
)
119

@@ -46,15 +44,11 @@ func (h *DatabasesHandler) Create(project, service string, req CreateDatabaseReq
4644
return nil, err
4745
}
4846

49-
rsp, err := handleAPIResponse(bts)
50-
if err != nil {
47+
errR := checkAPIResponse(bts, nil)
48+
if errR != nil {
5149
return nil, err
5250
}
5351

54-
if len(rsp.Errors) != 0 {
55-
return nil, rsp.Errors[0]
56-
}
57-
5852
db := Database{DatabaseName: req.Database, LcCollate: req.LcCollate, LcType: req.LcType}
5953
return &db, nil
6054
}
@@ -86,7 +80,7 @@ func (h *DatabasesHandler) Delete(project, service, database string) error {
8680
return err
8781
}
8882

89-
return handleDeleteResponse(bts)
83+
return checkAPIResponse(bts, nil)
9084
}
9185

9286
// List will fetch all databases for a given service.
@@ -97,14 +91,8 @@ func (h *DatabasesHandler) List(project, service string) ([]*Database, error) {
9791
return nil, err
9892
}
9993

100-
var response *DatabaseListResponse
101-
if err := json.Unmarshal(rsp, &response); err != nil {
102-
return nil, err
103-
}
104-
105-
if len(response.Errors) != 0 {
106-
return nil, errors.New(response.Message)
107-
}
94+
var r DatabaseListResponse
95+
errR := checkAPIResponse(rsp, &r)
10896

109-
return response.Databases, nil
97+
return r.Databases, errR
11098
}

elasticsearch_acls.go

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package aiven
22

3-
import (
4-
"encoding/json"
5-
"errors"
6-
)
7-
83
type (
94
// ElasticSearchACLsHandler Aiven go-client handler for Elastisearch ACLs
105
ElasticSearchACLsHandler struct {
@@ -52,7 +47,10 @@ func (h *ElasticSearchACLsHandler) Update(project, service string, req Elasticse
5247
return nil, err
5348
}
5449

55-
return h.response(bts)
50+
var r ElasticSearchACLResponse
51+
errR := checkAPIResponse(bts, &r)
52+
53+
return &r, errR
5654
}
5755

5856
// Get gets all existing Elasticsearch ACLs config
@@ -63,27 +61,10 @@ func (h *ElasticSearchACLsHandler) Get(project, service string) (*ElasticSearchA
6361
return nil, err
6462
}
6563

66-
return h.response(bts)
67-
}
68-
69-
// response checks if response fom Aiven API contains any errors
70-
func (h *ElasticSearchACLsHandler) response(r []byte) (*ElasticSearchACLResponse, error) {
71-
var rsp *ElasticSearchACLResponse
72-
if err := json.Unmarshal(r, &rsp); err != nil {
73-
return nil, err
74-
}
75-
76-
// response cannot be empty
77-
if rsp == nil {
78-
return nil, ErrNoResponseData
79-
}
80-
81-
// check API response errors
82-
if rsp.Errors != nil && len(rsp.Errors) != 0 {
83-
return nil, errors.New(rsp.Message)
84-
}
64+
var r ElasticSearchACLResponse
65+
errR := checkAPIResponse(bts, &r)
8566

86-
return rsp, nil
67+
return &r, errR
8768
}
8869

8970
// Delete subtracts ACL from already existing Elasticsearch ACLs config

0 commit comments

Comments
 (0)