-
Notifications
You must be signed in to change notification settings - Fork 1
/
firebase.go
91 lines (72 loc) · 2.03 KB
/
firebase.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
package image
import (
"context"
"fmt"
"io"
"os"
"cloud.google.com/go/storage"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
"github.com/VladPetriv/tg_scanner/config"
)
type firebaseStore struct {
cfg *config.Config
}
func NewFirebase(cfg *config.Config) Store {
return &firebaseStore{
cfg: cfg,
}
}
func (f firebaseStore) Send(ctx context.Context, pathToImage string, objectName string) (string, error) {
defaultURL := fmt.Sprintf(
"https://firebasestorage.googleapis.com/v0/b/%s/o/default.jpg?alt=media",
f.cfg.StorageBucket,
)
if objectName == "" || pathToImage == "" {
return defaultURL, nil
}
bucket, err := f.createFirebaseBucket(ctx)
if err != nil {
return "", fmt.Errorf("create firebase storage bucket: %w", err)
}
storageWriter := bucket.Object(objectName).NewWriter(ctx)
image, err := os.Open(pathToImage)
if err != nil {
return "", fmt.Errorf("open image: %w", err)
}
if _, err = io.Copy(storageWriter, image); err != nil {
return "", fmt.Errorf("copy local image to storage writer: %w", err)
}
if err = storageWriter.Close(); err != nil {
return "", fmt.Errorf("close storage writer: %w", err)
}
err = os.Remove(pathToImage)
if err != nil {
return "", fmt.Errorf("delete image: %w", err)
}
return fmt.Sprintf(
"https://firebasestorage.googleapis.com/v0/b/%s/o/%s?alt=media",
f.cfg.StorageBucket,
objectName,
), nil
}
func (f firebaseStore) createFirebaseBucket(ctx context.Context) (*storage.BucketHandle, error) {
appConfig := &firebase.Config{
ProjectID: f.cfg.ProjectID,
StorageBucket: f.cfg.StorageBucket,
}
opt := option.WithCredentialsFile(f.cfg.SecretPath)
app, err := firebase.NewApp(ctx, appConfig, opt)
if err != nil {
return nil, fmt.Errorf("create firebase app: %w", err)
}
appStorage, err := app.Storage(ctx)
if err != nil {
return nil, fmt.Errorf("create new instance of storage: %w", err)
}
bucket, err := appStorage.DefaultBucket()
if err != nil {
return nil, fmt.Errorf("get storage bucket: %w", err)
}
return bucket, nil
}