Files
transcriber/internal/service/s3/s3.go

88 lines
2.2 KiB
Go

package s3
import (
"context"
"fmt"
"os"
"strings"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
type S3Service struct {
client *s3.Client
uploader *manager.Uploader
bucketName string
}
func NewS3Service() (*S3Service, error) {
region := os.Getenv("AWS_REGION")
accessKey := os.Getenv("AWS_ACCESS_KEY_ID")
secretKey := os.Getenv("AWS_SECRET_ACCESS_KEY")
bucketName := os.Getenv("S3_BUCKET_NAME")
endpoint := os.Getenv("S3_ENDPOINT")
if region == "" || accessKey == "" || secretKey == "" || bucketName == "" {
return nil, fmt.Errorf("missing required S3 environment variables")
}
// Создаем конфигурацию
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithRegion(region),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKey, secretKey, "")),
)
if err != nil {
return nil, fmt.Errorf("failed to load AWS config: %w", err)
}
// Создаем клиент S3
var client *s3.Client
if endpoint != "" {
// Кастомный endpoint (например, для MinIO)
client = s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String(endpoint)
o.UsePathStyle = true
})
} else {
// Стандартный AWS S3
client = s3.NewFromConfig(cfg)
}
uploader := manager.NewUploader(client)
return &S3Service{
client: client,
uploader: uploader,
bucketName: bucketName,
}, nil
}
func (s *S3Service) UploadFile(filePath, fileName string) error {
file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("failed to open file %s: %w", filePath, err)
}
defer file.Close()
_, err = s.uploader.Upload(context.TODO(), &s3.PutObjectInput{
Bucket: aws.String(s.bucketName),
Key: aws.String(fileName),
Body: file,
})
if err != nil {
return fmt.Errorf("failed to upload file to S3: %w", err)
}
return nil
}
func (s *S3Service) FileUrl(fileName string) string {
endpoint := strings.TrimRight(os.Getenv("S3_ENDPOINT"), "/")
bucketName := os.Getenv("S3_BUCKET_NAME")
return fmt.Sprintf("%s/%s/%s", endpoint, bucketName, fileName)
}