fix: scope media dedupe by tenant

This commit is contained in:
2026-01-09 18:54:53 +08:00
parent c59353a740
commit 762c9f5204

View File

@@ -51,25 +51,6 @@ func (s *common) Options(ctx context.Context) (*common_dto.OptionsResponse, erro
} }
func (s *common) CheckHash(ctx context.Context, tenantID, userID int64, hash string) (*common_dto.UploadResult, error) { func (s *common) CheckHash(ctx context.Context, tenantID, userID int64, hash string) (*common_dto.UploadResult, error) {
existing, err := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash)).First()
if err != nil {
return nil, nil // Not found, proceed to upload
}
// Found existing file (Global deduplication hit)
// Check if user already has it (Logic deduplication hit)
myQuery := models.MediaAssetQuery.WithContext(ctx).
Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID))
if tenantID > 0 {
myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tenantID))
}
myExisting, err := myQuery.First()
if err == nil {
return s.composeUploadResult(myExisting), nil
}
// Create new record for this user reusing existing ObjectKey
// 优先使用路径租户,避免跨租户写入。 // 优先使用路径租户,避免跨租户写入。
tenant, err := s.resolveTenant(ctx, tenantID, userID) tenant, err := s.resolveTenant(ctx, tenantID, userID)
if err != nil { if err != nil {
@@ -80,6 +61,29 @@ func (s *common) CheckHash(ctx context.Context, tenantID, userID int64, hash str
tid = tenant.ID tid = tenant.ID
} }
query := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash))
if tid > 0 {
query = query.Where(models.MediaAssetQuery.TenantID.Eq(tid))
}
existing, err := query.First()
if err != nil {
return nil, nil // Not found, proceed to upload
}
// Found existing file (deduplication hit)
// Check if user already has it (Logic deduplication hit)
myQuery := models.MediaAssetQuery.WithContext(ctx).
Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID))
if tid > 0 {
myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tid))
}
myExisting, err := myQuery.First()
if err == nil {
return s.composeUploadResult(myExisting), nil
}
// Create new record for this user reusing existing ObjectKey
asset := &models.MediaAsset{ asset := &models.MediaAsset{
TenantID: tid, TenantID: tid,
UserID: userID, UserID: userID,
@@ -272,15 +276,19 @@ func (s *common) CompleteUpload(ctx context.Context, tenantID, userID int64, for
} }
objectKey := s.buildObjectKey(tenant, hash, meta.Filename) objectKey := s.buildObjectKey(tenant, hash, meta.Filename)
existing, err := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash)).First() existingQuery := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash))
if tid > 0 {
existingQuery = existingQuery.Where(models.MediaAssetQuery.TenantID.Eq(tid))
}
existing, err := existingQuery.First()
var asset *models.MediaAsset var asset *models.MediaAsset
if err == nil { if err == nil {
os.Remove(mergedPath) // Delete duplicate os.Remove(mergedPath) // Delete duplicate
myQuery := models.MediaAssetQuery.WithContext(ctx). myQuery := models.MediaAssetQuery.WithContext(ctx).
Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID)) Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID))
if tenantID > 0 { if tid > 0 {
myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tenantID)) myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tid))
} }
myExisting, err := myQuery.First() myExisting, err := myQuery.First()
if err == nil { if err == nil {
@@ -422,7 +430,11 @@ func (s *common) Upload(
var asset *models.MediaAsset var asset *models.MediaAsset
// Deduplication Check // Deduplication Check
existing, err := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash)).First() existingQuery := models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.Hash.Eq(hash))
if tid > 0 {
existingQuery = existingQuery.Where(models.MediaAssetQuery.TenantID.Eq(tid))
}
existing, err := existingQuery.First()
if err == nil { if err == nil {
// Found existing file (Storage Deduplication) // Found existing file (Storage Deduplication)
os.Remove(tmpPath) // Delete the duplicate we just wrote os.Remove(tmpPath) // Delete the duplicate we just wrote
@@ -431,8 +443,8 @@ func (s *common) Upload(
// Check if user already has it (Logic Deduplication) // Check if user already has it (Logic Deduplication)
myQuery := models.MediaAssetQuery.WithContext(ctx). myQuery := models.MediaAssetQuery.WithContext(ctx).
Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID)) Where(models.MediaAssetQuery.Hash.Eq(hash), models.MediaAssetQuery.UserID.Eq(userID))
if tenantID > 0 { if tid > 0 {
myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tenantID)) myQuery = myQuery.Where(models.MediaAssetQuery.TenantID.Eq(tid))
} }
myExisting, err := myQuery.First() myExisting, err := myQuery.First()
if err == nil { if err == nil {