Exemplo de Implementação:
package s3
import (
"context"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
"seuprojeto/internal/domain"
)
type S3Provider struct {
client *s3.S3
bucket string
}
func NewS3Provider(client *s3.S3, bucket string) *S3Provider {
return &S3Provider{client: client, bucket: bucket}
}
func (p *S3Provider) GetFilePath(ctx context.Context, fileID string) (string, error) {
_, err := p.client.HeadObjectWithContext(ctx, &s3.HeadObjectInput{
Bucket: aws.String(p.bucket),
Key: aws.String(fileID),
})
if err != nil {
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == s3.ErrCodeNoSuchKey {
return "", domain.ErrNotFound
}
return "", domain.ErrStorage.Wrap(err, "failed to check object existence")
}
return fileID, nil
}
func (p *S3Provider) SaveFile(ctx context.Context, fileID string, data []byte) error {
_, err := p.client.PutObjectWithContext(ctx, &s3.PutObjectInput{
Bucket: aws.String(p.bucket),
Key: aws.String(fileID),
Body: bytes.NewReader(data),
})
if err != nil {
return domain.ErrStorage.Wrap(err, "failed to save file to S3")
}
return nil
}