diff --git a/go.mod b/go.mod index 37d5e19..675538a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.0 require github.com/alecthomas/chroma/v2 v2.14.0 require ( - github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/dlclark/regexp2 v1.11.4 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -16,14 +16,14 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect golang.org/x/image v0.18.0 // indirect golang.org/x/net v0.27.0 // indirect - golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/oauth2 v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect + golang.org/x/time v0.6.0 // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) require ( - github.com/aws/aws-sdk-go v1.54.14 + github.com/aws/aws-sdk-go v1.55.5 github.com/clerkinc/clerk-sdk-go v1.49.1 github.com/disintegration/imaging v1.6.2 github.com/fatih/color v1.17.0 @@ -33,10 +33,10 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/stripe/stripe-go/v76 v76.25.0 - github.com/svix/svix-webhooks v1.24.0 + github.com/svix/svix-webhooks v1.28.0 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc golang.org/x/crypto v0.25.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/sys v0.23.0 // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index d6a889f..e8824cb 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4E github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/aws/aws-sdk-go v1.54.14 h1:llJ60MzLzovyDE/rEDbUjS1cICh7krk1PwQwNlKRoeQ= -github.com/aws/aws-sdk-go v1.54.14/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/brianvoe/gofakeit/v6 v6.19.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= github.com/clerkinc/clerk-sdk-go v1.49.1 h1:3YfEFuXrM7fg6+GYxXR0umbV3aboErNUlOcFMuR5rfY= github.com/clerkinc/clerk-sdk-go v1.49.1/go.mod h1:pejhMTTDAuw5aBpiHBEOOOHMAsxNfPvKfM5qexFJYlc= @@ -18,8 +18,8 @@ github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1 github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= @@ -66,8 +66,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stripe/stripe-go/v76 v76.25.0 h1:kmDoOTvdQSTQssQzWZQQkgbAR2Q8eXdMWbN/ylNalWA= github.com/stripe/stripe-go/v76 v76.25.0/go.mod h1:rw1MxjlAKKcZ+3FOXgTHgwiOa2ya6CPq6ykpJ0Q6Po4= -github.com/svix/svix-webhooks v1.24.0 h1:NL8WVC+GpXXJdt0JJ4jfUsCK0CjYxZiU2bM2nRvXaW0= -github.com/svix/svix-webhooks v1.24.0/go.mod h1:MPOB9jpp6jPh652WuKeuKIV5m2APqXXOjLxxOe4mDmM= +github.com/svix/svix-webhooks v1.28.0 h1:wl1jafzdEiJ4mh0oqfRhwijiga15cgp1Yl+EuAFw6CY= +github.com/svix/svix-webhooks v1.28.0/go.mod h1:CteUj578U/Mmem33Hda4lhzQ6mIs8pwmgj3f9NAG7vQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -100,8 +100,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -118,8 +118,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -136,8 +136,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/lib/s3.go b/lib/s3.go index 80f8869..b3f250f 100644 --- a/lib/s3.go +++ b/lib/s3.go @@ -11,13 +11,16 @@ import ( "github.com/aws/aws-sdk-go/service/s3" ) +// Generates a presigned URL for the given key. Returns the pre-signed URL. func GeneratePublicURL(key string) string { + // Get the S3 bucket name bucket := os.Getenv("BUCKET_NAME") if bucket == "" { - fmt.Println("No S3 bucket specified, skipping upload.") + fmt.Println("No S3 bucket specified.") return "" } + // Create the S3 session endpoint := os.Getenv("AWS_ENDPOINT_URL_S3") accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") @@ -38,6 +41,7 @@ func GeneratePublicURL(key string) string { svc := s3.New(sess) + // Generate the presigned URL req, _ := svc.GetObjectRequest(&s3.GetObjectInput{ Bucket: &bucket, Key: &key, @@ -50,3 +54,72 @@ func GeneratePublicURL(key string) string { return urlStr } + +// Generates a list of presigned URLs for all items in the given directory. Returns an array of pre-signed URLs. +func GeneratePublicURLsFromDirectory(directory string) []string { + // Get the S3 bucket name + bucket := os.Getenv("BUCKET_NAME") + if bucket == "" { + fmt.Println("No S3 bucket specified.") + return []string{} + } + + // Create the S3 session + endpoint := os.Getenv("AWS_ENDPOINT_URL_S3") + accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") + secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") + region := os.Getenv("AWS_REGION") + + sess, err := session.NewSession(&aws.Config{ + Region: ®ion, + Credentials: credentials.NewStaticCredentials( + accessKeyID, + secretAccessKey, + "", + ), + Endpoint: aws.String(endpoint), + }) + if err != nil { + return []string{} + } + + svc := s3.New(sess) + + // Create the input for the ListObjectsV2 call + input := &s3.ListObjectsV2Input{ + Bucket: aws.String(bucket), + Prefix: aws.String(directory), + } + + // Get the list of items in the directory + result, err := svc.ListObjectsV2(input) + if err != nil { + return []string{} + } + + //Remove the items in results that are directories + for i := 0; i < len(result.Contents); i++ { + if *result.Contents[i].Key == directory { + result.Contents = append(result.Contents[:i], result.Contents[i+1:]...) + i-- + } + } + + // Generate the presigned URLs + urls := []string{} + for _, item := range result.Contents { + req, _ := svc.GetObjectRequest(&s3.GetObjectInput{ + Bucket: aws.String(bucket), + Key: item.Key, + }) + urlStr, err := req.Presign(15 * time.Minute) + + if err != nil { + continue + } + + urls = append(urls, urlStr) + } + + return urls +} diff --git a/pages/testimonials.go b/pages/testimonials.go index bea84bf..0b15dc9 100644 --- a/pages/testimonials.go +++ b/pages/testimonials.go @@ -10,17 +10,7 @@ type TestimonialsProps struct { } func Testimonials(c echo.Context) error { - images := []string{ - "/public/img/testimonials/1.png", - "/public/img/testimonials/2.png", - "/public/img/testimonials/3.png", - "/public/img/testimonials/4.png", - "/public/img/testimonials/5.png", - "/public/img/testimonials/6.png", - "/public/img/testimonials/7.png", - "/public/img/testimonials/8.png", - "/public/img/testimonials/9.png", - } + images := lib.GeneratePublicURLsFromDirectory("testimonials/") props := TestimonialsProps{ Images: images, diff --git a/public/img/testimonials/1.png b/public/img/testimonials/1.png deleted file mode 100644 index 80051c8..0000000 Binary files a/public/img/testimonials/1.png and /dev/null differ diff --git a/public/img/testimonials/2.png b/public/img/testimonials/2.png deleted file mode 100644 index d0c1527..0000000 Binary files a/public/img/testimonials/2.png and /dev/null differ diff --git a/public/img/testimonials/3.png b/public/img/testimonials/3.png deleted file mode 100644 index f75ebd2..0000000 Binary files a/public/img/testimonials/3.png and /dev/null differ diff --git a/public/img/testimonials/4.png b/public/img/testimonials/4.png deleted file mode 100644 index cb86103..0000000 Binary files a/public/img/testimonials/4.png and /dev/null differ diff --git a/public/img/testimonials/5.png b/public/img/testimonials/5.png deleted file mode 100644 index 16e3b9f..0000000 Binary files a/public/img/testimonials/5.png and /dev/null differ diff --git a/public/img/testimonials/6.png b/public/img/testimonials/6.png deleted file mode 100644 index 6452bce..0000000 Binary files a/public/img/testimonials/6.png and /dev/null differ diff --git a/public/img/testimonials/7.png b/public/img/testimonials/7.png deleted file mode 100644 index 4cf0e6f..0000000 Binary files a/public/img/testimonials/7.png and /dev/null differ diff --git a/public/img/testimonials/8.png b/public/img/testimonials/8.png deleted file mode 100644 index 7102c8c..0000000 Binary files a/public/img/testimonials/8.png and /dev/null differ diff --git a/public/img/testimonials/9.png b/public/img/testimonials/9.png deleted file mode 100644 index 4f31fb7..0000000 Binary files a/public/img/testimonials/9.png and /dev/null differ