forked from cloudflare/cloudflare-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathr2_bucket.go
147 lines (120 loc) · 3.89 KB
/
r2_bucket.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
package cloudflare
import (
"context"
"errors"
"fmt"
"net/http"
"time"
"github.com/goccy/go-json"
)
var (
ErrMissingBucketName = errors.New("require bucket name missing")
)
// R2Bucket defines a container for objects stored in R2 Storage.
type R2Bucket struct {
Name string `json:"name"`
CreationDate *time.Time `json:"creation_date,omitempty"`
Location string `json:"location,omitempty"`
}
// R2Buckets represents the map of buckets response from
// the R2 buckets endpoint.
type R2Buckets struct {
Buckets []R2Bucket `json:"buckets"`
}
// R2BucketListResponse represents the response from the list
// R2 buckets endpoint.
type R2BucketListResponse struct {
Result R2Buckets `json:"result"`
Response
}
type ListR2BucketsParams struct {
Name string `url:"name_contains,omitempty"`
StartAfter string `url:"start_after,omitempty"`
PerPage int64 `url:"per_page,omitempty"`
Order string `url:"order,omitempty"`
Direction string `url:"direction,omitempty"`
Cursor string `url:"cursor,omitempty"`
}
type CreateR2BucketParameters struct {
Name string `json:"name,omitempty"`
LocationHint string `json:"locationHint,omitempty"`
}
type R2BucketResponse struct {
Result R2Bucket `json:"result"`
Response
}
// ListR2Buckets Lists R2 buckets.
func (api *API) ListR2Buckets(ctx context.Context, rc *ResourceContainer, params ListR2BucketsParams) ([]R2Bucket, error) {
if rc.Identifier == "" {
return []R2Bucket{}, ErrMissingAccountID
}
uri := buildURI(fmt.Sprintf("/accounts/%s/r2/buckets", rc.Identifier), params)
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return []R2Bucket{}, err
}
var r2BucketListResponse R2BucketListResponse
err = json.Unmarshal(res, &r2BucketListResponse)
if err != nil {
return []R2Bucket{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return r2BucketListResponse.Result.Buckets, nil
}
// CreateR2Bucket Creates a new R2 bucket.
//
// API reference: https://api.cloudflare.com/#r2-bucket-create-bucket
func (api *API) CreateR2Bucket(ctx context.Context, rc *ResourceContainer, params CreateR2BucketParameters) (R2Bucket, error) {
if rc.Identifier == "" {
return R2Bucket{}, ErrMissingAccountID
}
if params.Name == "" {
return R2Bucket{}, ErrMissingBucketName
}
uri := fmt.Sprintf("/accounts/%s/r2/buckets", rc.Identifier)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
if err != nil {
return R2Bucket{}, err
}
var r2BucketResponse R2BucketResponse
err = json.Unmarshal(res, &r2BucketResponse)
if err != nil {
return R2Bucket{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return r2BucketResponse.Result, nil
}
// GetR2Bucket Gets an existing R2 bucket.
//
// API reference: https://api.cloudflare.com/#r2-bucket-get-bucket
func (api *API) GetR2Bucket(ctx context.Context, rc *ResourceContainer, bucketName string) (R2Bucket, error) {
if rc.Identifier == "" {
return R2Bucket{}, ErrMissingAccountID
}
if bucketName == "" {
return R2Bucket{}, ErrMissingBucketName
}
uri := fmt.Sprintf("/accounts/%s/r2/buckets/%s", rc.Identifier, bucketName)
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return R2Bucket{}, err
}
var r2BucketResponse R2BucketResponse
err = json.Unmarshal(res, &r2BucketResponse)
if err != nil {
return R2Bucket{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return r2BucketResponse.Result, nil
}
// DeleteR2Bucket Deletes an existing R2 bucket.
//
// API reference: https://api.cloudflare.com/#r2-bucket-delete-bucket
func (api *API) DeleteR2Bucket(ctx context.Context, rc *ResourceContainer, bucketName string) error {
if rc.Identifier == "" {
return ErrMissingAccountID
}
if bucketName == "" {
return ErrMissingBucketName
}
uri := fmt.Sprintf("/accounts/%s/r2/buckets/%s", rc.Identifier, bucketName)
_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
return err
}