-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsession_server.go
105 lines (90 loc) · 2.66 KB
/
session_server.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
package bunq
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"net/http"
)
type sessionServerResponse struct {
Response []struct {
ID *struct {
ID int `json:"id"`
} `json:"Id,omitempty"`
Token *struct {
ID int `json:"id"`
Token string `json:"token"`
} `json:"Token,omitempty"`
UserCompany *UserCompany `json:"UserCompany,omitempty"`
} `json:"Response"`
}
// A SessionToken is used for authenticating requests to the bunq API.
type SessionToken struct {
ID int
Token string
}
// A Session represents a SessionServer at the bunq API.
type Session struct {
ID int
Token SessionToken
UserCompany UserCompany
}
// CreateSession creates a new session for a DeviceServer at the bunq API.
func (c *Client) CreateSession() (*Session, error) {
body := struct {
Secret string `json:"secret"`
}{c.APIKey}
bodyJSON, err := json.Marshal(body)
if err != nil {
return nil, fmt.Errorf("bunq: could not encode request body into JSON: %v", err)
}
httpMethod := http.MethodPost
endpoint := apiVersion + "/session-server"
req, err := http.NewRequest(httpMethod, fmt.Sprintf("%v/%v", c.BaseURL, endpoint), bytes.NewReader(bodyJSON))
if err != nil {
return nil, fmt.Errorf("bunq: could not create new request: %v", err)
}
setCommonHeaders(req)
req.Header.Set("X-Bunq-Client-Authentication", c.Token)
if err = c.addSignature(req, fmt.Sprintf("%v /%v", httpMethod, endpoint), string(bodyJSON)); err != nil {
return nil, fmt.Errorf("bunq: could not add signature: %v", err)
}
resp, err := c.HTTPClient.Do(req)
if err != nil {
return nil, fmt.Errorf("bunq: could not send HTTP request: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("bunq: request was unsuccessful: %v", decodeError(resp.Body))
}
var ssr sessionServerResponse
if err = json.NewDecoder(resp.Body).Decode(&ssr); err != nil {
return nil, fmt.Errorf("bunq: could not decode HTTP response: %v", err)
}
if len(ssr.Response) == 0 {
return nil, errors.New("bunq: api response did not contain results")
}
session, err := ssr.session()
if err != nil {
return nil, fmt.Errorf("bunq: could not parse API response: %v", err)
}
return session, nil
}
func (ssr *sessionServerResponse) session() (*Session, error) {
session := &Session{}
for i := range ssr.Response {
if ssr.Response[i].ID != nil {
session.ID = ssr.Response[i].ID.ID
continue
}
if ssr.Response[i].Token != nil {
session.Token.ID = ssr.Response[i].Token.ID
session.Token.Token = ssr.Response[i].Token.Token
continue
}
if ssr.Response[i].UserCompany != nil {
session.UserCompany = *ssr.Response[i].UserCompany
}
}
return session, nil
}