This repository has been archived by the owner on Feb 11, 2024. It is now read-only.
/
s3.go
83 lines (70 loc) · 2.64 KB
/
s3.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Package external is the implementation for accessing external services.
package external
import (
"bytes"
"context"
"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"
"github.com/nao1215/emigre/server/app/domain/service"
"github.com/nao1215/emigre/server/config"
)
// S3Downloader is an implementation for FileDownloader.
type S3Downloader struct {
*s3manager.Downloader
}
var _ service.FileDownloder = &S3Downloader{}
// downloadBufferSize is the buffer size for downloading files. It's 5MB.
const downloadBufferSize = 5 * 1024 * 1024
// NewS3Downloader returns a new S3Downloader struct.
func NewS3Downloader(config config.S3) *S3Downloader {
session := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable, // Ref. ~/.aws/config
Config: aws.Config{Region: aws.String(config.Region.String())},
}))
downloader := s3manager.NewDownloader(session, func(d *s3manager.Downloader) {
d.BufferProvider = s3manager.NewPooledBufferedWriterReadFromProvider(downloadBufferSize)
})
return &S3Downloader{downloader}
}
// DownloadFile downloads a file from S3.
func (s *S3Downloader) DownloadFile(_ context.Context, input *service.FileDownloderInput) (*service.FileDownloderOutput, error) {
buf := aws.NewWriteAtBuffer([]byte{})
objInput := &s3.GetObjectInput{
Bucket: aws.String(input.Config.Bucket.String()),
Key: aws.String(input.Key),
}
if _, err := s.Download(buf, objInput); err != nil {
return nil, err
}
return &service.FileDownloderOutput{
Buffer: bytes.NewBuffer(buf.Bytes()),
}, nil
}
// S3Uploader is an implementation for FileUploader.
type S3Uploader struct {
*s3manager.Uploader
}
var _ service.FileUploader = &S3Uploader{}
// NewS3Uploader returns a new S3Uploader struct.
func NewS3Uploader(config config.S3) *S3Uploader {
session := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable, // Ref. ~/.aws/config
Config: aws.Config{Region: aws.String(config.Region.String())},
}))
return &S3Uploader{s3manager.NewUploader(session)}
}
// UploadFile uploads a file to S3.
func (s *S3Uploader) UploadFile(_ context.Context, input *service.FileUploaderInput) (*service.FileUploaderOutput, error) {
uploadInput := &s3manager.UploadInput{
Bucket: aws.String(input.Config.Bucket.String()),
Body: aws.ReadSeekCloser(input.Data),
Key: aws.String(input.Key),
// TODO: Set ContentType
}
if _, err := s.Upload(uploadInput); err != nil {
return nil, err
}
return &service.FileUploaderOutput{}, nil
}