♻️ Extract the Storage service to DysonNetwork.Drive microservice
This commit is contained in:
		
							
								
								
									
										292
									
								
								DysonNetwork.Drive/FileService.ReferenceMigration.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								DysonNetwork.Drive/FileService.ReferenceMigration.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,292 @@ | ||||
| using EFCore.BulkExtensions; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NodaTime; | ||||
| using DysonNetwork.Common.Models; | ||||
| using DysonNetwork.Sphere; | ||||
|  | ||||
| namespace DysonNetwork.Drive; | ||||
|  | ||||
| public class FileReferenceMigrationService(AppDatabase db) | ||||
| { | ||||
|     public async Task ScanAndMigrateReferences() | ||||
|     { | ||||
|         // Scan Posts for file references | ||||
|         await ScanPosts(); | ||||
|  | ||||
|         // Scan Messages for file references | ||||
|         await ScanMessages(); | ||||
|  | ||||
|         // Scan Profiles for file references | ||||
|         await ScanProfiles(); | ||||
|  | ||||
|         // Scan Chat entities for file references | ||||
|         await ScanChatRooms(); | ||||
|  | ||||
|         // Scan Realms for file references | ||||
|         await ScanRealms(); | ||||
|  | ||||
|         // Scan Publishers for file references | ||||
|         await ScanPublishers(); | ||||
|  | ||||
|         // Scan Stickers for file references | ||||
|         await ScanStickers(); | ||||
|     } | ||||
|  | ||||
|     private async Task ScanPosts() | ||||
|     { | ||||
|         var posts = await db.Posts | ||||
|             .Include(p => p.OutdatedAttachments) | ||||
|             .Where(p => p.OutdatedAttachments.Any()) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         foreach (var post in posts) | ||||
|         { | ||||
|             var updatedAttachments = new List<CloudFileReferenceObject>(); | ||||
|  | ||||
|             foreach (var attachment in post.OutdatedAttachments) | ||||
|             { | ||||
|                 var file = await db.Files.FirstOrDefaultAsync(f => f.Id == attachment.Id); | ||||
|                 if (file != null) | ||||
|                 { | ||||
|                     // Create a reference for the file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = file.Id, | ||||
|                         File = file, | ||||
|                         Usage = "post", | ||||
|                         ResourceId = post.ResourceIdentifier | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     updatedAttachments.Add(file.ToReferenceObject()); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     // Keep the existing reference object if file not found | ||||
|                     updatedAttachments.Add(attachment.ToReferenceObject()); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             post.Attachments = updatedAttachments; | ||||
|             db.Posts.Update(post); | ||||
|         } | ||||
|  | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task ScanMessages() | ||||
|     { | ||||
|         var messages = await db.ChatMessages | ||||
|             .Include(m => m.OutdatedAttachments) | ||||
|             .Where(m => m.OutdatedAttachments.Any()) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         var fileReferences = messages.SelectMany(message => message.OutdatedAttachments.Select(attachment => | ||||
|             new CloudFileReference | ||||
|             { | ||||
|                 FileId = attachment.Id, | ||||
|                 File = attachment, | ||||
|                 Usage = "chat", | ||||
|                 ResourceId = message.ResourceIdentifier, | ||||
|                 CreatedAt = SystemClock.Instance.GetCurrentInstant(), | ||||
|                 UpdatedAt = SystemClock.Instance.GetCurrentInstant() | ||||
|             }) | ||||
|         ).ToList(); | ||||
|  | ||||
|         foreach (var message in messages) | ||||
|         { | ||||
|             message.Attachments = message.OutdatedAttachments.Select(a => a.ToReferenceObject()).ToList(); | ||||
|             db.ChatMessages.Update(message); | ||||
|         } | ||||
|  | ||||
|         await db.BulkInsertAsync(fileReferences); | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
|  | ||||
|      | ||||
|  | ||||
|     private async Task ScanChatRooms() | ||||
|     { | ||||
|         var chatRooms = await db.ChatRooms | ||||
|             .Where(c => c.PictureId != null || c.BackgroundId != null) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         foreach (var chatRoom in chatRooms) | ||||
|         { | ||||
|             if (chatRoom is { PictureId: not null, Picture: null }) | ||||
|             { | ||||
|                 var avatarFile = await db.Files.FirstOrDefaultAsync(f => f.Id == chatRoom.PictureId); | ||||
|                 if (avatarFile != null) | ||||
|                 { | ||||
|                     // Create a reference for the avatar file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = avatarFile.Id, | ||||
|                         File = avatarFile, | ||||
|                         Usage = "chatroom.picture", | ||||
|                         ResourceId = chatRoom.ResourceIdentifier | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     chatRoom.Picture = avatarFile.ToReferenceObject(); | ||||
|                     db.ChatRooms.Update(chatRoom); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (chatRoom is not { BackgroundId: not null, Background: null }) continue; | ||||
|             var bannerFile = await db.Files.FirstOrDefaultAsync(f => f.Id == chatRoom.BackgroundId); | ||||
|             if (bannerFile == null) continue; | ||||
|             { | ||||
|                 // Create a reference for the banner file | ||||
|                 var reference = new CloudFileReference | ||||
|                 { | ||||
|                     FileId = bannerFile.Id, | ||||
|                     File = bannerFile, | ||||
|                     Usage = "chatroom.background", | ||||
|                     ResourceId = chatRoom.ResourceIdentifier | ||||
|                 }; | ||||
|  | ||||
|                 await db.FileReferences.AddAsync(reference); | ||||
|                 chatRoom.Background = bannerFile.ToReferenceObject(); | ||||
|                 db.ChatRooms.Update(chatRoom); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task ScanRealms() | ||||
|     { | ||||
|         var realms = await db.Realms | ||||
|             .Where(r => r.PictureId != null && r.BackgroundId != null) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         foreach (var realm in realms) | ||||
|         { | ||||
|             // Process avatar if it exists | ||||
|             if (realm is { PictureId: not null, Picture: null }) | ||||
|             { | ||||
|                 var avatarFile = await db.Files.FirstOrDefaultAsync(f => f.Id == realm.PictureId); | ||||
|                 if (avatarFile != null) | ||||
|                 { | ||||
|                     // Create a reference for the avatar file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = avatarFile.Id, | ||||
|                         File = avatarFile, | ||||
|                         Usage = "realm.picture", | ||||
|                         ResourceId = realm.ResourceIdentifier | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     realm.Picture = avatarFile.ToReferenceObject(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Process banner if it exists | ||||
|             if (realm is { BackgroundId: not null, Background: null }) | ||||
|             { | ||||
|                 var bannerFile = await db.Files.FirstOrDefaultAsync(f => f.Id == realm.BackgroundId); | ||||
|                 if (bannerFile != null) | ||||
|                 { | ||||
|                     // Create a reference for the banner file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = bannerFile.Id, | ||||
|                         File = bannerFile, | ||||
|                         Usage = "realm.background", | ||||
|                         ResourceId = realm.ResourceIdentifier | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     realm.Background = bannerFile.ToReferenceObject(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             db.Realms.Update(realm); | ||||
|         } | ||||
|  | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task ScanPublishers() | ||||
|     { | ||||
|         var publishers = await db.Publishers | ||||
|             .Where(p => p.PictureId != null || p.BackgroundId != null) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         foreach (var publisher in publishers) | ||||
|         { | ||||
|             if (publisher is { PictureId: not null, Picture: null }) | ||||
|             { | ||||
|                 var pictureFile = await db.Files.FirstOrDefaultAsync(f => f.Id == publisher.PictureId); | ||||
|                 if (pictureFile != null) | ||||
|                 { | ||||
|                     // Create a reference for the picture file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = pictureFile.Id, | ||||
|                         File = pictureFile, | ||||
|                         Usage = "publisher.picture", | ||||
|                         ResourceId = publisher.Id.ToString() | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     publisher.Picture = pictureFile.ToReferenceObject(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (publisher is { BackgroundId: not null, Background: null }) | ||||
|             { | ||||
|                 var backgroundFile = await db.Files.FirstOrDefaultAsync(f => f.Id == publisher.BackgroundId); | ||||
|                 if (backgroundFile != null) | ||||
|                 { | ||||
|                     // Create a reference for the background file | ||||
|                     var reference = new CloudFileReference | ||||
|                     { | ||||
|                         FileId = backgroundFile.Id, | ||||
|                         File = backgroundFile, | ||||
|                         Usage = "publisher.background", | ||||
|                         ResourceId = publisher.ResourceIdentifier | ||||
|                     }; | ||||
|  | ||||
|                     await db.FileReferences.AddAsync(reference); | ||||
|                     publisher.Background = backgroundFile.ToReferenceObject(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             db.Publishers.Update(publisher); | ||||
|         } | ||||
|  | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task ScanStickers() | ||||
|     { | ||||
|         var stickers = await db.Stickers | ||||
|             .Where(s => s.ImageId != null && s.Image == null) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         foreach (var sticker in stickers) | ||||
|         { | ||||
|             var imageFile = await db.Files.FirstOrDefaultAsync(f => f.Id == sticker.ImageId); | ||||
|             if (imageFile != null) | ||||
|             { | ||||
|                 // Create a reference for the sticker image file | ||||
|                 var reference = new CloudFileReference | ||||
|                 { | ||||
|                     FileId = imageFile.Id, | ||||
|                     File = imageFile, | ||||
|                     Usage = "sticker.image", | ||||
|                     ResourceId = sticker.ResourceIdentifier | ||||
|                 }; | ||||
|  | ||||
|                 await db.FileReferences.AddAsync(reference); | ||||
|                 sticker.Image = imageFile.ToReferenceObject(); | ||||
|                 db.Stickers.Update(sticker); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         await db.SaveChangesAsync(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user