package storage import ( "fmt" "go/weather/pkg/logger" "io" "os" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/defaults" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3/s3manager" toml "github.com/pelletier/go-toml" "go.uber.org/zap" ) //AwsDefaultSection toml default section type AwsDefaultSection struct { // attribute should be public ! for go-toml EndpointURL string `toml:"endpoint_url"` } //CustomAwsConfig custom toml config for aws type CustomAwsConfig struct { Default AwsDefaultSection `toml:"default"` } //s3Storage classe used to store oi.Reader to s3 type s3Storage struct { logger *logger.WeatherLogger session *session.Session bucket string } //NewS3Storage instanciate storage object func NewS3Storage(log *logger.WeatherLogger, bucket string) Storage { s3 := s3Storage{ logger: log, bucket: bucket, } customConfig := CustomAwsConfig{} err := decodeFile(defaults.SharedConfigFilename(), &customConfig) s3.handleError(err) s, err := session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, Config: aws.Config{ Endpoint: &customConfig.Default.EndpointURL, DisableSSL: aws.Bool(true), LogLevel: aws.LogLevel(aws.LogDebug), }, }) s3.handleError(err) s3.session = s return &s3 } //Store send data to s3 bucket func (ss *s3Storage) Store(content io.Reader) { uploader := s3manager.NewUploader(ss.session) _, err := uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(ss.bucket), Key: aws.String(time.Now().UTC().Format(time.RFC3339)), Body: content, }) fmt.Printf("failed to upload file, %v\n", err) ss.handleError(err) } //DecodeFile call toml.Decode with file func decodeFile(fpath string, v interface{}) error { bs, err := os.Open(fpath) if err != nil { return err } d := toml.NewDecoder(bs) err = d.Decode(v) return err } //handleError generic fatal error func (ss *s3Storage) handleError(err error) { if err != nil { ss.logger.Fatal("Storage error", zap.Error(err)) } }