package services import ( "context" "time" "github.com/aws/aws-sdk-go-v2/service/s3" ) var S3Client S3 type S3 interface { GetPresignedURL(ctx context.Context, key, contentType string, expiry time.Duration) (string, error) DoesFileExist(ctx context.Context, key string) (bool, error) } type S3Concrete struct { S3Client *s3.Client Bucket string } func (svc S3Concrete) GetPresignedURL(ctx context.Context, key, contentType string, expiry time.Duration) (string, error) { presignClient := s3.NewPresignClient(svc.S3Client) request, err := presignClient.PresignPutObject(ctx, &s3.PutObjectInput{ Bucket: &svc.Bucket, Key: &key, ContentType: &contentType, }, s3.WithPresignExpires(expiry)) if err != nil { return "", err } return request.URL, nil } func (svc S3Concrete) DoesFileExist(ctx context.Context, key string) (bool, error) { _, error := svc.S3Client.HeadObject(ctx, &s3.HeadObjectInput{ Bucket: &svc.Bucket, Key: &key, }) if error != nil { return false, error } return true, nil }