backea/internal/client/b2_client.go
2025-03-20 22:14:45 +01:00

92 lines
2.0 KiB
Go

package b2_client
import (
"context"
"fmt"
"os"
"github.com/joho/godotenv"
"gopkg.in/kothar/go-backblaze.v0"
)
// Client represents a B2 client
type Client struct {
b2 *backblaze.B2
}
// NewClientFromEnv creates a new B2 client using credentials from .env
func NewClientFromEnv() (*Client, error) {
// Load .env file
if err := godotenv.Load(); err != nil {
return nil, fmt.Errorf("error loading .env file: %w", err)
}
// Get credentials from environment
keyID := os.Getenv("B2_KEY_ID")
applicationKey := os.Getenv("B2_APPLICATION_KEY")
if keyID == "" || applicationKey == "" {
return nil, fmt.Errorf("B2_KEY_ID and B2_APPLICATION_KEY must be set in .env file")
}
// Create B2 client
b2, err := backblaze.NewB2(backblaze.Credentials{
AccountID: keyID,
ApplicationKey: applicationKey,
})
if err != nil {
return nil, fmt.Errorf("error creating B2 client: %w", err)
}
return &Client{
b2: b2,
}, nil
}
// ListBuckets lists all buckets
func (c *Client) ListBuckets(ctx context.Context) ([]*backblaze.Bucket, error) {
// List all buckets
buckets, err := c.b2.ListBuckets()
if err != nil {
return nil, fmt.Errorf("error listing buckets: %w", err)
}
return buckets, nil
}
// GetBucket gets a bucket by name
func (c *Client) GetBucket(ctx context.Context, name string) (*backblaze.Bucket, error) {
// List all buckets
buckets, err := c.b2.ListBuckets()
if err != nil {
return nil, fmt.Errorf("error listing buckets: %w", err)
}
// Find bucket by name
for _, bucket := range buckets {
if bucket.Name == name {
return bucket, nil
}
}
return nil, fmt.Errorf("bucket not found: %s", name)
}
// CreateBucket creates a new bucket
func (c *Client) CreateBucket(ctx context.Context, name string, public bool) (*backblaze.Bucket, error) {
// Set bucket type
bucketType := backblaze.AllPrivate
if public {
bucketType = backblaze.AllPublic
}
// Create bucket
bucket, err := c.b2.CreateBucket(name, bucketType)
if err != nil {
return nil, fmt.Errorf("error creating bucket: %w", err)
}
return bucket, nil
}