using File.Domain.Entities;
using File.Infrastructure.Persistence;
using File.Infrastructure.Storage;
namespace File.Application.Common;
///
/// 文件大小回填助手:对 Size==0 的 FileMeta,从 S3 HeadObject 取真实 ContentLength 写回。
/// 用于读路径(列表加载)惰性修复早期未记录大小的旧数据——首次加载即回填并持久化,
/// 后续加载直接命中 DB 不再访问 S3。对象缺失或空文件保留 Size=0;单个失败不中断整体。
///
public static class FileSizeBackfillHelper
{
public static async Task BackfillAsync(
FileDbContext db,
IS3StorageService s3,
IReadOnlyList files,
CancellationToken ct)
{
var stale = files.Where(f => f.Size == 0).ToList();
if (stale.Count == 0)
{
return;
}
var updated = 0;
foreach (var file in stale)
{
try
{
var size = await s3.GetObjectSizeAsync(file.S3Bucket, file.S3Key, ct);
if (size is null || size <= 0)
{
// 对象缺失(已被外部清理)或空文件:保留 Size=0
continue;
}
file.Size = size.Value;
updated++;
}
catch
{
// 单个对象查询失败不中断整体回填,保留 Size=0 下次可重试
}
}
if (updated > 0)
{
await db.SaveChangesAsync(ct);
}
}
}