🐛 Fix file migration

This commit is contained in:
2026-01-13 00:56:53 +08:00
parent 2d1e43b02e
commit 0f74ed61fd

View File

@@ -20,66 +20,79 @@ public class FileMigrationService(AppDatabase db, ILogger<FileMigrationService>
foreach (var cf in cloudFiles) foreach (var cf in cloudFiles)
{ {
var ext = Path.GetExtension(cf.Name); try
var mimeType = ext != "" && MimeTypes.TryGetMimeType(ext, out var mime) ? mime : "application/octet-stream";
var fileObject = await db.FileObjects.FindAsync(cf.Id);
if (fileObject == null)
{ {
fileObject = new SnFileObject var ext = Path.GetExtension(cf.Name);
var mimeType = ext != "" && MimeTypes.TryGetMimeType(ext, out var mime) ? mime : "application/octet-stream";
var fileObject = await db.FileObjects.FindAsync(cf.Id);
if (fileObject == null)
{ {
Id = cf.Id, fileObject = new SnFileObject
MimeType = mimeType, {
HasCompression = mimeType.StartsWith("image/"), Id = cf.Id,
HasThumbnail = mimeType.StartsWith("video/") MimeType = mimeType,
}; HasCompression = mimeType.StartsWith("image/"),
HasThumbnail = mimeType.StartsWith("video/")
};
db.FileObjects.Add(fileObject); db.FileObjects.Add(fileObject);
}
var replicaExists = await db.FileReplicas.AnyAsync(r =>
r.ObjectId == fileObject.Id &&
r.PoolId == cf.PoolId!.Value);
if (!replicaExists)
{
var fileReplica = new SnFileReplica
{
Id = Guid.NewGuid(),
ObjectId = fileObject.Id,
PoolId = cf.PoolId!.Value,
StorageId = cf.StorageId ?? cf.Id,
Status = SnFileReplicaStatus.Available,
IsPrimary = true
};
fileObject.FileReplicas.Add(fileReplica);
db.FileReplicas.Add(fileReplica);
}
var permissionExists = await db.FilePermissions.AnyAsync(p => p.FileId == cf.Id);
if (!permissionExists)
{
var permission = new SnFilePermission
{
Id = Guid.NewGuid(),
FileId = cf.Id,
SubjectType = SnFilePermissionType.Anyone,
SubjectId = string.Empty,
Permission = SnFilePermissionLevel.Read
};
db.FilePermissions.Add(permission);
}
cf.ObjectId = fileObject.Id;
cf.Object = fileObject;
await db.SaveChangesAsync();
logger.LogInformation("Migrated file {FileId} successfully.", cf.Id);
} }
catch (Exception ex)
var replicaExists = await db.FileReplicas.AnyAsync(r =>
r.ObjectId == fileObject.Id &&
r.PoolId == cf.PoolId!.Value);
if (!replicaExists)
{ {
var fileReplica = new SnFileReplica logger.LogError(ex,
{ "Failed migrating file {FileId}. ObjectId={ObjectId}, PoolId={PoolId}, StorageId={StorageId}",
Id = Guid.NewGuid(), cf.Id,
ObjectId = fileObject.Id, cf.ObjectId,
PoolId = cf.PoolId!.Value, cf.PoolId,
StorageId = cf.StorageId ?? cf.Id, cf.StorageId);
Status = SnFileReplicaStatus.Available,
IsPrimary = true
};
fileObject.FileReplicas.Add(fileReplica);
db.FileReplicas.Add(fileReplica);
} }
var permissionExists = await db.FilePermissions.AnyAsync(p => p.FileId == cf.Id);
if (!permissionExists)
{
var permission = new SnFilePermission
{
Id = Guid.NewGuid(),
FileId = cf.Id,
SubjectType = SnFilePermissionType.Anyone,
SubjectId = string.Empty,
Permission = SnFilePermissionLevel.Read
};
db.FilePermissions.Add(permission);
}
cf.ObjectId = fileObject.Id;
cf.Object = fileObject;
} }
await db.SaveChangesAsync();
logger.LogInformation("Cloud file migration completed."); logger.LogInformation("Cloud file migration completed.");
} }