From 6f83d9be485e81a99c8c92f18463aaed7bdbf770 Mon Sep 17 00:00:00 2001 From: Ludovic Vielle Date: Mon, 8 Jun 2026 19:53:38 +0200 Subject: [PATCH] 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 --- pkg/probo/audit_service.go | 2 +- pkg/probo/file_service.go | 26 ++++----------------- pkg/server/api/console/v1/file_resolvers.go | 4 ++-- 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/pkg/probo/audit_service.go b/pkg/probo/audit_service.go index 5b80b2ea5..d6eb1ad99 100644 --- a/pkg/probo/audit_service.go +++ b/pkg/probo/audit_service.go @@ -409,7 +409,7 @@ func (s AuditService) GenerateReportURL( 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 { return nil, fmt.Errorf("cannot generate report download URL: %w", err) } diff --git a/pkg/probo/file_service.go b/pkg/probo/file_service.go index c0878703f..9660c86cb 100644 --- a/pkg/probo/file_service.go +++ b/pkg/probo/file_service.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "io" - "net/url" "time" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -193,7 +192,7 @@ func (s FileService) UploadAndSaveFile( return file, nil } -func (s FileService) GenerateFileTempURL( +func (s FileService) GenerateFileURL( ctx context.Context, scope coredata.Scoper, fileID gid.GID, expiresIn time.Duration, @@ -203,27 +202,10 @@ func (s FileService) GenerateFileTempURL( return "", fmt.Errorf("cannot get file: %w", err) } - presignClient := s3.NewPresignClient(s.svc.s3) - - // 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 }, - ) + presignedURL, err := s.svc.fileManager.GenerateFileUrl(ctx, file, expiresIn) 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 } diff --git a/pkg/server/api/console/v1/file_resolvers.go b/pkg/server/api/console/v1/file_resolvers.go index 4e330ca5b..14c61c747 100644 --- a/pkg/server/api/console/v1/file_resolvers.go +++ b/pkg/server/api/console/v1/file_resolvers.go @@ -18,12 +18,12 @@ import ( // DownloadURL is the resolver for the downloadUrl field. 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 { 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 { r.logger.ErrorCtx(ctx, "cannot generate download URL", log.Error(err)) return "", gqlutils.Internal(ctx)