diff --git a/DysonNetwork.Drive/Index/FileIndexController.cs b/DysonNetwork.Drive/Index/FileIndexController.cs
index 4f6fe22a..6a6040a9 100644
--- a/DysonNetwork.Drive/Index/FileIndexController.cs
+++ b/DysonNetwork.Drive/Index/FileIndexController.cs
@@ -24,9 +24,16 @@ public class FileIndexController(
///
/// The path to browse (defaults to root "/")
/// Optional query to filter files by name
+ /// The field to order by (date, size, name - defaults to date)
+ /// Whether to order in descending order (defaults to true)
/// List of files in the specified path
[HttpGet("browse")]
- public async Task BrowseFiles([FromQuery] string path = "/", [FromQuery] string? query = null)
+ public async Task BrowseFiles(
+ [FromQuery] string path = "/",
+ [FromQuery] string? query = null,
+ [FromQuery] string order = "date",
+ [FromQuery] bool orderDesc = true
+ )
{
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
return new ObjectResult(ApiError.Unauthorized()) { StatusCode = 401 };
@@ -44,6 +51,17 @@ public class FileIndexController(
.ToList();
}
+ // Apply sorting
+ fileIndexes = order.ToLower() switch
+ {
+ "name" => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.Name).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.Name).ToList(),
+ "size" => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.Size).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.Size).ToList(),
+ _ => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.CreatedAt).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.CreatedAt).ToList()
+ };
+
// Get all file indexes for this account to extract child folders
var allFileIndexes = await fileIndexService.GetByAccountIdAsync(accountId);
@@ -109,9 +127,15 @@ public class FileIndexController(
/// Gets all files for the current user (across all paths)
///
/// Optional query to filter files by name
+ /// The field to order by (date, size, name - defaults to date)
+ /// Whether to order in descending order (defaults to true)
/// List of all files for the user
[HttpGet("all")]
- public async Task GetAllFiles([FromQuery] string? query = null)
+ public async Task GetAllFiles(
+ [FromQuery] string? query = null,
+ [FromQuery] string order = "date",
+ [FromQuery] bool orderDesc = true
+ )
{
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
return new ObjectResult(ApiError.Unauthorized()) { StatusCode = 401 };
@@ -129,6 +153,17 @@ public class FileIndexController(
.ToList();
}
+ // Apply sorting
+ fileIndexes = order.ToLower() switch
+ {
+ "name" => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.Name).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.Name).ToList(),
+ "size" => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.Size).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.Size).ToList(),
+ _ => orderDesc ? fileIndexes.OrderByDescending(fi => fi.File.CreatedAt).ToList()
+ : fileIndexes.OrderBy(fi => fi.File.CreatedAt).ToList()
+ };
+
return Ok(new
{
Files = fileIndexes,
@@ -154,6 +189,9 @@ public class FileIndexController(
/// The number of files to skip
/// The number of files to return
/// The pool ID of those files
+ /// Optional query to filter files by name
+ /// The field to order by (date, size, name - defaults to date)
+ /// Whether to order in descending order (defaults to true)
/// List of unindexed files
[HttpGet("unindexed")]
public async Task GetUnindexedFiles(
@@ -161,7 +199,9 @@ public class FileIndexController(
[FromQuery] bool recycled = false,
[FromQuery] int offset = 0,
[FromQuery] int take = 20,
- [FromQuery] string? query = null
+ [FromQuery] string? query = null,
+ [FromQuery] string order = "date",
+ [FromQuery] bool orderDesc = true
)
{
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
@@ -176,9 +216,19 @@ public class FileIndexController(
&& f.IsMarkedRecycle == recycled
&& !db.FileIndexes.Any(fi => fi.FileId == f.Id && fi.AccountId == accountId)
)
- .OrderByDescending(f => f.CreatedAt)
.AsQueryable();
+ // Apply sorting
+ filesQuery = order.ToLower() switch
+ {
+ "name" => orderDesc ? filesQuery.OrderByDescending(f => f.Name)
+ : filesQuery.OrderBy(f => f.Name),
+ "size" => orderDesc ? filesQuery.OrderByDescending(f => f.Size)
+ : filesQuery.OrderBy(f => f.Size),
+ _ => orderDesc ? filesQuery.OrderByDescending(f => f.CreatedAt)
+ : filesQuery.OrderBy(f => f.CreatedAt)
+ };
+
if (pool.HasValue) filesQuery = filesQuery.Where(f => f.PoolId == pool);
if (!string.IsNullOrWhiteSpace(query))
diff --git a/DysonNetwork.Drive/Storage/FileController.cs b/DysonNetwork.Drive/Storage/FileController.cs
index dfd5fa5d..293d3e7e 100644
--- a/DysonNetwork.Drive/Storage/FileController.cs
+++ b/DysonNetwork.Drive/Storage/FileController.cs
@@ -293,7 +293,9 @@ public class FileController(
[FromQuery] bool recycled = false,
[FromQuery] int offset = 0,
[FromQuery] int take = 20,
- [FromQuery] string? query = null
+ [FromQuery] string? query = null,
+ [FromQuery] string order = "date",
+ [FromQuery] bool orderDesc = true
)
{
if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
@@ -303,7 +305,6 @@ public class FileController(
.Where(e => e.IsMarkedRecycle == recycled)
.Where(e => e.AccountId == accountId)
.Include(e => e.Pool)
- .OrderByDescending(e => e.CreatedAt)
.AsQueryable();
if (pool.HasValue) filesQuery = filesQuery.Where(e => e.PoolId == pool);
@@ -313,6 +314,14 @@ public class FileController(
filesQuery = filesQuery.Where(e => e.Name.Contains(query));
}
+ filesQuery = order.ToLower() switch
+ {
+ "date" => orderDesc ? filesQuery.OrderByDescending(e => e.CreatedAt) : filesQuery.OrderBy(e => e.CreatedAt),
+ "size" => orderDesc ? filesQuery.OrderByDescending(e => e.Size) : filesQuery.OrderBy(e => e.Size),
+ "name" => orderDesc ? filesQuery.OrderByDescending(e => e.Name) : filesQuery.OrderBy(e => e.Name),
+ _ => filesQuery.OrderByDescending(e => e.CreatedAt)
+ };
+
var total = await filesQuery.CountAsync();
Response.Headers.Append("X-Total", total.ToString());