♻️ File organize system v2
This commit is contained in:
59
DysonNetwork.Drive/Storage/FileMigrationService.cs
Normal file
59
DysonNetwork.Drive/Storage/FileMigrationService.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using DysonNetwork.Shared.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace DysonNetwork.Drive.Storage;
|
||||
|
||||
public class FileMigrationService(AppDatabase db, ILogger<FileMigrationService> logger)
|
||||
{
|
||||
public async Task MigrateCloudFilesAsync()
|
||||
{
|
||||
logger.LogInformation("Starting cloud file migration.");
|
||||
|
||||
var cloudFiles = await db.Files
|
||||
.Where(f =>
|
||||
f.ObjectId == null &&
|
||||
f.StorageId != null &&
|
||||
f.PoolId != null &&
|
||||
!db.FileObjects.Any(fo => fo.Id == f.Id)
|
||||
)
|
||||
.ToListAsync();
|
||||
|
||||
logger.LogDebug("Found {Count} cloud files to migrate.", cloudFiles.Count);
|
||||
|
||||
foreach (var cf in cloudFiles)
|
||||
{
|
||||
var fileObject = new SnFileObject
|
||||
{
|
||||
Id = cf.Id,
|
||||
Size = cf.Size,
|
||||
Meta = cf.FileMeta,
|
||||
MimeType = cf.MimeType,
|
||||
Hash = cf.Hash,
|
||||
HasCompression = cf.HasCompression,
|
||||
HasThumbnail = cf.HasThumbnail
|
||||
};
|
||||
|
||||
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.FileObjects.Add(fileObject);
|
||||
db.FileReplicas.Add(fileReplica);
|
||||
|
||||
cf.ObjectId = fileObject.Id;
|
||||
cf.Object = fileObject;
|
||||
}
|
||||
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
logger.LogInformation("Cloud file migration completed.");
|
||||
}
|
||||
}
|
||||
@@ -762,27 +762,6 @@ public class FileService(
|
||||
await db.SaveChangesAsync();
|
||||
return count;
|
||||
}
|
||||
|
||||
public async Task<string> CreateFastUploadLinkAsync(SnCloudFile file)
|
||||
{
|
||||
if (file.PoolId is null) throw new InvalidOperationException("Pool ID is null");
|
||||
|
||||
var dest = await GetRemoteStorageConfig(file.PoolId.Value);
|
||||
if (dest is null) throw new InvalidOperationException($"No remote storage configured for pool {file.PoolId}");
|
||||
var client = CreateMinioClient(dest);
|
||||
if (client is null)
|
||||
throw new InvalidOperationException(
|
||||
$"Failed to configure client for remote destination '{file.PoolId}'"
|
||||
);
|
||||
|
||||
var url = await client.PresignedPutObjectAsync(
|
||||
new PresignedPutObjectArgs()
|
||||
.WithBucket(dest.Bucket)
|
||||
.WithObject(file.Id)
|
||||
.WithExpiry(60 * 60 * 24)
|
||||
);
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
file class UpdatableCloudFile(SnCloudFile file)
|
||||
|
||||
Reference in New Issue
Block a user