92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
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))
|
|
}
|
|
}
|