-
Notifications
You must be signed in to change notification settings - Fork 2
/
database.go
159 lines (134 loc) · 4.21 KB
/
database.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
package dbaas
import (
"context"
"encoding/json"
"fmt"
"net/http"
)
// Database is the API response for the databases.
type Database struct {
ID string `json:"id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
ProjectID string `json:"project_id"`
Name string `json:"name"`
OwnerID string `json:"owner_id"`
LcCollate string `json:"lc_collate"`
LcCtype string `json:"lc_ctype"`
DatastoreID string `json:"datastore_id"`
Status Status `json:"status"`
}
// DatabaseCreateOpts represents options for the database Create request.
type DatabaseCreateOpts struct {
DatastoreID string `json:"datastore_id"`
Name string `json:"name"`
OwnerID string `json:"owner_id,omitempty"`
LcCollate string `json:"lc_collate,omitempty"`
LcCtype string `json:"lc_ctype,omitempty"`
}
// DatabaseUpdateOpts represents options for the database Update request.
type DatabaseUpdateOpts struct {
OwnerID string `json:"owner_id"`
}
// DatabaseQueryParams represents available query parameters for database.
type DatabaseQueryParams struct {
ID string `json:"id,omitempty"`
ProjectID string `json:"project_id,omitempty"`
Name string `json:"name,omitempty"`
DatastoreID string `json:"datastore_id,omitempty"`
Status Status `json:"status,omitempty"`
}
const DatabasesURI = "/databases"
// Databases returns all databases.
func (api *API) Databases(ctx context.Context, params *DatabaseQueryParams) ([]Database, error) {
uri, err := setQueryParams(DatabasesURI, params)
if err != nil {
return []Database{}, err
}
resp, err := api.makeRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return []Database{}, err
}
var result struct {
Databases []Database `json:"databases"`
}
err = json.Unmarshal(resp, &result)
if err != nil {
return []Database{}, fmt.Errorf("Error during Unmarshal, %w", err)
}
return result.Databases, nil
}
// Database returns a database based on the ID.
func (api *API) Database(ctx context.Context, databaseID string) (Database, error) {
uri := fmt.Sprintf("%s/%s", DatabasesURI, databaseID)
resp, err := api.makeRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return Database{}, err
}
var result struct {
Database Database `json:"database"`
}
err = json.Unmarshal(resp, &result)
if err != nil {
return Database{}, fmt.Errorf("Error during Unmarshal, %w", err)
}
return result.Database, nil
}
// CreateDatabase creates a new database.
func (api *API) CreateDatabase(ctx context.Context, opts DatabaseCreateOpts) (Database, error) {
createDatabaseOpts := struct {
Database DatabaseCreateOpts `json:"database"`
}{
Database: opts,
}
requestBody, err := json.Marshal(createDatabaseOpts)
if err != nil {
return Database{}, fmt.Errorf("Error marshalling params to JSON, %w", err)
}
resp, err := api.makeRequest(ctx, http.MethodPost, DatabasesURI, requestBody)
if err != nil {
return Database{}, err
}
var result struct {
Database Database `json:"database"`
}
err = json.Unmarshal(resp, &result)
if err != nil {
return Database{}, fmt.Errorf("Error during Unmarshal, %w", err)
}
return result.Database, nil
}
// UpdateDatabase updates an existing database.
func (api *API) UpdateDatabase(ctx context.Context, databaseID string, opts DatabaseUpdateOpts) (Database, error) {
uri := fmt.Sprintf("%s/%s", DatabasesURI, databaseID)
updateDatabaseOpts := struct {
Database DatabaseUpdateOpts `json:"database"`
}{
Database: opts,
}
requestBody, err := json.Marshal(updateDatabaseOpts)
if err != nil {
return Database{}, fmt.Errorf("Error marshalling params to JSON, %w", err)
}
resp, err := api.makeRequest(ctx, http.MethodPut, uri, requestBody)
if err != nil {
return Database{}, err
}
var result struct {
Database Database `json:"database"`
}
err = json.Unmarshal(resp, &result)
if err != nil {
return Database{}, fmt.Errorf("Error during Unmarshal, %w", err)
}
return result.Database, nil
}
// DeleteDatabase deletes an existing database.
func (api *API) DeleteDatabase(ctx context.Context, databaseID string) error {
uri := fmt.Sprintf("%s/%s", DatabasesURI, databaseID)
_, err := api.makeRequest(ctx, http.MethodDelete, uri, nil)
if err != nil {
return err
}
return nil
}