From 0f74ed61fddbd5390b7c2470f1ac0def88d63764 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 13 Jan 2026 00:56:53 +0800 Subject: [PATCH] :bug: Fix file migration --- .../Storage/FileMigrationService.cs | 117 ++++++++++-------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/DysonNetwork.Drive/Storage/FileMigrationService.cs b/DysonNetwork.Drive/Storage/FileMigrationService.cs index 788940e2..8d42a737 100644 --- a/DysonNetwork.Drive/Storage/FileMigrationService.cs +++ b/DysonNetwork.Drive/Storage/FileMigrationService.cs @@ -20,65 +20,78 @@ public class FileMigrationService(AppDatabase db, ILogger foreach (var cf in cloudFiles) { - 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) + try { - 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, - MimeType = mimeType, - HasCompression = mimeType.StartsWith("image/"), - HasThumbnail = mimeType.StartsWith("video/") - }; + fileObject = new SnFileObject + { + Id = cf.Id, + 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); } - - var replicaExists = await db.FileReplicas.AnyAsync(r => - r.ObjectId == fileObject.Id && - r.PoolId == cf.PoolId!.Value); - - if (!replicaExists) + catch (Exception ex) { - 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); + logger.LogError(ex, + "Failed migrating file {FileId}. ObjectId={ObjectId}, PoolId={PoolId}, StorageId={StorageId}", + cf.Id, + cf.ObjectId, + cf.PoolId, + cf.StorageId); } - - 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."); }