Files
sendico/api/billing/documents/internal/docstore/store.go
2026-01-30 15:16:20 +01:00

68 lines
1.8 KiB
Go

package docstore
import (
"context"
"strings"
"github.com/tech/sendico/pkg/merrors"
"github.com/tech/sendico/pkg/mlogger"
)
// Driver identifies the document storage backend.
type Driver string
const (
DriverLocal Driver = "local_fs"
DriverS3 Driver = "s3"
DriverMinio Driver = "minio"
)
// Config configures the document storage backend.
type Config struct {
Driver Driver `yaml:"driver"`
Local *LocalConfig `yaml:"local"`
S3 *S3Config `yaml:"s3"`
}
// LocalConfig configures local filesystem storage.
type LocalConfig struct {
RootPath string `yaml:"root_path"`
}
// S3Config configures S3/Minio storage.
type S3Config struct {
Endpoint string `yaml:"endpoint"`
Region string `yaml:"region"`
Bucket string `yaml:"bucket"`
AccessKeyEnv string `yaml:"access_key_env"`
SecretKeyEnv string `yaml:"secret_access_key_env"`
AccessKey string `yaml:"access_key"`
SecretAccessKey string `yaml:"secret_access_key"`
UseSSL bool `yaml:"use_ssl"`
ForcePathStyle bool `yaml:"force_path_style"`
}
// Store defines storage operations for generated documents.
type Store interface {
Save(ctx context.Context, key string, data []byte) error
Load(ctx context.Context, key string) ([]byte, error)
}
// New creates a document store based on config.
func New(logger mlogger.Logger, cfg Config) (Store, error) {
switch strings.ToLower(string(cfg.Driver)) {
case string(DriverLocal):
if cfg.Local == nil {
return nil, merrors.InvalidArgument("docstore: local config missing")
}
return NewLocalStore(logger, *cfg.Local)
case string(DriverS3), string(DriverMinio):
if cfg.S3 == nil {
return nil, merrors.InvalidArgument("docstore: s3 config missing")
}
return NewS3Store(logger, *cfg.S3)
default:
return nil, merrors.InvalidArgument("docstore: unsupported driver")
}
}