From bc6621154b02cd9039b647c16870fad6f054b83b Mon Sep 17 00:00:00 2001 From: nquidox Date: Fri, 17 Oct 2025 23:47:48 +0300 Subject: [PATCH] return etag --- internal/api/merch/controller.go | 2 +- internal/api/merch/dto.go | 1 + internal/api/merch/handler.go | 8 ++++---- internal/api/merch/service.go | 26 +++++++++++++++++++------- internal/interfaces/mediaStorage.go | 1 + internal/mediaStorage/service.go | 8 ++++++++ 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/internal/api/merch/controller.go b/internal/api/merch/controller.go index f0d8e8b..d4e05f8 100644 --- a/internal/api/merch/controller.go +++ b/internal/api/merch/controller.go @@ -362,7 +362,7 @@ func (co *controller) getMerchImage(c *gin.Context) { log.WithError(err).Error("Merch | Failed to get merch image") return } - c.JSON(http.StatusOK, ImageLink{Link: link.String()}) + c.JSON(http.StatusOK, link) } // @Summary Удалить (безвозвратно) картинки по merch_uuid и query параметрам diff --git a/internal/api/merch/dto.go b/internal/api/merch/dto.go index 3f94688..bc1646e 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -56,4 +56,5 @@ type UpdateMerchDTO struct { type ImageLink struct { Link string `json:"link"` + ETag string `json:"etag"` } diff --git a/internal/api/merch/handler.go b/internal/api/merch/handler.go index a83f913..b9b8227 100644 --- a/internal/api/merch/handler.go +++ b/internal/api/merch/handler.go @@ -32,10 +32,10 @@ func NewHandler(deps Deps) *Handler { "addr": media, }).Debug("Merch handler constructor | Media provider") - //exists, err := media.CheckBucketExists(packageBucketName) - //if err != nil || !exists { - // log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists") - //} + exists, err := media.CheckBucketExists(packageBucketName) + if err != nil || !exists { + log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists") + } return &Handler{ repo: r, diff --git a/internal/api/merch/service.go b/internal/api/merch/service.go index de751ec..eb0c85d 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -14,7 +14,6 @@ import ( "io" "merch-parser-api/internal/interfaces" "mime/multipart" - "net/url" "path/filepath" "strings" "time" @@ -304,14 +303,14 @@ func (s *service) uploadMerchImage(ctx context.Context, userUuid, merchUuid, ima return nil } -func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (*url.URL, error) { +func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (ImageLink, error) { exists, err := s.repo.merchRecordExists(userUuid, merchUuid) if err != nil { - return nil, err + return ImageLink{}, err } if !exists { - return nil, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid) + return ImageLink{}, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid) } var object string @@ -321,10 +320,23 @@ func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageT case "full": object = fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid) default: - return nil, fmt.Errorf("unknown image type %s", imageType) + return ImageLink{}, fmt.Errorf("unknown image type %s", imageType) } - return s.media.Get(ctx, s.bucketName, object, s.expires, nil) + link, err := s.media.Get(ctx, s.bucketName, object, s.expires, nil) + if err != nil { + return ImageLink{}, err + } + + etag, err := s.media.GetObjectEtag(ctx, s.bucketName, object) + if err != nil { + return ImageLink{}, err + } + + return ImageLink{ + Link: link.String(), + ETag: etag, + }, nil } func (s *service) deleteMerchImage(ctx context.Context, userUuid, merchUuid string) error { @@ -367,7 +379,7 @@ func (s *service) _uploadToStorage(params uploadImageParams) error { if err != nil { log.WithFields(log.Fields{ "error": err, - "img type": "full", + "img type": params.imageType, }).Error("Merch | Failed to upload file to media storage") return err } diff --git a/internal/interfaces/mediaStorage.go b/internal/interfaces/mediaStorage.go index ef8e178..bf46f47 100644 --- a/internal/interfaces/mediaStorage.go +++ b/internal/interfaces/mediaStorage.go @@ -12,4 +12,5 @@ type MediaStorage interface { Upload(ctx context.Context, bucket, object string, reader io.Reader, size int64) error Get(ctx context.Context, bucket, object string, expires time.Duration, params url.Values) (*url.URL, error) Delete(ctx context.Context, bucket, object string) error + GetObjectEtag(ctx context.Context, bucketName, object string) (string, error) } diff --git a/internal/mediaStorage/service.go b/internal/mediaStorage/service.go index 39fedce..3a5b7aa 100644 --- a/internal/mediaStorage/service.go +++ b/internal/mediaStorage/service.go @@ -42,3 +42,11 @@ func (s *Service) Get(ctx context.Context, bucket, object string, expires time.D func (s *Service) Delete(ctx context.Context, bucket, object string) error { return s.client.RemoveObject(ctx, bucket, object, minio.RemoveObjectOptions{}) } + +func (s *Service) GetObjectEtag(ctx context.Context, bucketName, object string) (string, error) { + info, err := s.client.StatObject(ctx, bucketName, object, minio.StatObjectOptions{}) + if err != nil { + return "", err + } + return info.ETag, nil +}