using System.ComponentModel;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NewLife;
using NewLife.Cube;
using NewLife.Cube.Extensions;
using NewLife.Cube.ViewModels;
using NewLife.Web;
using Stardust.Data.Deployment;
using Stardust.Web.Services;
using XCode.Membership;
namespace Stardust.Web.Areas.Deployment.Controllers;
[Menu(88, false)]
[DeploymentArea]
public class AppDeployNodeController : DeploymentEntityController<AppDeployNode>
{
static AppDeployNodeController()
{
ListFields.RemoveCreateField();
AddFormFields.RemoveCreateField();
ListFields.TraceUrl();
LogOnChange = true;
{
var df = ListFields.GetField("DeployName") as ListField;
df.Url = "/Deployment/AppDeploy?deployId={DeployId}";
}
}
private readonly DeployService _deployService;
public AppDeployNodeController(DeployService deployService)
{
_deployService = deployService;
}
/// <summary>高级æœç´¢ã€‚按æ¡ä»¶åˆ†é¡µæŸ¥è¯¢</summary>
/// <param name="p">åˆ†é¡µå‚æ•°</param>
/// <returns>实体列表</returns>
protected override IEnumerable<AppDeployNode> Search(Pager p)
{
var id = p["id"].ToInt(-1);
if (id > 0)
{
var entity = AppDeployNode.FindById(id);
if (entity != null) return [entity];
}
var appId = p["deployId"].ToInt(-1);
if (appId <= 0) appId = p["appId"].ToInt(-1);
var nodeId = p["nodeId"].ToInt(-1);
var enable = p["enable"]?.ToBoolean();
PageSetting.EnableAdd = appId > 0;
PageSetting.EnableNavbar = false;
return AppDeployNode.Search(appId, nodeId, enable, p["Q"], p);
}
protected override Boolean Valid(AppDeployNode entity, DataObjectMethodType type, Boolean post)
{
if (!post) return base.Valid(entity, type, post);
var node = entity.Node;
if (node != null) entity.IP = node.IP;
entity.FixOldUserName();
entity.Deploy?.Fix();
return base.Valid(entity, type, post);
}
protected override Int32 OnInsert(AppDeployNode entity)
{
var rs = base.OnInsert(entity);
entity.Deploy?.Fix();
return rs;
}
protected override Int32 OnUpdate(AppDeployNode entity)
{
var rs = base.OnUpdate(entity);
entity.Deploy?.Fix();
return rs;
}
protected override Int32 OnDelete(AppDeployNode entity)
{
var rs = base.OnDelete(entity);
entity.Deploy?.Fix();
return rs;
}
/// <summary>执行æ“作</summary>
/// <param name="act">æ“作。install/start/stop/restart/uninstall</param>
/// <param name="id">节点编å·</param>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Update)]
public async Task<ActionResult> Operate(String act, Int32 id)
{
var dn = AppDeployNode.FindById(id);
if (dn == null || dn.Node == null || dn.Deploy == null) return Json(500, $"[{id}]ä¸å˜åœ¨");
var deployName = dn.DeployName;
if (deployName.IsNullOrEmpty()) deployName = dn.Deploy?.Name;
await _deployService.Control(dn.Deploy, dn, act, UserHost, 0, 0, cancellationToken: HttpContext.RequestAborted);
return JsonRefresh($"在节点[{dn.NodeName}]上对应用[{deployName}]执行[{act}]æ“作", 1);
}
/// <summary>æ‰¹é‡æ‰§è¡Œæ“作</summary>
/// <param name="act">æ“作。install/start/stop/restart/uninstall</param>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Update)]
public async Task<ActionResult> BatchOperate(String act)
{
var ts = new List<Task>();
var ids = SelectKeys.Select(e => e.ToInt()).Where(e => e > 0).Distinct().ToList();
foreach (var id in ids)
{
var dn = AppDeployNode.FindById(id);
if (dn != null && dn.Node != null && dn.Deploy != null)
{
ts.Add(_deployService.Control(dn.Deploy, dn, act, UserHost, dn.Delay, 0, cancellationToken: HttpContext.RequestAborted));
}
}
await Task.WhenAll(ts);
return JsonRefresh($"æ‰¹é‡æ‰§è¡Œ[{act}]æ“作", 1);
}
}
|