减少TraceItem数据量较大时的性能浪费
智能大石头 authored at 2024-10-22 08:41:14
3.85 KiB
Stardust
using Microsoft.AspNetCore.Mvc;
using NewLife;
using NewLife.Cube;
using NewLife.Log;
using NewLife.Web;
using Stardust.Data.Deployment;
using Stardust.Data.Nodes;
using XCode.Membership;
using Attachment = NewLife.Cube.Entity.Attachment;

namespace Stardust.Web.Areas.Nodes.Controllers;

[Menu(40)]
[NodesArea]
public class NodeVersionController : EntityController<NodeVersion>
{
    static NodeVersionController()
    {
        LogOnChange = true;

        ListFields.RemoveField("Source", "Size", "FileHash", "Preinstall", "Executor");
        ListFields.RemoveCreateField().RemoveRemarkField();

        {
            //var df = ListFields.GetField("Source") as ListField;
            //df.DisplayName = "下载";
            //df.Url = "{Source}";
            //df.DataVisible = e =>
            //{
            //    var entity = e as NodeVersion;
            //    return !entity.Source.IsNullOrEmpty() && !entity.Source.StartsWithIgnoreCase("http://", "https://");
            //};
        }

        {
            var df = ListFields.AddListField("Log", "CreateUserID");
            df.DisplayName = "审计日志";
            df.Header = "审计日志";
            df.Url = "/Admin/Log?category=节点版本&linkId={ID}";
            df.Target = "_frame";
        }
    }

    protected override IEnumerable<NodeVersion> Search(Pager p)
    {
        var enable = p["enable"]?.ToBoolean();
        var start = p["dtStart"].ToDateTime();
        var end = p["dtEnd"].ToDateTime();
        var key = p["q"];

        return NodeVersion.Search(start, end, enable, key, p);
    }

    protected override Int32 OnDelete(NodeVersion entity)
    {
        if (!entity.Source.IsNullOrEmpty()) 
        {
            //取 Id@Attachment 唯一
            var id = Path.GetFileNameWithoutExtension(entity.Source.Replace("/cube/file?id=", string.Empty));
            var att = Attachment.FindById(id.ToLong());
            if (att != null)
            {
                var attPath = att.GetFilePath();
                if (System.IO.File.Exists(attPath))
                {
                    XTrace.Log.Error($"success delete {attPath}");
                    System.IO.File.Delete(attPath);
                }
                //删除记录
                att.DeleteAsync();
            }
        }        

        var rs = base.OnDelete(entity);
        return rs;
    }

    protected override async Task<Attachment> SaveFile(NodeVersion entity, IFormFile file, String uploadPath, String fileName)
    {
        var att = await base.SaveFile(entity, file, uploadPath, fileName);
        if (att != null)
        {
            entity.FileHash = att.Hash;
            entity.Size = att.Size;
            entity.Source = $"/cube/file?id={att.Id}{att.Extension}";

            entity.Update();
        }

        // 不给上层拿到附件,避免Url字段被覆盖
        return null;
    }

    //protected override async Task<IList<String>> SaveFiles(NodeVersion entity, String uploadPath = null)
    //{
    //    var rs = await base.SaveFiles(entity, uploadPath);

    //    // 更新文件哈希
    //    if (rs.Count > 0 && !entity.Source.IsNullOrEmpty())
    //    {
    //        var fi = NewLife.Cube.Setting.Current.UploadPath.CombinePath(entity.Source).AsFile();
    //        if (fi.Exists)
    //        {
    //            entity.FileHash = fi.ReadBytes().MD5().ToHex();
    //        }
    //    }

    //    return rs;
    //}

    public ActionResult GetVersion(String id)
    {
        var name = id;
        var nv = NodeVersion.FindByVersion(name.TrimEnd(".zip"));
        if (nv == null) return NotFound("非法参数");

        var set = CubeSetting.Current;
        var updatePath = set.UploadPath;
        var fi = updatePath.CombinePath(nv.Source).AsFile();
        if (!fi.Exists) return NotFound("文件不存在");

        return PhysicalFile(fi.FullName, "application/octet-stream", name);
    }
}