using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using VoidCat.Model; using VoidCat.Services.Abstractions; using VoidCat.Services.Files; namespace VoidCat.Controllers.Admin; [Route("admin")] [Authorize(Policy = Policies.RequireAdmin)] public class AdminController : Controller { private readonly FileStoreFactory _fileStore; private readonly IFileMetadataStore _fileMetadata; private readonly IFileInfoManager _fileInfo; private readonly IUserStore _userStore; private readonly IUserUploadsStore _userUploads; public AdminController(FileStoreFactory fileStore, IUserStore userStore, IFileInfoManager fileInfo, IFileMetadataStore fileMetadata, IUserUploadsStore userUploads) { _fileStore = fileStore; _userStore = userStore; _fileInfo = fileInfo; _fileMetadata = fileMetadata; _userUploads = userUploads; } /// /// List all files in the system /// /// Page request /// [HttpPost] [Route("file")] public async Task> ListFiles([FromBody] PagedRequest request) { var files = await _fileMetadata.ListFiles(request); return new() { Page = files.Page, PageSize = files.PageSize, TotalResults = files.TotalResults, Results = (await files.Results.SelectAwait(a => _fileInfo.Get(a.Id)).ToListAsync())! }; } /// /// Delete a file from the system /// /// Id of the file to delete [HttpDelete] [Route("file/{id}")] public async Task DeleteFile([FromRoute] string id) { var gid = id.FromBase58Guid(); await _fileStore.DeleteFile(gid); await _fileInfo.Delete(gid); } /// /// List all users in the system /// /// Page request /// [HttpPost] [Route("user")] public async Task> ListUsers([FromBody] PagedRequest request) { var result = await _userStore.ListUsers(request); var ret = await result.Results.SelectAwait(async a => { var uploads = await _userUploads.ListFiles(a.Id, new(0, int.MaxValue)); return new AdminListedUser(a, uploads.TotalResults); }).ToListAsync(); return new() { PageSize = request.PageSize, Page = request.Page, TotalResults = result.TotalResults, Results = ret }; } /// /// Admin update user account /// /// /// [HttpPost] [Route("user/{id}")] public async Task UpdateUser([FromBody] PrivateVoidUser user) { var oldUser = await _userStore.Get(user.Id); if (oldUser == default) return BadRequest(); await _userStore.AdminUpdateUser(user); return Ok(); } public record AdminListedUser(PrivateVoidUser User, int Uploads); }