Rename GenerateFileTempURL to GenerateFileURL, remove S3 presign duplication

Replace the inline PresignGetObject logic in probo.FileService with a
call to fileManager.GenerateFileUrl. Update the two callers.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
This commit is contained in:
Ludovic Vielle
2026-06-08 19:53:38 +02:00
parent 14c500b1b2
commit 6f83d9be48
3 changed files with 7 additions and 25 deletions

View File

@@ -409,7 +409,7 @@ func (s AuditService) GenerateReportURL(
return nil, fmt.Errorf("audit has no report") return nil, fmt.Errorf("audit has no report")
} }
url, err := s.svc.Files.GenerateFileTempURL(ctx, scope, *audit.ReportFileID, expiresIn) url, err := s.svc.Files.GenerateFileURL(ctx, scope, *audit.ReportFileID, expiresIn)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot generate report download URL: %w", err) return nil, fmt.Errorf("cannot generate report download URL: %w", err)
} }

View File

@@ -18,7 +18,6 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"net/url"
"time" "time"
"github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3"
@@ -193,7 +192,7 @@ func (s FileService) UploadAndSaveFile(
return file, nil return file, nil
} }
func (s FileService) GenerateFileTempURL( func (s FileService) GenerateFileURL(
ctx context.Context, scope coredata.Scoper, ctx context.Context, scope coredata.Scoper,
fileID gid.GID, fileID gid.GID,
expiresIn time.Duration, expiresIn time.Duration,
@@ -203,27 +202,10 @@ func (s FileService) GenerateFileTempURL(
return "", fmt.Errorf("cannot get file: %w", err) return "", fmt.Errorf("cannot get file: %w", err)
} }
presignClient := s3.NewPresignClient(s.svc.s3) presignedURL, err := s.svc.fileManager.GenerateFileUrl(ctx, file, expiresIn)
// Use RFC 6266/5987 encoding for filename with UTF-8 support
encodedFilename := url.QueryEscape(file.FileName)
contentDisposition := fmt.Sprintf("attachment; filename=%q; filename*=UTF-8''%s",
encodedFilename, encodedFilename)
presignedReq, err := presignClient.PresignGetObject(
ctx,
&s3.GetObjectInput{
Bucket: &s.svc.bucket,
Key: &file.FileKey,
ResponseCacheControl: new("max-age=3600, public"),
ResponseContentType: &file.MimeType,
ResponseContentDisposition: &contentDisposition,
},
func(opts *s3.PresignOptions) { opts.Expires = expiresIn },
)
if err != nil { if err != nil {
return "", fmt.Errorf("cannot presign GetObject request: %w", err) return "", fmt.Errorf("cannot generate file URL: %w", err)
} }
return presignedReq.URL, nil return presignedURL, nil
} }

View File

@@ -18,12 +18,12 @@ import (
// DownloadURL is the resolver for the downloadUrl field. // DownloadURL is the resolver for the downloadUrl field.
func (r *fileResolver) DownloadURL(ctx context.Context, obj *types.File) (string, error) { func (r *fileResolver) DownloadURL(ctx context.Context, obj *types.File) (string, error) {
scope, err := r.authorize(ctx, obj.ID, probo.ActionFileDownloadUrl) scope, err := r.authorize(ctx, obj.ID, probo.ActionFileGet)
if err != nil { if err != nil {
return "", err return "", err
} }
downloadUrl, err := r.probo.Files.GenerateFileTempURL(ctx, scope, obj.ID, 60*time.Second) downloadUrl, err := r.probo.Files.GenerateFileURL(ctx, scope, obj.ID, 60*time.Second)
if err != nil { if err != nil {
r.logger.ErrorCtx(ctx, "cannot generate download URL", log.Error(err)) r.logger.ErrorCtx(ctx, "cannot generate download URL", log.Error(err))
return "", gqlutils.Internal(ctx) return "", gqlutils.Internal(ctx)