Monorepo for Tangled
at master 75 lines 1.5 kB view raw
1package engine 2 3import ( 4 "context" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 10 "github.com/aws/aws-sdk-go-v2/aws" 11 "github.com/aws/aws-sdk-go-v2/config" 12 "github.com/aws/aws-sdk-go-v2/service/s3" 13) 14 15type S3 struct { 16 bucket string 17 client *s3.Client 18} 19 20const BaseS3Path = "spindle/workflows" 21 22func NewS3(bucket string) (*S3, error) { 23 if bucket == "" { 24 return nil, fmt.Errorf("s3 bucket not provided") 25 } 26 27 ctx := context.Background() 28 sdkConfig, err := config.LoadDefaultConfig(ctx) 29 30 if err != nil { 31 return nil, fmt.Errorf("error loading s3 config: %w", err) 32 } 33 s3Client := s3.NewFromConfig(sdkConfig) 34 35 return &S3{ 36 bucket: bucket, 37 client: s3Client, 38 }, nil 39} 40 41func (s *S3) WriteFile(ctx context.Context, path string) error { 42 s3Key := fmt.Sprintf("%s/%s", BaseS3Path, filepath.Base(path)) 43 44 file, err := os.Open(path) 45 if err != nil { 46 return fmt.Errorf("error opening file %s: %w", path, err) 47 } 48 defer file.Close() 49 50 _, err = s.client.PutObject(ctx, &s3.PutObjectInput{ 51 Bucket: &s.bucket, 52 Key: &s3Key, 53 Body: file, 54 }) 55 56 if err != nil { 57 return fmt.Errorf("error writing to s3: %w", err) 58 } 59 60 return nil 61} 62 63func (s *S3) ReadFile(ctx context.Context, name string) ([]byte, error) { 64 res, err := s.client.GetObject(ctx, &s3.GetObjectInput{ 65 Bucket: &s.bucket, 66 Key: aws.String(name), 67 }) 68 69 if err != nil { 70 return nil, fmt.Errorf("error reading file %s: %w", name, err) 71 } 72 defer res.Body.Close() 73 74 return io.ReadAll(res.Body) 75}