65 lines
2.1 KiB
Go
65 lines
2.1 KiB
Go
package objectstore
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/maximhq/bifrost/core/schemas"
|
|
)
|
|
|
|
// StoreType identifies the object storage backend.
|
|
type StoreType string
|
|
|
|
const (
|
|
StoreTypeS3 StoreType = "s3"
|
|
StoreTypeGCS StoreType = "gcs"
|
|
)
|
|
|
|
// Config holds the configuration for an object store.
|
|
type Config struct {
|
|
Type StoreType `json:"type"` // "s3" or "gcs"
|
|
Bucket schemas.EnvVar `json:"bucket"`
|
|
|
|
// Common fields (apply to all store types)
|
|
Prefix string `json:"prefix,omitempty"` // Key prefix for all stored objects. Default: "bifrost".
|
|
Compress bool `json:"compress,omitempty"` // Enables gzip compression for stored objects. Default: false.
|
|
|
|
// S3 fields (used when Type == "s3")
|
|
Region *schemas.EnvVar `json:"region,omitempty"`
|
|
Endpoint *schemas.EnvVar `json:"endpoint,omitempty"`
|
|
AccessKeyID *schemas.EnvVar `json:"access_key_id,omitempty"`
|
|
SecretAccessKey *schemas.EnvVar `json:"secret_access_key,omitempty"`
|
|
SessionToken *schemas.EnvVar `json:"session_token,omitempty"`
|
|
RoleARN *schemas.EnvVar `json:"role_arn,omitempty"`
|
|
ForcePathStyle bool `json:"force_path_style,omitempty"`
|
|
|
|
// GCS fields (used when Type == "gcs")
|
|
Credentials *schemas.EnvVar `json:"credentials,omitempty"` // Deprecated: use credentials_json
|
|
CredentialsJSON *schemas.EnvVar `json:"credentials_json,omitempty"` // Service account JSON or path
|
|
ProjectID *schemas.EnvVar `json:"project_id,omitempty"` // GCP project ID override
|
|
}
|
|
|
|
// GetPrefix returns the configured prefix or "bifrost" as default.
|
|
func (c *Config) GetPrefix() string {
|
|
if c.Prefix != "" {
|
|
return c.Prefix
|
|
}
|
|
return "bifrost"
|
|
}
|
|
|
|
// NewObjectStore creates the appropriate ObjectStore implementation based on config type.
|
|
func NewObjectStore(ctx context.Context, cfg *Config, logger schemas.Logger) (ObjectStore, error) {
|
|
if cfg == nil {
|
|
return nil, fmt.Errorf("objectstore: config is required")
|
|
}
|
|
|
|
switch cfg.Type {
|
|
case StoreTypeS3:
|
|
return NewS3ObjectStore(ctx, cfg, logger)
|
|
case StoreTypeGCS:
|
|
return NewGCSObjectStore(ctx, cfg, logger)
|
|
default:
|
|
return nil, fmt.Errorf("objectstore: unsupported type %q", cfg.Type)
|
|
}
|
|
}
|