refactor(media): 资源分发 - 统一资源访问策略与云存储重定向

This commit is contained in:
ddCat committed 2026-09-22 21:41:00 +08:00
1 parent af6633047c
commit 487c34bfeb
50 files changed
+2112 -1266

No files matched your search

+12 -18
View File
@@ -139,47 +139,41 @@ func (s *Service) OpenSharedCanvasResource(token string, resourceID string) (*mo
}
func (s *Service) OpenSharedCanvasResourceRange(token string, resourceID string, rangeHeader string) (*assets.ResourceStream, error) {
userID, resource, err := s.sharedCanvasResource(token, resourceID)
userID, resource, _, err := s.sharedCanvasResource(token, resourceID)
if err != nil {
return nil, err
}
return s.host.OpenResourceRange(userID, resource, rangeHeader)
}
func (s *Service) PrepareSharedCanvasResourceDelivery(token string, resourceID string, rangeHeader string) (*assets.ResourceDelivery, error) {
userID, resource, err := s.sharedCanvasResource(token, resourceID)
func (s *Service) PrepareSharedCanvasResourceDelivery(token string, resourceID string, options assets.AccessOptions, rangeHeader string) (*assets.ResourceDelivery, error) {
userID, resource, share, err := s.sharedCanvasResource(token, resourceID)
if err != nil {
return nil, err
}
delivery, err := s.host.PrepareResourceDelivery(userID, resource, assets.ResourceDeliveryOptions{})
if err != nil || delivery.RedirectURL != "" {
return delivery, err
if share.ExpiresAt != nil {
options.ExpiresAt = *share.ExpiresAt
}
stream, err := s.host.OpenResourceRange(userID, resource, rangeHeader)
if err != nil {
return nil, err
}
delivery.Stream = stream
return delivery, nil
return s.host.PrepareResourceDelivery(userID, resource, options, rangeHeader)
}
func (s *Service) sharedCanvasResource(token string, resourceID string) (string, *model.Resource, error) {
func (s *Service) sharedCanvasResource(token string, resourceID string) (string, *model.Resource, *model.CanvasShare, error) {
share, project, err := s.sharedCanvasProject(token)
if err != nil {
return "", nil, err
return "", nil, nil, err
}
_, allowedResources, err := publicCanvasProject(project, token)
if err != nil {
return "", nil, err
return "", nil, nil, err
}
if !allowedResources[resourceID] {
return "", nil, gorm.ErrRecordNotFound
return "", nil, nil, gorm.ErrRecordNotFound
}
resource, err := s.repo.ResourceForUser(share.UserID, resourceID)
if err != nil {
return "", nil, err
return "", nil, nil, err
}
return share.UserID, resource, nil
return share.UserID, resource, share, nil
}
func (s *Service) sharedCanvasProject(token string) (*model.CanvasShare, *model.CanvasProject, error) {
+2 -2
View File
@@ -11,7 +11,7 @@ type Host interface {
EncryptSecret(value string) (string, error)
DecryptSecret(value string) (string, error)
OpenResourceRange(userID string, resource *model.Resource, rangeHeader string) (*assets.ResourceStream, error)
PrepareResourceDelivery(userID string, resource *model.Resource, options assets.ResourceDeliveryOptions) (*assets.ResourceDelivery, error)
PrepareResourceDelivery(userID string, resource *model.Resource, options assets.AccessOptions, rangeHeader string) (*assets.ResourceDelivery, error)
WithStorageLock(fn func() error) error
StructuredQuota(userID, kind string, creating bool, deltaBytes int64) error
StructuredReplacementQuota(userID, kind string, count int, bytes int64) error
@@ -27,7 +27,7 @@ func (nopHost) DecryptSecret(value string) (string, error) { return value, nil }
func (nopHost) OpenResourceRange(string, *model.Resource, string) (*assets.ResourceStream, error) {
return nil, nil
}
func (nopHost) PrepareResourceDelivery(string, *model.Resource, assets.ResourceDeliveryOptions) (*assets.ResourceDelivery, error) {
func (nopHost) PrepareResourceDelivery(string, *model.Resource, assets.AccessOptions, string) (*assets.ResourceDelivery, error) {
return nil, nil
}
func (nopHost) WithStorageLock(fn func() error) error {