forked from aiven/aiven-go-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
project.go
137 lines (112 loc) · 3.35 KB
/
project.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
package aiven
import (
"encoding/json"
"errors"
"log"
)
type (
// Project represents the Project model on Aiven.
Project struct {
AvailableCredits string `json:"available_credits"`
BillingAddress string `json:"billing_address"`
Card Card `json:"card_info"`
Country string `json:"country"`
CountryCode string `json:"country_code"`
DefaultCloud string `json:"default_cloud"`
EstimatedBalance string `json:"estimated_balance"`
PaymentMethod string `json:"payment_method"`
Name string `json:"project_name"`
VatID string `json:"vat_id"`
}
// ProjectsHandler is the client which interacts with the Projects endpoints
// on Aiven.
ProjectsHandler struct {
client *Client
}
// CreateProjectRequest are the parameters for creating a project.
CreateProjectRequest struct {
CardID string `json:"card_id,omitempty"`
Cloud string `json:"cloud,omitempty"`
Project string `json:"project"`
}
// UpdateProjectRequest are the parameters for updating a project.
UpdateProjectRequest struct {
CardID string `json:"card_id,omitempty"`
Cloud string `json:"cloud,omitempty"`
BillingAddress string `json:"billing_address"`
}
// ProjectResponse is the response from Aiven for the project endpoints.
ProjectResponse struct {
APIResponse
Project *Project `json:"project"`
}
// ProjectListResponse is the response from Aiven for listing projects.
ProjectListResponse struct {
APIResponse
Projects []*Project `json:"projects"`
}
)
// Create creates a new project.
func (h *ProjectsHandler) Create(req CreateProjectRequest) (*Project, error) {
rsp, err := h.client.doPostRequest("/project", req)
if err != nil {
return nil, err
}
return parseProjectResponse(rsp)
}
// Get gets the specified project.
func (h *ProjectsHandler) Get(project string) (*Project, error) {
log.Printf("Getting information for `%s`", project)
rsp, err := h.client.doGetRequest("/project/"+project, nil)
if err != nil {
return nil, err
}
return parseProjectResponse(rsp)
}
// Update updates the specified project with the given parameters.
func (h *ProjectsHandler) Update(project string, req UpdateProjectRequest) (*Project, error) {
rsp, err := h.client.doPutRequest("/project/"+project, req)
if err != nil {
return nil, err
}
return parseProjectResponse(rsp)
}
// Delete deletes the given project.
func (h *ProjectsHandler) Delete(project string) error {
bts, err := h.client.doDeleteRequest("/project/"+project, nil)
if err != nil {
return err
}
return handleDeleteResponse(bts)
}
// List lists all the available projects linked to the account.
func (h *ProjectsHandler) List() ([]*Project, error) {
rsp, err := h.client.doGetRequest("/project", nil)
if err != nil {
return nil, err
}
var response *ProjectListResponse
if err := json.Unmarshal(rsp, &response); err != nil {
return nil, err
}
if len(response.Errors) != 0 {
return nil, errors.New(response.Message)
}
return response.Projects, nil
}
func parseProjectResponse(bts []byte) (*Project, error) {
if bts == nil {
return nil, ErrNoResponseData
}
var rsp *ProjectResponse
if err := json.Unmarshal(bts, &rsp); err != nil {
return nil, err
}
if rsp == nil {
return nil, ErrNoResponseData
}
if rsp.Errors != nil && len(rsp.Errors) != 0 {
return nil, errors.New(rsp.Message)
}
return rsp.Project, nil
}