using Microsoft.AspNetCore.Mvc; using WenChuanyi.Api.Dtos; using WenChuanyi.Api.Models; using WenChuanyi.Api.Services; namespace WenChuanyi.Api.Controllers; /// 发送者管理:凭管理码查看文件列表 / 删除文件 [ApiController] [Route("api/admin")] public class AdminController : ControllerBase { private readonly IFreeSql _fsql; private readonly OssStorageService _oss; private readonly ILogger _logger; public AdminController(IFreeSql fsql, OssStorageService oss, ILogger logger) { _fsql = fsql; _oss = oss; _logger = logger; } /// 管理码查询文件列表(含上传 IP) [HttpGet("files/{adminCode}")] public async Task List(string adminCode) { if (string.IsNullOrEmpty(adminCode) || adminCode.Length != 8) { return BadRequest(new { message = "管理码无效" }); } var list = await _fsql.Select() .Where(f => f.AdminCode == adminCode) .OrderByDescending(f => f.CreatedAt) .ToListAsync(); return Ok(list.Select(ToDto)); } /// 删除指定文件(body 传 id 或取件码,校验管理码) [HttpDelete("files/{adminCode}")] public async Task Delete(string adminCode, [FromBody] DeleteRequest? req) { if (string.IsNullOrEmpty(adminCode) || adminCode.Length != 8) { return BadRequest(new { message = "管理码无效" }); } if (req == null || (req.Id == null && string.IsNullOrEmpty(req.PickCode))) { return BadRequest(new { message = "请提供要删除的文件 Id 或取件码" }); } FileItem? item; if (req.Id != null) { item = await _fsql.Select() .Where(f => f.Id == req.Id.Value && f.AdminCode == adminCode).FirstAsync(); } else { item = await _fsql.Select() .Where(f => f.PickCode == req.PickCode && f.AdminCode == adminCode).FirstAsync(); } if (item == null) { return NotFound(new { message = "文件不存在或管理码不匹配" }); } var deleted = await _fsql.Delete().Where(f => f.Id == item.Id).ExecuteAffrowsAsync() > 0; if (deleted) { _oss.TryDeleteObject(item.ObjectKey); } return Ok(new { message = "已删除" }); } private static FileInfoDto ToDto(FileItem f) => new() { Id = f.Id, PickCode = f.PickCode, FileType = f.FileType, HasPassword = f.FileType == "private", OriginalName = f.OriginalName, Size = f.Size, MimeType = f.MimeType, DownloadCount = f.DownloadCount, UploadIp = f.UploadIp, IsPermanent = f.IsPermanent, ExpiresAt = f.ExpiresAt, CreatedAt = f.CreatedAt, ExpireText = FileRules.ExpireText(f) }; }