generated from keboola/template
/
bucket.go
110 lines (93 loc) · 3.15 KB
/
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
package storageapi
import (
"context"
"sort"
"strings"
"github.com/relvacode/iso8601"
"github.com/keboola/go-client/pkg/client"
)
type Bucket struct {
ID BucketID `json:"id"`
Uri string `json:"uri"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
Created iso8601.Time `json:"created"`
LastChangeDate *iso8601.Time `json:"lastChangeDate"`
IsReadOnly bool `json:"isReadOnly"`
DataSizeBytes uint64 `json:"dataSizeBytes"`
RowsCount uint64 `json:"rowsCount"`
}
type listBucketsConfig struct {
include map[string]bool
}
func (v listBucketsConfig) includeString() string {
include := make([]string, 0, len(v.include))
for k := range v.include {
include = append(include, k)
}
sort.Strings(include)
return strings.Join(include, ",")
}
type ListBucketsOption func(c *listBucketsConfig)
// GetBucketRequest https://keboola.docs.apiary.io/#reference/buckets/create-or-list-buckets/list-all-buckets
func GetBucketRequest(bucketID BucketID) client.APIRequest[*Bucket] {
result := Bucket{ID: bucketID}
request := newRequest().
WithResult(&result).
WithGet("buckets/{bucketId}").
AndPathParam("bucketId", bucketID.String())
return client.NewAPIRequest(&result, request)
}
// ListBucketsRequest https://keboola.docs.apiary.io/#reference/buckets/manage-bucket/bucket-detail
func ListBucketsRequest(opts ...ListBucketsOption) client.APIRequest[*[]*Bucket] {
config := listBucketsConfig{include: make(map[string]bool)}
for _, opt := range opts {
opt(&config)
}
result := make([]*Bucket, 0)
request := newRequest().
WithResult(&result).
WithGet("buckets").
AndQueryParam("include", config.includeString())
return client.NewAPIRequest(&result, request)
}
// CreateBucketRequest https://keboola.docs.apiary.io/#reference/buckets/create-or-list-buckets/create-bucket
func CreateBucketRequest(bucket *Bucket) client.APIRequest[*Bucket] {
// Create config
params := client.StructToMap(bucket, []string{"description", "displayName"})
if params["displayName"] == "" {
delete(params, "displayName")
}
params["stage"] = bucket.ID.Stage
params["name"] = bucket.ID.BucketName
request := newRequest().
WithResult(bucket).
WithPost("buckets").
WithFormBody(client.ToFormBody(params)).
WithOnError(ignoreResourceAlreadyExistsError(func(ctx context.Context, sender client.Sender) error {
if result, err := GetBucketRequest(bucket.ID).Send(ctx, sender); err == nil {
*bucket = *result
return nil
} else {
return err
}
}))
return client.NewAPIRequest(bucket, request)
}
// DeleteBucketRequest https://keboola.docs.apiary.io/#reference/buckets/manage-bucket/drop-bucket
func DeleteBucketRequest(bucketID BucketID, opts ...DeleteOption) client.APIRequest[client.NoResult] {
c := &deleteConfig{
force: false,
}
for _, opt := range opts {
opt(c)
}
request := newRequest().
WithDelete("buckets/{bucketId}").
AndPathParam("bucketId", bucketID.String()).
WithOnError(ignoreResourceNotFoundError())
if c.force {
request = request.AndQueryParam("force", "true")
}
return client.NewAPIRequest(client.NoResult{}, request)
}