Files
Abyss/Abyss/Components/Services/Admin/Modules/ListModule.cs
2025-10-05 21:43:20 +08:00

80 lines
2.5 KiB
C#

using System.Text;
using Abyss.Components.Controllers.Security;
using Abyss.Components.Services.Admin.Attributes;
using Abyss.Components.Services.Admin.Interfaces;
using Abyss.Components.Services.Media;
using Abyss.Components.Services.Misc;
using Abyss.Components.Static;
using Abyss.Model.Admin;
namespace Abyss.Components.Services.Admin.Modules;
[Module(107)]
public class ListModule(
ILogger<ListModule> logger,
ConfigureService configureService,
ResourceService resourceService
) : IModule
{
public async Task<Ctl> ExecuteAsync(Ctl request, CancellationToken ct)
{
// request.Params[0] -> Relative Path
try
{
var path = Helpers.SafePathCombine(configureService.MediaRoot, [request.Params[0]]);
if (!Directory.Exists(path))
{
logger.LogInformation("Directory does not exist: {FullPath}", path);
return new Ctl
{
Head = 404,
Params = ["Not found"]
};
}
var entries = Directory.EnumerateFileSystemEntries(path, "*", SearchOption.TopDirectoryOnly).ToArray();
var sb = new StringBuilder();
foreach (var entry in entries)
{
try
{
var filename = Path.GetFileName(entry);
var isDir = Directory.Exists(entry);
var ra = await resourceService.GetAttribute(entry);
var ownerId = ra?.Owner ?? -1;
var uid = ra?.Uid ?? string.Empty;
var permRaw = ra?.Permission ?? "--,--,--";
var permStr = RootController.ConvertToLsPerms(permRaw, isDir);
sb.AppendLine($"{permStr} {ownerId,5} {uid} {filename}");
}
catch (Exception ex)
{
logger.LogInformation("Error processing entry {Entry}: {ErrorMessage}", entry, ex.Message);
// ignored
}
}
logger.LogInformation("Ls operation completed successfully");
return new Ctl
{
Head = 200,
Params = [sb.ToString()]
};
}
catch (Exception ex)
{
logger.LogInformation("Ls operation failed with error: {ErrorMessage}", ex.Message);
return new Ctl
{
Head = 500,
Params = ["Server Exception", ex.Message]
};
}
}
}