diff --git a/s3/s3.go b/s3/s3.go index ea0dc2bfc827ea4577202998a403b034ef5b2302..f2639419b18db2e7449335b82db8f724fabac981 100644 --- a/s3/s3.go +++ b/s3/s3.go @@ -9,6 +9,9 @@ import ( "strings" "time" + "github.com/aws/aws-sdk-go/aws/awserr" + "gitlab.com/uafrica/go-utils/errors" + "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws" @@ -138,9 +141,37 @@ func (s SessionWithHelpers) GetSignedDownloadURL(bucket string, fileName string, } getRequest, _ := s.S3Session.GetObjectRequest(getInput) + fileExists, err := s.FileExists(bucket, fileName) + if err != nil { + return "", err + } + + if !fileExists { + return "", errors.Error("File does not exist") + } + return getRequest.Presign(duration) } +func (s SessionWithHelpers) FileExists(bucket string, fileName string) (bool, error) { + _, err := s.S3Session.HeadObject(&s3.HeadObjectInput{ + Bucket: aws.String(bucket), + Key: aws.String(fileName), + }) + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + switch aerr.Code() { + case "NotFound": // s3.ErrCodeNoSuchKey does not work, aws is missing this error code so we hardwire a string + return false, nil + default: + return false, err + } + } + return false, err + } + return true, nil +} + // UploadWithFileExtension will upload a file to S3 and return a standard S3UploadResponse. func (s SessionWithHelpers) UploadWithFileExtension(data []byte, bucket, filePrefix string, fileExt string, mimeType MIMEType, isDebug bool) (*S3UploadResponse, error) { fileName := fmt.Sprintf("%s_%s.%s", filePrefix, uuid.New().String(), fileExt)