Documentation
¶
Overview ¶
Example ¶
package main
import (
"context"
"fmt"
loggingnoop "github.com/primandproper/platform-go/v3/observability/logging/noop"
metricsnoop "github.com/primandproper/platform-go/v3/observability/metrics/noop"
tracingnoop "github.com/primandproper/platform-go/v3/observability/tracing/noop"
"github.com/primandproper/platform-go/v3/uploads"
"github.com/primandproper/platform-go/v3/uploads/objectstorage"
)
func newExampleManager() *objectstorage.Uploader {
m, err := objectstorage.NewUploadManager(
context.Background(),
loggingnoop.NewLogger(),
tracingnoop.NewTracerProvider(),
metricsnoop.NewMetricsProvider(),
&objectstorage.Config{BucketName: "example", Provider: objectstorage.MemoryProvider},
)
if err != nil {
panic(err)
}
return m
}
func main() {
ctx := context.Background()
mgr := newExampleManager()
if err := uploads.SaveFile(ctx, mgr, "greeting.txt", []byte("hello world")); err != nil {
panic(err)
}
data, err := uploads.ReadFile(ctx, mgr, "greeting.txt")
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
Output: hello world
Index ¶
- Constants
- Variables
- func ProvideUploadManager(u *Uploader) uploads.UploadManager
- func RegisterUploadManager(i do.Injector)
- type BackblazeB2Config
- type Config
- type FilesystemConfig
- type R2Config
- type Uploader
- func (u *Uploader) Attributes(ctx context.Context, path string) (*uploads.Attributes, error)
- func (u *Uploader) Delete(ctx context.Context, path string) error
- func (u *Uploader) Exists(ctx context.Context, path string) (bool, error)
- func (u *Uploader) List(ctx context.Context, prefix string) iter.Seq2[uploads.ObjectInfo, error]
- func (u *Uploader) Open(ctx context.Context, path string) (io.ReadCloser, error)
- func (u *Uploader) OpenRange(ctx context.Context, path string, offset, length int64) (io.ReadCloser, error)
- func (u *Uploader) Save(ctx context.Context, path string, r io.Reader, opts ...uploads.SaveOption) error
- func (u *Uploader) SignedURL(ctx context.Context, path string, opts *uploads.SignedURLOptions) (string, error)
Examples ¶
Constants ¶
const ( // FilesystemProvider indicates we'd like to use the filesystem adapter for blob. FilesystemProvider = "filesystem" // MemoryProvider indicates we'd like to use the memory adapter for blob. MemoryProvider = "memory" // S3Provider indicates we'd like to use the s3 adapter for blob. S3Provider = "s3" // GCPCloudStorageProvider indicates we'd like to use the GCP adapter for blob objectstorage. GCPCloudStorageProvider = "gcp" // R2Provider indicates we'd like to use the Cloudflare R2 adapter for blob. R2Provider = "r2" // BackblazeB2Provider indicates we'd like to use the Backblaze B2 adapter for blob. BackblazeB2Provider = "backblaze_b2" )
Variables ¶
var ( // ErrNilConfig denotes that the provided configuration is nil. ErrNilConfig = platformerrors.New("nil config provided") // ErrUnknownProvider denotes that the configured provider is not recognized. ErrUnknownProvider = platformerrors.New("unknown storage provider") )
Functions ¶
func ProvideUploadManager ¶
func ProvideUploadManager(u *Uploader) uploads.UploadManager
ProvideUploadManager transforms an *objectstorage.Uploader into an UploadManager.
func RegisterUploadManager ¶
RegisterUploadManager registers both *Uploader and uploads.UploadManager with the injector. Prerequisite: *Config must be registered (e.g. via uploadscfg.RegisterStorageConfig).
Types ¶
type BackblazeB2Config ¶
type BackblazeB2Config struct {
ApplicationKeyID string `env:"APPLICATION_KEY_ID" json:"applicationKeyID"`
ApplicationKey string `env:"APPLICATION_KEY" json:"applicationKey"`
Region string `env:"REGION" json:"region"`
// contains filtered or unexported fields
}
BackblazeB2Config configures a Backblaze B2-based objectstorage provider.
func (*BackblazeB2Config) ValidateWithContext ¶
func (c *BackblazeB2Config) ValidateWithContext(ctx context.Context) error
ValidateWithContext validates the BackblazeB2Config.
type Config ¶
type Config struct {
FilesystemConfig *FilesystemConfig `env:"init" envPrefix:"FILESYSTEM_" json:"filesystem,omitempty"`
R2Config *R2Config `env:"init" envPrefix:"R2_" json:"r2,omitempty"`
BackblazeB2Config *BackblazeB2Config `env:"init" envPrefix:"BACKBLAZE_B2_" json:"backblazeB2,omitempty"`
BucketPrefix string `env:"BUCKET_PREFIX" json:"bucketPrefix,omitempty"`
BucketName string `env:"BUCKET_NAME" json:"bucketName,omitempty"`
Provider string `env:"PROVIDER" json:"provider,omitempty"`
CircuitBreaker circuitbreakingcfg.Config `env:"init" envPrefix:"CIRCUIT_BREAKING_" json:"circuitBreakerConfig"`
// contains filtered or unexported fields
}
Config configures our UploadManager.
func (*Config) ValidateWithContext ¶
ValidateWithContext validates the Config. It first canonicalizes Provider (trim + lowercase) so validation, the conditional sub-config rules, and dispatch in selectBucket all agree — otherwise a value like "S3" or " s3 " would fail validation yet dispatch cleanly.
type FilesystemConfig ¶
type FilesystemConfig struct {
RootDirectory string `env:"ROOT_DIRECTORY" json:"rootDirectory"`
// DirectoryMode is the os.FileMode for directories the backend creates.
// Defaults to 0700 when unset (zero).
DirectoryMode os.FileMode `env:"DIRECTORY_MODE" json:"directoryMode"`
// contains filtered or unexported fields
}
FilesystemConfig configures a filesystem-based objectstorage provider.
func (*FilesystemConfig) ValidateWithContext ¶
func (c *FilesystemConfig) ValidateWithContext(ctx context.Context) error
ValidateWithContext validates the FilesystemConfig.
type R2Config ¶
type R2Config struct {
AccountID string `env:"ACCOUNT_ID" json:"accountID"`
AccessKeyID string `env:"ACCESS_KEY_ID" json:"accessKeyID"`
SecretAccessKey string `env:"SECRET_ACCESS_KEY" json:"secretAccessKey"`
// contains filtered or unexported fields
}
R2Config configures a Cloudflare R2-based objectstorage provider.
type Uploader ¶
type Uploader struct {
// contains filtered or unexported fields
}
Uploader implements the uploads.UploadManager interface.
func NewUploadManager ¶
func NewUploadManager(ctx context.Context, logger logging.Logger, tracerProvider tracing.TracerProvider, metricsProvider metrics.Provider, cfg *Config) (*Uploader, error)
NewUploadManager provides a new uploads.UploadManager.
func (*Uploader) Attributes ¶
Attributes fetches the stored metadata for the object at path.
Example ¶
package main
import (
"context"
"fmt"
loggingnoop "github.com/primandproper/platform-go/v3/observability/logging/noop"
metricsnoop "github.com/primandproper/platform-go/v3/observability/metrics/noop"
tracingnoop "github.com/primandproper/platform-go/v3/observability/tracing/noop"
"github.com/primandproper/platform-go/v3/uploads"
"github.com/primandproper/platform-go/v3/uploads/objectstorage"
)
func newExampleManager() *objectstorage.Uploader {
m, err := objectstorage.NewUploadManager(
context.Background(),
loggingnoop.NewLogger(),
tracingnoop.NewTracerProvider(),
metricsnoop.NewMetricsProvider(),
&objectstorage.Config{BucketName: "example", Provider: objectstorage.MemoryProvider},
)
if err != nil {
panic(err)
}
return m
}
func main() {
ctx := context.Background()
mgr := newExampleManager()
if err := uploads.SaveFile(ctx, mgr, "photo.png", []byte("hello world")); err != nil {
panic(err)
}
attrs, err := mgr.Attributes(ctx, "photo.png")
if err != nil {
panic(err)
}
fmt.Println(attrs.Size)
}
Output: 11
func (*Uploader) List ¶
List streams the objects stored under prefix. Objects are fetched lazily as the returned iterator is consumed; the caller may stop early by breaking out of the range loop.
Example ¶
package main
import (
"context"
"fmt"
"sort"
loggingnoop "github.com/primandproper/platform-go/v3/observability/logging/noop"
metricsnoop "github.com/primandproper/platform-go/v3/observability/metrics/noop"
tracingnoop "github.com/primandproper/platform-go/v3/observability/tracing/noop"
"github.com/primandproper/platform-go/v3/uploads"
"github.com/primandproper/platform-go/v3/uploads/objectstorage"
)
func newExampleManager() *objectstorage.Uploader {
m, err := objectstorage.NewUploadManager(
context.Background(),
loggingnoop.NewLogger(),
tracingnoop.NewTracerProvider(),
metricsnoop.NewMetricsProvider(),
&objectstorage.Config{BucketName: "example", Provider: objectstorage.MemoryProvider},
)
if err != nil {
panic(err)
}
return m
}
func main() {
ctx := context.Background()
mgr := newExampleManager()
for _, name := range []string{"data/a.txt", "data/b.txt", "other/c.txt"} {
if err := uploads.SaveFile(ctx, mgr, name, []byte("x")); err != nil {
panic(err)
}
}
// List streams objects lazily; break out of the loop to stop early.
var paths []string
for obj, err := range mgr.List(ctx, "data/") {
if err != nil {
panic(err)
}
paths = append(paths, obj.Path)
}
sort.Strings(paths)
fmt.Println(paths)
}
Output: [data/a.txt data/b.txt]
func (*Uploader) Open ¶
Open returns a reader for the object at path. The caller is responsible for closing it.
func (*Uploader) OpenRange ¶
func (u *Uploader) OpenRange(ctx context.Context, path string, offset, length int64) (io.ReadCloser, error)
OpenRange returns a reader over length bytes of the object at path, starting at offset. A negative length reads to the end. The caller is responsible for closing it.
func (*Uploader) Save ¶
func (u *Uploader) Save(ctx context.Context, path string, r io.Reader, opts ...uploads.SaveOption) error
Save writes the contents of r to the object at path.
func (*Uploader) SignedURL ¶
func (u *Uploader) SignedURL(ctx context.Context, path string, opts *uploads.SignedURLOptions) (string, error)
SignedURL mints a signed URL granting temporary, direct access to the object at path. Not all providers support signing (e.g. the in-memory and unsigned filesystem backends return an error).