From c4aeea55819445bb93a99744b8f5dc14af7635f5 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Fri, 17 Apr 2026 11:14:59 +0800 Subject: [PATCH] feat(storage): implement provider caching and error logging in asset builder --- docs | 2 +- internal/builders/asset_builder.go | 9 +++++++++ internal/services/storage/provider.go | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs b/docs index 8e87834..16c8145 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 8e87834156125d14ca7a8c3b234279b61ac09d16 +Subproject commit 16c8145f78bcf4daa0af1f412d777ace1eb8b8b6 diff --git a/internal/builders/asset_builder.go b/internal/builders/asset_builder.go index eb66328..bb8c0a0 100644 --- a/internal/builders/asset_builder.go +++ b/internal/builders/asset_builder.go @@ -3,6 +3,8 @@ package builders import ( "cs-agent/internal/models" "cs-agent/internal/pkg/dto/response" + "cs-agent/internal/services/storage" + "log/slog" ) func BuildAsset(item *models.Asset) response.AssetResponse { @@ -23,5 +25,12 @@ func BuildAsset(item *models.Asset) response.AssetResponse { UpdateUserID: item.UpdateUserID, UpdateUserName: item.UpdateUserName, } + + if provider, err := storage.GetProvider(item.Provider); err != nil { + slog.Error("get storage provider failed", "provider", item.Provider, "error", err) + } else { + ret.URL = provider.GetSignedURL(item.StorageKey) + } + return ret } diff --git a/internal/services/storage/provider.go b/internal/services/storage/provider.go index f6bb808..a0ff3e5 100644 --- a/internal/services/storage/provider.go +++ b/internal/services/storage/provider.go @@ -7,6 +7,8 @@ import ( "io" ) +var providers = make(map[enums.AssetProvider]FileStorageProvider) + type FileStorageProvider interface { ProviderType() enums.AssetProvider Upload(reader io.Reader, key string, info UploadInfo) (*StoredFile, error) @@ -20,6 +22,20 @@ func GetDefault() (FileStorageProvider, error) { return NewProvider(config.Current().Storage.Default) } +func GetProvider(providerType enums.AssetProvider) (FileStorageProvider, error) { + if provider, exists := providers[providerType]; exists { + return provider, nil + } + provider, err := NewProvider(providerType) + if err != nil { + return nil, err + } + + providers[providerType] = provider + + return provider, nil +} + func NewProvider(provider enums.AssetProvider) (FileStorageProvider, error) { cfg := config.Current().Storage