-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgcs.go
134 lines (114 loc) · 3.15 KB
/
gcs.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
package repository
import (
"context"
"fmt"
"image"
"image/png"
"io"
"io/ioutil"
"time"
"cloud.google.com/go/storage"
"github.com/google/uuid"
"google.golang.org/api/option"
"github.com/payboxth/go-slip"
)
func NewGCS(bucketName, credentialFile string) (slip.Storage, error) {
ctx := context.Background()
client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialFile))
if err != nil {
return nil, err
}
bucket := client.Bucket(bucketName)
s := &gcs{
bucket: bucket,
baseURL: "https://storage.googleapis.com/" + bucketName,
}
return s, nil
}
type gcs struct {
bucket *storage.BucketHandle
baseURL string
}
func (s *gcs) generateName() string {
return uuid.New().String()
}
func encodePNG(w io.Writer, m image.Image) error {
return png.Encode(w, m)
}
func (s *gcs) StoreFile(ctx context.Context, fileName, objectName string) (url string, err error) {
o := s.bucket.Object(objectName)
w := o.NewWriter(ctx)
defer func() {
err := w.Close()
if err != nil {
fmt.Printf("Cannot Close *storage.Writer: %v\n", err) // TODO หาวิธีส่ง Error ไปเก็บ
}
}()
w.ACL = append(w.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader})
w.CacheControl = "public, max-age=31536000"
b, err := ioutil.ReadFile(fileName)
if err != nil {
return "", err
}
_, err = w.Write(b)
if err != nil {
objErr := o.Delete(ctx)
if objErr != nil {
return "", objErr
}
return "", err
}
return s.baseURL + "/" + objectName, nil
}
func (s *gcs) StoreByte(ctx context.Context, b []byte, objectName string) (url string, err error) {
o := s.bucket.Object(objectName)
w := o.NewWriter(ctx)
defer w.Close()
w.ACL = append(w.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader})
w.CacheControl = "public, max-age=31536000"
ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
n, err := w.Write(b)
if err != nil {
objErr := o.Delete(ctx)
if objErr != nil {
fmt.Printf("Delete object error: %v", objErr)
}
return "", err
}
fmt.Printf("StoreByte write %v byte.", n)
return s.baseURL + "/" + objectName, nil
}
func (s *gcs) StoreOriginPNG(ctx context.Context, m image.Image, objectName string) (url string, err error) {
o := s.bucket.Object(objectName)
w := o.NewWriter(ctx)
defer func() {
err := w.Close()
if err != nil {
fmt.Printf("Cannot Close *storage.Writer: %v\n", err) // TODO หาวิธีส่ง Error ไปเก็บ ใน Sentry
}
}()
w.ACL = append(w.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader})
w.CacheControl = "public, max-age=31536000"
err = encodePNG(w, m)
if err != nil {
objErr := o.Delete(ctx)
if objErr != nil {
return "", err
}
return "", err
}
return s.baseURL + "/" + objectName, nil
}
func (s *gcs) RemoveFile(ctx context.Context, objectName string) error {
o := s.bucket.Object(objectName)
w := o.NewWriter(ctx)
defer w.Close()
ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
if err := o.Delete(ctx); err != nil {
return fmt.Errorf("Object(%q).Delete: %v", objectName, err)
}
fmt.Fprintf(w, "Blob %v deleted.\n", objectName)
return nil
}