forked from
tangled.org/core
Monorepo for Tangled
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}