Recycled files action

This commit is contained in:
2025-07-27 12:30:13 +08:00
parent e7e6c258e2
commit 4c0e0b5ee9
5 changed files with 192 additions and 11 deletions

View File

@@ -370,7 +370,7 @@ public class FileService(
if (File.Exists(thumbnailPath))
{
uploads.Add((thumbnailPath, ".thumbnail.webp", "image/webp", true));
uploads.Add((thumbnailPath, ".thumbnail", "image/webp", true));
hasThumbnail = true;
}
else
@@ -544,11 +544,11 @@ public class FileService(
db.Remove(file);
await db.SaveChangesAsync();
await _PurgeCacheAsync(file.Id);
await DeleteFileDataAsync(file);
}
public async Task DeleteFileDataAsync(CloudFile file)
private async Task DeleteFileDataAsync(CloudFile file)
{
if (file.StorageId is null) return;
if (!file.PoolId.HasValue) return;
@@ -581,7 +581,6 @@ public class FileService(
if (file.HasCompression)
{
// Also remove the compressed version if it exists
try
{
await client.RemoveObjectAsync(
@@ -594,6 +593,20 @@ public class FileService(
logger.LogWarning("Failed to delete compressed version of file {fileId}", file.Id);
}
}
if (file.HasThumbnail)
{
try
{
await client.RemoveObjectAsync(
new RemoveObjectArgs().WithBucket(bucket).WithObject(objectId + ".thumbnail")
);
}
catch
{
// Ignore errors when deleting thumbnail
logger.LogWarning("Failed to delete thumbnail of file {fileId}", file.Id);
}
}
}
public async Task<FilePool?> GetPoolAsync(Guid destination)
@@ -735,6 +748,51 @@ public class FileService(
if (fieldName.EndsWith("-data")) return true;
return gpsFields.Any(gpsField => fieldName.StartsWith(gpsField, StringComparison.OrdinalIgnoreCase));
}
public async Task<int> DeleteAccountRecycledFilesAsync(Guid accountId)
{
var files = await db.Files
.Where(f => f.AccountId == accountId && f.IsMarkedRecycle)
.ToListAsync();
var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync);
await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds);
db.RemoveRange(files);
await db.SaveChangesAsync();
return count;
}
public async Task<int> DeletePoolRecycledFilesAsync(Guid poolId)
{
var files = await db.Files
.Where(f => f.PoolId == poolId && f.IsMarkedRecycle)
.ToListAsync();
var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync);
await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds);
db.RemoveRange(files);
await db.SaveChangesAsync();
return count;
}
public async Task<int> DeleteAllRecycledFilesAsync()
{
var files = await db.Files
.Where(f => f.IsMarkedRecycle)
.ToListAsync();
var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync);
await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds);
db.RemoveRange(files);
await db.SaveChangesAsync();
return count;
}
}
/// <summary>