fix(*): 资源与技能 - 精简列表载荷并禁止对象存储静默降级
This commit is contained in:
1 parent
5528dbc3e4
commit
d1acc8f6f3
16 files changed
+271
-99
No files matched your search
@@ -15,7 +15,6 @@ import (
|
||||
_ "image/png"
|
||||
"infinite-canvas/backend/internal/kernel"
|
||||
"io"
|
||||
"log"
|
||||
"mime"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
@@ -432,10 +431,9 @@ func writeLocalResourceObject(filePath string, body io.Reader) error {
|
||||
return closeErr
|
||||
}
|
||||
|
||||
// A cloud write is successful only after the configured origin accepts it.
|
||||
// storeResourceObject writes to the configured origin and degrades to local storage
|
||||
// when the external origin is unavailable. The resource binding is rewritten before
|
||||
// the caller persists the ready state, so later reads follow the actual object location.
|
||||
// storeResourceObject writes to the configured origin. When object storage is
|
||||
// enabled, a failed origin write must fail the resource instead of silently
|
||||
// changing its storage location to local disk.
|
||||
func (s *Service) storeResourceObject(resource *model.Resource, fileName string, body io.Reader) (string, error) {
|
||||
if resource == nil {
|
||||
return "", errors.New("资源不存在")
|
||||
@@ -444,35 +442,14 @@ func (s *Service) storeResourceObject(resource *model.Resource, fileName string,
|
||||
return "", writeLocalResourceObject(filepath.Join(s.dataDir, "resources", filepath.FromSlash(resource.ObjectKey)), body)
|
||||
}
|
||||
setting, settingErr := s.ossSettingForResource(resource.UserID, resource)
|
||||
var etag string
|
||||
var putErr error
|
||||
if settingErr == nil {
|
||||
etag, putErr = putOSSObject(setting, resource.ObjectKey, resource.MimeType, resource.Size, body)
|
||||
if settingErr != nil {
|
||||
return "", settingErr
|
||||
}
|
||||
if putErr == nil && settingErr == nil {
|
||||
return etag, nil
|
||||
etag, err := putOSSObject(setting, resource.ObjectKey, resource.MimeType, resource.Size, body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
fallbackErr := putErr
|
||||
if fallbackErr == nil {
|
||||
fallbackErr = settingErr
|
||||
}
|
||||
if seeker, ok := body.(io.Seeker); ok {
|
||||
if _, seekErr := seeker.Seek(0, io.SeekStart); seekErr != nil {
|
||||
return "", errors.Join(fallbackErr, fmt.Errorf("降级本地存储时重置读取位置失败:%w", seekErr))
|
||||
}
|
||||
}
|
||||
localKey := localObjectKey(resource.UserID, resource.Kind, fileName, resource.MimeType, time.Now())
|
||||
resource.Provider = "local"
|
||||
resource.ObjectKey = localKey
|
||||
resource.Endpoint = ""
|
||||
resource.Bucket = ""
|
||||
resource.StorageSettingID = ""
|
||||
resource.ETag = ""
|
||||
if localErr := writeLocalResourceObject(filepath.Join(s.dataDir, "resources", filepath.FromSlash(localKey)), body); localErr != nil {
|
||||
return "", errors.Join(fallbackErr, fmt.Errorf("降级本地存储失败:%w", localErr))
|
||||
}
|
||||
log.Printf("object storage upload degraded to local storage: resource=%s error=%v", resource.ID, fallbackErr)
|
||||
return "", nil
|
||||
return etag, nil
|
||||
}
|
||||
|
||||
func (s *Service) retryStoredResource(userID string, resource *model.Resource, kind string, mimeType string, size int64, body io.Reader) (*model.Resource, error) {
|
||||
|
||||
Reference in new issue
Block a user