-
Notifications
You must be signed in to change notification settings - Fork 1
/
function.go
128 lines (108 loc) · 3.08 KB
/
function.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
package gcp
import (
"context"
"time"
"cloud.google.com/go/storage"
"github.com/achintya-7/ez-storage/model"
"google.golang.org/api/iterator"
)
// returns the list of buckets in a project
func (gcp *GcpClient) ListBuckets(ctx context.Context, projectId string) (buckets []string, err error) {
it := gcp.client.Buckets(ctx, projectId)
for {
battrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return nil, &model.GcpError{Err: err}
}
buckets = append(buckets, battrs.Name)
}
return buckets, nil
}
// returns the list of objects in a bucket at a given path
func (gcp *GcpClient) ListObjects(ctx context.Context, bucket string, path string) (objs []string, err error) {
storageQuery := &storage.Query{Prefix: path, Delimiter: "/"}
it := gcp.client.Bucket(bucket).Objects(ctx, storageQuery)
for {
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return nil, &model.GcpError{Err: err}
}
objs = append(objs, attrs.Name)
}
return objs, nil
}
// returns the size of a folder in MB in a bucket at a given path
func (gcp *GcpClient) GetPathSize(ctx context.Context, bucket string, path string) (size int64, err error) {
storageQuery := &storage.Query{Prefix: path, Delimiter: "/"}
it := gcp.client.Bucket(bucket).Objects(ctx, storageQuery)
for {
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return 0, &model.GcpError{Err: err}
}
mbSize := attrs.Size / 1024 / 1024
size += mbSize
}
return size, nil
}
// deletes a folder in a bucket at a given path
func (gcp *GcpClient) DeleteFolder(ctx context.Context, bucket, path string) (err error) {
err = gcp.client.Bucket(bucket).Object(path).Delete(ctx)
if err != nil {
return &model.GcpError{Err: err}
}
return nil
}
// returns a signed download URL for a file in a bucket at a given path
func (gcp *GcpClient) GetSignedDownloadURL(ctx context.Context, bucket, path string, expiry time.Time) (url string, err error) {
opts := &storage.SignedURLOptions{
Scheme: storage.SigningSchemeV4,
Method: "GET",
Headers: []string{
"Content-Type:application/octet-stream",
},
Expires: expiry,
}
url, err = storage.SignedURL(bucket, path, opts)
if err != nil {
return "", &model.GcpError{Err: err}
}
return url, nil
}
func (gcp *GcpClient) GetSignedUploadUrl(ctx context.Context, bucket, path string, expiry time.Time) (url string, err error) {
opts := &storage.SignedURLOptions{
Scheme: storage.SigningSchemeV4,
Method: "PUT",
Headers: []string{
"Content-Type:application/octet-stream",
},
Expires: expiry,
}
url, err = storage.SignedURL(bucket, path, opts)
if err != nil {
return "", &model.GcpError{Err: err}
}
return url, nil
}
func (gcp *GcpClient) GetAttributes(ctx context.Context, bucket, path string) (attrs *model.ObjAttrs, err error) {
attr, err := gcp.client.Bucket(bucket).Object(path).Attrs(ctx)
if err != nil {
return nil, &model.GcpError{Err: err}
}
attrs = &model.ObjAttrs{
Name: attr.Name,
Size: attr.Size,
Created: attr.Created,
Updatd: attr.Updated,
}
return attrs, nil
}