节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.62 KiB
Stardust
using System;
using System.Collections.Generic;
using System.Linq;
using NewLife;
using NewLife.Data;
using XCode;
using XCode.Membership;

namespace Stardust.Data.Gateway;

/// <summary>网关集群。后端服务器集群,定义了负载均衡策略和健康检查配置</summary>
public partial class GatewayCluster : Entity<GatewayCluster>
{
    #region 对象操作
    static GatewayCluster()
    {
        Meta.Interceptors.Add<UserInterceptor>();
        Meta.Interceptors.Add<TimeInterceptor>();
    }

    public override void Valid(Boolean isNew)
    {
        if (!HasDirty) return;
        base.Valid(isNew);
        if (Name.IsNullOrEmpty()) throw new ArgumentNullException(nameof(Name), L.T("Name cannot be empty."));
    }
    #endregion

    #region 扩展属性
    public IList<GatewayNode> Nodes => Extends.Get(nameof(Nodes), k => GatewayNode.FindAllByClusterId(Id));
    public IList<GatewayRoute> Routes => Extends.Get(nameof(Routes), k => GatewayRoute.FindAllByClusterId(Id));
    public Int32 ActiveNodes => Nodes?.Count(e => e.Enable && e.IsHealthy) ?? 0;
    #endregion

    #region 扩展查询
    public static IList<GatewayCluster> FindAllEnabled() => FindAll(_.Enable == true);

    public static IList<GatewayCluster> Search(String key, PageParameter page)
    {
        var exp = new WhereExpression();
        if (!key.IsNullOrEmpty()) exp &= _.Name.Contains(key) | _.Remark.Contains(key);
        return FindAll(exp, page);
    }
    #endregion

    #region 扩展删除
    protected override Int32 OnDelete()
    {
        GatewayNode.DeleteByClusterId(Id);
        return base.OnDelete();
    }
    #endregion
}