Files
houston-be/pkg/s3/config.go
2023-11-02 13:11:52 +05:30

85 lines
1.8 KiB
Go

package s3
import (
"context"
"fmt"
"houston/logger"
"os"
"path/filepath"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go/aws"
"go.uber.org/zap"
)
var s3Operations S3Operations
type S3Operations interface {
UploadFile(bucketName, pathToFile, fileName, targetFileName string) (*s3.PutObjectOutput, error)
GetFileLink(bucketName, resourceName string) (string, error)
}
func NewS3Operations() S3Operations {
if s3Operations == nil {
s3Operations = newS3Client()
return s3Operations
}
return s3Operations
}
type client struct {
s3Client *s3.Client
presignClient *s3.PresignClient
}
func newS3Client() *client {
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-south-1"))
if err != nil {
logger.Error("s3 config load failed", zap.Error(err))
os.Exit(1)
}
awsS3Client := s3.NewFromConfig(cfg)
preSignClient := s3.NewPresignClient(awsS3Client)
return &client{
s3Client: awsS3Client,
presignClient: preSignClient,
}
}
func (s3c *client) UploadFile(bucketName, pathToFile, fileName, targetFileName string) (*s3.PutObjectOutput, error) {
file, err := os.Open(filepath.Join(pathToFile, fileName))
if err != nil {
return nil, err
}
defer file.Close()
uploadResponse, err := s3c.s3Client.PutObject(
context.TODO(), &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(targetFileName),
Body: file,
},
)
if err != nil {
return nil, err
}
return uploadResponse, err
}
func (s3c *client) GetFileLink(bucketName, resourceName string) (string, error) {
req, err := s3c.presignClient.PresignGetObject(
context.TODO(), &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(resourceName),
},
)
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println(req)
return req.URL, nil
}