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 }