From b8b0b6b0fa961bc1d1392ab4421ee85931cd0dc0 Mon Sep 17 00:00:00 2001 From: Noste <83548733+Noooste@users.noreply.github.com> Date: Sat, 7 Mar 2026 10:56:48 +0100 Subject: [PATCH] feat: enhance S3 service to use bucket-specific MinIO client for object retrieval and deletion Signed-off-by: Noste <83548733+Noooste@users.noreply.github.com> --- backend/internal/handlers/objects.go | 11 +++++++---- backend/internal/services/s3.go | 20 ++++++++++++++++---- helm/garage-ui/Chart.yaml | 4 ++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/backend/internal/handlers/objects.go b/backend/internal/handlers/objects.go index ccf8e8b..9aa3562 100644 --- a/backend/internal/handlers/objects.go +++ b/backend/internal/handlers/objects.go @@ -1,6 +1,7 @@ package handlers import ( + "bufio" "io" "strconv" "time" @@ -176,11 +177,10 @@ func (h *ObjectHandler) GetObject(c fiber.Ctx) error { models.ErrorResponse(models.ErrCodeObjectNotFound, "Object not found: "+err.Error()), ) } - defer body.Close() // Set response headers c.Set("Content-Type", objectInfo.ContentType) - c.Set("Content-Length", string(rune(objectInfo.Size))) + c.Set("Content-Length", strconv.FormatInt(objectInfo.Size, 10)) c.Set("ETag", objectInfo.ETag) c.Set("Last-Modified", objectInfo.LastModified.Format(time.RFC1123)) @@ -189,8 +189,11 @@ func (h *ObjectHandler) GetObject(c fiber.Ctx) error { c.Set("Content-Disposition", "attachment; filename=\""+key+"\"") } - // Stream the object body to the client - return c.SendStream(body) + // Stream the object body to the client without buffering the entire file + return c.SendStreamWriter(func(w *bufio.Writer) { + defer body.Close() + io.Copy(w, body) + }) } // DeleteObject deletes an object from a bucket diff --git a/backend/internal/services/s3.go b/backend/internal/services/s3.go index 269243a..925bac9 100644 --- a/backend/internal/services/s3.go +++ b/backend/internal/services/s3.go @@ -317,13 +317,19 @@ func (s *S3Service) UploadObject(ctx context.Context, bucketName, key string, bo // GetObject retrieves an object from a bucket func (s *S3Service) GetObject(ctx context.Context, bucketName, key string) (io.ReadCloser, *models.ObjectInfo, error) { + // Get bucket-specific MinIO client + client, err := s.getMinioClient(ctx, bucketName) + if err != nil { + return nil, nil, fmt.Errorf("failed to get MinIO client for bucket %s: %w", bucketName, err) + } + var object *minio.Object // Call MinIO GetObject API with retry logic retryConfig := utils.DefaultRetryConfig() - err := utils.RetryWithBackoff(ctx, retryConfig, func() error { + err = utils.RetryWithBackoff(ctx, retryConfig, func() error { var getErr error - object, getErr = s.client.GetObject(ctx, bucketName, key, minio.GetObjectOptions{}) + object, getErr = client.GetObject(ctx, bucketName, key, minio.GetObjectOptions{}) return getErr }) if err != nil { @@ -351,10 +357,16 @@ func (s *S3Service) GetObject(ctx context.Context, bucketName, key string) (io.R // DeleteObject deletes an object from a bucket func (s *S3Service) DeleteObject(ctx context.Context, bucketName, key string) error { + // Get bucket-specific MinIO client + client, err := s.getMinioClient(ctx, bucketName) + if err != nil { + return fmt.Errorf("failed to get MinIO client for bucket %s: %w", bucketName, err) + } + // Call MinIO RemoveObject API with retry logic retryConfig := utils.DefaultRetryConfig() - err := utils.RetryWithBackoff(ctx, retryConfig, func() error { - return s.client.RemoveObject(ctx, bucketName, key, minio.RemoveObjectOptions{}) + err = utils.RetryWithBackoff(ctx, retryConfig, func() error { + return client.RemoveObject(ctx, bucketName, key, minio.RemoveObjectOptions{}) }) if err != nil { return fmt.Errorf("failed to delete object %s from bucket %s: %w", key, bucketName, err) diff --git a/helm/garage-ui/Chart.yaml b/helm/garage-ui/Chart.yaml index f41684e..610ecc6 100644 --- a/helm/garage-ui/Chart.yaml +++ b/helm/garage-ui/Chart.yaml @@ -3,8 +3,8 @@ name: garage-ui description: A Helm chart for Garage UI - Web interface for Garage S3 object storage icon: https://helm.noste.dev/garage.png type: application -version: 0.1.13 -appVersion: "v0.1.2" +version: 0.1.15 +appVersion: "v0.1.15" keywords: - garage - s3