diff --git a/Iceshrimp.Backend/Controllers/Web/DriveController.cs b/Iceshrimp.Backend/Controllers/Web/DriveController.cs index 67eab6aa..bef2003e 100644 --- a/Iceshrimp.Backend/Controllers/Web/DriveController.cs +++ b/Iceshrimp.Backend/Controllers/Web/DriveController.cs @@ -224,6 +224,61 @@ public class DriveController( return StatusCode(StatusCodes.Status202Accepted); } + [HttpGet("folder")] + [Authenticate] + [Authorize] + [ProducesResults(HttpStatusCode.OK)] + public async Task GetRootFolder() + { + return await GetFolder(null); + } + + [HttpGet("folder/{id}")] + [Authenticate] + [Authorize] + [ProducesResults(HttpStatusCode.OK)] + [ProducesErrors(HttpStatusCode.NotFound)] + public async Task GetFolder(string? id) + { + var user = HttpContext.GetUserOrFail(); + + var folder = id != null + ? await db.DriveFolders.FirstOrDefaultAsync(p => p.Id == id && p.UserId == user.Id) + ?? throw GracefulException.RecordNotFound() + : null; + + var driveFiles = await db.DriveFiles + .Where(p => p.FolderId == id && p.UserId == user.Id) + .Select(p => new DriveFileResponse + { + Id = p.Name, + Url = p.AccessUrl, + ThumbnailUrl = p.ThumbnailAccessUrl, + Filename = p.Name, + ContentType = p.Type, + Sensitive = p.IsSensitive, + Description = p.Comment + }) + .ToListAsync(); + + var driveFolders = await db.DriveFolders + .Where(p => p.ParentId == id && p.UserId == user.Id) + .Select(p => new DriveFolderResponse + { + Id = p.Id, Name = p.Name, ParentId = p.ParentId + }) + .ToListAsync(); + + return new DriveFolderResponse + { + Id = folder?.Id, + Name = folder?.Name, + ParentId = folder?.ParentId, + Files = driveFiles, + Folders = driveFolders + }; + } + private async Task GetFileByAccessKey(string accessKey, string? version, DriveFile? file) { file ??= await db.DriveFiles.FirstOrDefaultAsync(p => p.AccessKey == accessKey diff --git a/Iceshrimp.Shared/Schemas/Web/DriveFileResponse.cs b/Iceshrimp.Shared/Schemas/Web/DriveFileResponse.cs index 5f162a48..fa40dff5 100644 --- a/Iceshrimp.Shared/Schemas/Web/DriveFileResponse.cs +++ b/Iceshrimp.Shared/Schemas/Web/DriveFileResponse.cs @@ -11,4 +11,13 @@ public class DriveFileResponse : IIdentifiable public required string ContentType { get; set; } public required bool Sensitive { get; set; } public required string? Description { get; set; } +} + +public class DriveFolderResponse +{ + public required string? Id { get; set; } + public required string? Name { get; set; } + public required string? ParentId { get; set; } + public List Files { get; set; } = []; + public List Folders { get; set; } = []; } \ No newline at end of file