From 2d1e43b02e9642ce77dc9da5eb4c1c89ea892c00 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 13 Jan 2026 00:50:37 +0800 Subject: [PATCH] :bug: Trying to fix file migration again --- .../Storage/FileMigrationService.cs | 76 +++++++++++-------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/DysonNetwork.Drive/Storage/FileMigrationService.cs b/DysonNetwork.Drive/Storage/FileMigrationService.cs index b4943c3b..788940e2 100644 --- a/DysonNetwork.Drive/Storage/FileMigrationService.cs +++ b/DysonNetwork.Drive/Storage/FileMigrationService.cs @@ -20,47 +20,59 @@ public class FileMigrationService(AppDatabase db, ILogger foreach (var cf in cloudFiles) { - if (await db.FileObjects.AnyAsync(fo => fo.Id == cf.Id)) - { - logger.LogWarning("FileObject for {Id} already exists, skipping.", cf.Id); - continue; - } - var ext = Path.GetExtension(cf.Name); var mimeType = ext != "" && MimeTypes.TryGetMimeType(ext, out var mime) ? mime : "application/octet-stream"; - var fileObject = new SnFileObject + 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/") + }; - var fileReplica = new SnFileReplica + db.FileObjects.Add(fileObject); + } + + var replicaExists = await db.FileReplicas.AnyAsync(r => + r.ObjectId == fileObject.Id && + r.PoolId == cf.PoolId!.Value); + + if (!replicaExists) { - Id = Guid.NewGuid(), - ObjectId = fileObject.Id, - PoolId = cf.PoolId!.Value, - StorageId = cf.StorageId ?? cf.Id, - Status = SnFileReplicaStatus.Available, - IsPrimary = true - }; + var fileReplica = new SnFileReplica + { + Id = Guid.NewGuid(), + ObjectId = fileObject.Id, + PoolId = cf.PoolId!.Value, + StorageId = cf.StorageId ?? cf.Id, + Status = SnFileReplicaStatus.Available, + IsPrimary = true + }; - var permission = new SnFilePermission + fileObject.FileReplicas.Add(fileReplica); + db.FileReplicas.Add(fileReplica); + } + + var permissionExists = await db.FilePermissions.AnyAsync(p => p.FileId == cf.Id); + + if (!permissionExists) { - Id = Guid.NewGuid(), - FileId = cf.Id, - SubjectType = SnFilePermissionType.Anyone, - SubjectId = string.Empty, - Permission = SnFilePermissionLevel.Read - }; + var permission = new SnFilePermission + { + Id = Guid.NewGuid(), + FileId = cf.Id, + SubjectType = SnFilePermissionType.Anyone, + SubjectId = string.Empty, + Permission = SnFilePermissionLevel.Read + }; - fileObject.FileReplicas.Add(fileReplica); - - db.FileObjects.Add(fileObject); - db.FileReplicas.Add(fileReplica); - db.FilePermissions.Add(permission); + db.FilePermissions.Add(permission); + } cf.ObjectId = fileObject.Id; cf.Object = fileObject;