From faa375042a41adc98f18c980bcd4bf4d8c654760 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 18 Nov 2025 18:50:39 +0800 Subject: [PATCH] :sparkles: New drive api order etc --- .../Index/FileIndexController.cs | 58 +++++++++++++++++-- DysonNetwork.Drive/Storage/FileController.cs | 13 ++++- 2 files changed, 65 insertions(+), 6 deletions(-) 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());