summaryrefslogtreecommitdiff
path: root/internal/storage/storage.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2022-11-24 08:35:46 +0000
committerLibravatar GitHub <noreply@github.com>2022-11-24 09:35:46 +0100
commitfcb9c0bb8bed51ffb856b8e47f4e047ddd75eb67 (patch)
tree933c9e1ed2b37e3ca2ee371c0b53f2c1ac561cc5 /internal/storage/storage.go
parent[feature/performance] Fail fast when doing remote transport calls inside inco... (diff)
downloadgotosocial-fcb9c0bb8bed51ffb856b8e47f4e047ddd75eb67.tar.xz
[chore] cleanup storage implementation, no need for multiple interface types (#1131)
Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/storage/storage.go')
-rw-r--r--internal/storage/storage.go79
1 files changed, 53 insertions, 26 deletions
diff --git a/internal/storage/storage.go b/internal/storage/storage.go
index 71d4774f7..498ea873a 100644
--- a/internal/storage/storage.go
+++ b/internal/storage/storage.go
@@ -20,11 +20,11 @@ package storage
import (
"context"
- "errors"
"fmt"
- "io"
+ "mime"
"net/url"
"path"
+ "time"
"codeberg.org/gruf/go-store/v2/kv"
"codeberg.org/gruf/go-store/v2/storage"
@@ -33,32 +33,50 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/config"
)
-var (
- ErrNotSupported = errors.New("driver does not suppport functionality")
- ErrAlreadyExists = storage.ErrAlreadyExists
-)
+// ErrAlreadyExists is a ptr to underlying storage.ErrAlreadyExists,
+// to put the related errors in the same package as our storage wrapper.
+var ErrAlreadyExists = storage.ErrAlreadyExists
+
+// Driver wraps a kv.KVStore to also provide S3 presigned GET URLs.
+type Driver struct {
+ // Underlying storage
+ *kv.KVStore
+ Storage storage.Storage
-// Driver implements the functionality to store and retrieve blobs
-// (images,video,audio)
-type Driver interface {
- Get(ctx context.Context, key string) ([]byte, error)
- GetStream(ctx context.Context, key string) (io.ReadCloser, error)
- PutStream(ctx context.Context, key string, r io.Reader) error
- Put(ctx context.Context, key string, value []byte) error
- Delete(ctx context.Context, key string) error
- URL(ctx context.Context, key string) *url.URL
+ // S3-only parameters
+ Proxy bool
+ Bucket string
}
-func AutoConfig() (Driver, error) {
- switch config.GetStorageBackend() {
+// URL will return a presigned GET object URL, but only if running on S3 storage with proxying disabled.
+func (d *Driver) URL(ctx context.Context, key string) *url.URL {
+ // Check whether S3 *without* proxying is enabled
+ s3, ok := d.Storage.(*storage.S3Storage)
+ if !ok || d.Proxy {
+ return nil
+ }
+
+ // If URL request fails, fallback is to fetch the file. So ignore the error here
+ url, _ := s3.Client().PresignedGetObject(ctx, d.Bucket, key, time.Hour, url.Values{
+ "response-content-type": []string{mime.TypeByExtension(path.Ext(key))},
+ })
+
+ return url
+}
+
+func AutoConfig() (*Driver, error) {
+ var st storage.Storage
+
+ switch backend := config.GetStorageBackend(); backend {
case "s3":
+ // Load runtime configuration
endpoint := config.GetStorageS3Endpoint()
access := config.GetStorageS3AccessKey()
secret := config.GetStorageS3SecretKey()
secure := config.GetStorageS3UseSSL()
bucket := config.GetStorageS3BucketName()
- proxy := config.GetStorageS3Proxy()
+ // Open the s3 storage implementation
s3, err := storage.OpenS3(endpoint, bucket, &storage.S3Config{
CoreOpts: minio.Options{
Creds: credentials.NewStaticV4(access, secret, ""),
@@ -75,15 +93,14 @@ func AutoConfig() (Driver, error) {
return nil, fmt.Errorf("error opening s3 storage: %w", err)
}
- return &S3{
- Proxy: proxy,
- Bucket: bucket,
- Storage: s3,
- KVStore: kv.New(s3),
- }, nil
+ // Set storage impl
+ st = s3
+
case "local":
+ // Load runtime configuration
basePath := config.GetStorageLocalBasePath()
+ // Open the disk storage implementation
disk, err := storage.OpenDisk(basePath, &storage.DiskConfig{
// Put the store lockfile in the storage dir itself.
// Normally this would not be safe, since we could end up
@@ -96,7 +113,17 @@ func AutoConfig() (Driver, error) {
return nil, fmt.Errorf("error opening disk storage: %w", err)
}
- return &Local{kv.New(disk)}, nil
+ // Set storage impl
+ st = disk
+
+ default:
+ return nil, fmt.Errorf("invalid storage backend: %s", backend)
}
- return nil, fmt.Errorf("invalid storage backend %s", config.GetStorageBackend())
+
+ return &Driver{
+ KVStore: kv.New(st),
+ Proxy: config.GetStorageS3Proxy(),
+ Bucket: config.GetStorageS3BucketName(),
+ Storage: st,
+ }, nil
}