82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package handler
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
)
|
|
|
|
const DefaultAwsRegion = "eu-west-1"
|
|
|
|
var (
|
|
s3Session *session.Session
|
|
s3Client *s3.S3
|
|
s3Uploader *s3manager.Uploader
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
s3Session, err = session.NewSession(&aws.Config{Region: aws.String(DefaultAwsRegion)})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
s3Client = s3.New(s3Session)
|
|
s3Uploader = s3manager.NewUploader(s3Session)
|
|
}
|
|
|
|
type S3Handler struct {
|
|
Bucket string
|
|
ACL string
|
|
}
|
|
|
|
func NewS3Handler(bucket string, acl string) *S3Handler {
|
|
return &S3Handler{
|
|
Bucket: bucket,
|
|
ACL: acl,
|
|
}
|
|
}
|
|
|
|
func (h *S3Handler) AssetAdded(a Asset) error {
|
|
f, err := os.Open(a.Path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
result, err := s3Uploader.Upload(&s3manager.UploadInput{
|
|
Key: aws.String(a.Key),
|
|
Bucket: aws.String(h.Bucket),
|
|
ACL: aws.String(h.ACL),
|
|
Body: f,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Uploaded", a.Path, "to", result.Location)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *S3Handler) AssetRemoved(a Asset) error {
|
|
// TODO consider cleaning up assets every ~60 seconds?
|
|
// https://github.com/aws/aws-sdk-go/blob/v1.33.4/service/s3/s3manager/batch.go#L255
|
|
_, err := s3Client.DeleteObject(&s3.DeleteObjectInput{
|
|
Key: aws.String(a.Key),
|
|
Bucket: aws.String(h.Bucket),
|
|
})
|
|
|
|
fmt.Println("Deleted", a.Key)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|