mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 07:50:25 +08:00 
			
		
		
		
	优化用户服务整体启用和禁用
This commit is contained in:
		@@ -608,7 +608,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			for _, clusterId := range clusterIds {
 | 
			
		||||
				err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
				err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
@@ -616,7 +616,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
 | 
			
		||||
		} else {
 | 
			
		||||
			clusterIds, err := SharedNodeClusterDAO.FindAllEnabledNodeClusterIds(tx)
 | 
			
		||||
			for _, clusterId := range clusterIds {
 | 
			
		||||
				err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
				err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
@@ -668,7 +668,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
 | 
			
		||||
 | 
			
		||||
	if len(resultClusterIds) > 0 {
 | 
			
		||||
		for _, clusterId := range resultClusterIds {
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -301,7 +301,7 @@ func (this *IPListDAO) NotifyUpdate(tx *dbs.Tx, listId int64, taskType NodeTaskT
 | 
			
		||||
 | 
			
		||||
	if len(resultClusterIds) > 0 {
 | 
			
		||||
		for _, clusterId := range resultClusterIds {
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, taskType)
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, taskType)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -368,7 +368,7 @@ func (this *MetricItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64, isPublic bool)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		for _, clusterId := range clusterIds {
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
@@ -380,7 +380,7 @@ func (this *MetricItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64, isPublic bool)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, clusterId := range clusterIds {
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -1132,7 +1132,7 @@ func (this *NodeClusterDAO) UpdateClusterDDoSProtection(tx *dbs.Tx, clusterId in
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeDDosProtectionChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeDDosProtectionChanged)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindClusterGlobalServerConfig 查询全局服务配置
 | 
			
		||||
@@ -1175,12 +1175,12 @@ func (this *NodeClusterDAO) UpdateClusterGlobalServerConfig(tx *dbs.Tx, clusterI
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeGlobalServerConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeGlobalServerConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyUpdate 通知更新
 | 
			
		||||
func (this *NodeClusterDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error {
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyDNSUpdate 通知DNS更新
 | 
			
		||||
 
 | 
			
		||||
@@ -177,5 +177,5 @@ func (this *NodeClusterMetricItemDAO) ExistsClusterItem(tx *dbs.Tx, clusterId in
 | 
			
		||||
 | 
			
		||||
// NotifyUpdate 通知更新
 | 
			
		||||
func (this *NodeClusterMetricItemDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error {
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2018,7 +2018,7 @@ func (this *NodeDAO) UpdateNodeDDoSProtection(tx *dbs.Tx, nodeId int64, ddosProt
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if clusterId > 0 {
 | 
			
		||||
		return SharedNodeTaskDAO.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, 0, NodeTaskTypeDDosProtectionChanged, 0)
 | 
			
		||||
		return SharedNodeTaskDAO.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, 0, 0, NodeTaskTypeDDosProtectionChanged, 0)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -2030,7 +2030,7 @@ func (this *NodeDAO) NotifyUpdate(tx *dbs.Tx, nodeId int64) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = SharedNodeTaskDAO.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, 0, NodeTaskTypeConfigChanged, 0)
 | 
			
		||||
	err = SharedNodeTaskDAO.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, 0, 0, NodeTaskTypeConfigChanged, 0)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@@ -2046,7 +2046,7 @@ func (this *NodeDAO) NotifyLevelUpdate(tx *dbs.Tx, nodeId int64) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, clusterId := range clusterIds {
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeNodeLevelChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeNodeLevelChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,16 @@ import (
 | 
			
		||||
type NodeTaskType = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// CDN相关
 | 
			
		||||
 | 
			
		||||
	NodeTaskTypeConfigChanged             NodeTaskType = "configChanged"             // 节点整体配置变化
 | 
			
		||||
	NodeTaskTypeDDosProtectionChanged     NodeTaskType = "ddosProtectionChanged"     // 节点DDoS配置变更
 | 
			
		||||
	NodeTaskTypeGlobalServerConfigChanged NodeTaskType = "globalServerConfigChanged" // 全局服务设置变化
 | 
			
		||||
	NodeTaskTypeIPItemChanged             NodeTaskType = "ipItemChanged"
 | 
			
		||||
	NodeTaskTypeNodeVersionChanged        NodeTaskType = "nodeVersionChanged"
 | 
			
		||||
	NodeTaskTypeScriptsChanged            NodeTaskType = "scriptsChanged"
 | 
			
		||||
	NodeTaskTypeNodeLevelChanged          NodeTaskType = "nodeLevelChanged"
 | 
			
		||||
	NodeTaskTypeIPItemChanged             NodeTaskType = "ipItemChanged"             // IP条目变更
 | 
			
		||||
	NodeTaskTypeNodeVersionChanged        NodeTaskType = "nodeVersionChanged"        // 节点版本变化
 | 
			
		||||
	NodeTaskTypeScriptsChanged            NodeTaskType = "scriptsChanged"            // 脚本配置变化
 | 
			
		||||
	NodeTaskTypeNodeLevelChanged          NodeTaskType = "nodeLevelChanged"          // 节点级别变化
 | 
			
		||||
	NodeTaskTypeUserServersStateChanged   NodeTaskType = "userServersStateChanged"   // 用户服务状态变化
 | 
			
		||||
 | 
			
		||||
	// NS相关
 | 
			
		||||
 | 
			
		||||
@@ -54,17 +57,25 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateNodeTask 创建单个节点任务
 | 
			
		||||
func (this *NodeTaskDAO) CreateNodeTask(tx *dbs.Tx, role string, clusterId int64, nodeId int64, serverId int64, taskType NodeTaskType, version int64) error {
 | 
			
		||||
func (this *NodeTaskDAO) CreateNodeTask(tx *dbs.Tx, role string, clusterId int64, nodeId int64, userId int64, serverId int64, taskType NodeTaskType, version int64) error {
 | 
			
		||||
	if clusterId <= 0 || nodeId <= 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var uniqueId = role + "@" + types.String(nodeId) + "@node@" + types.String(serverId) + "@" + taskType
 | 
			
		||||
 | 
			
		||||
	// 用户信息
 | 
			
		||||
	// 没有直接加入到 uniqueId 中,是为了兼容以前的字段值
 | 
			
		||||
	if userId > 0 {
 | 
			
		||||
		uniqueId += "@" + types.String(userId)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var updatedAt = time.Now().Unix()
 | 
			
		||||
	_, _, err := this.Query(tx).
 | 
			
		||||
		InsertOrUpdate(maps.Map{
 | 
			
		||||
			"role":      role,
 | 
			
		||||
			"clusterId": clusterId,
 | 
			
		||||
			"nodeId":    nodeId,
 | 
			
		||||
			"userId":    userId,
 | 
			
		||||
			"serverId":  serverId,
 | 
			
		||||
			"type":      taskType,
 | 
			
		||||
			"uniqueId":  uniqueId,
 | 
			
		||||
@@ -87,17 +98,25 @@ func (this *NodeTaskDAO) CreateNodeTask(tx *dbs.Tx, role string, clusterId int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateClusterTask 创建集群任务
 | 
			
		||||
func (this *NodeTaskDAO) CreateClusterTask(tx *dbs.Tx, role string, clusterId int64, serverId int64, taskType NodeTaskType) error {
 | 
			
		||||
func (this *NodeTaskDAO) CreateClusterTask(tx *dbs.Tx, role string, clusterId int64, userId int64, serverId int64, taskType NodeTaskType) error {
 | 
			
		||||
	if clusterId <= 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var uniqueId = role + "@" + types.String(clusterId) + "@" + types.String(serverId) + "@cluster@" + types.String(serverId) + "@" + taskType
 | 
			
		||||
 | 
			
		||||
	// 用户信息
 | 
			
		||||
	// 没有直接加入到 uniqueId 中,是为了兼容以前的字段值
 | 
			
		||||
	if userId > 0 {
 | 
			
		||||
		uniqueId += "@" + types.String(userId)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var updatedAt = time.Now().Unix()
 | 
			
		||||
	_, _, err := this.Query(tx).
 | 
			
		||||
		InsertOrUpdate(maps.Map{
 | 
			
		||||
			"role":       role,
 | 
			
		||||
			"clusterId":  clusterId,
 | 
			
		||||
			"userId":     userId,
 | 
			
		||||
			"serverId":   serverId,
 | 
			
		||||
			"nodeId":     0,
 | 
			
		||||
			"type":       taskType,
 | 
			
		||||
@@ -121,7 +140,7 @@ func (this *NodeTaskDAO) CreateClusterTask(tx *dbs.Tx, role string, clusterId in
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExtractNodeClusterTask 分解边缘节点集群任务
 | 
			
		||||
func (this *NodeTaskDAO) ExtractNodeClusterTask(tx *dbs.Tx, clusterId int64, serverId int64, taskType NodeTaskType) error {
 | 
			
		||||
func (this *NodeTaskDAO) ExtractNodeClusterTask(tx *dbs.Tx, clusterId int64, userId int64, serverId int64, taskType NodeTaskType) error {
 | 
			
		||||
	nodeIds, err := SharedNodeDAO.FindAllNodeIdsMatch(tx, clusterId, true, configutils.BoolStateYes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -140,7 +159,7 @@ func (this *NodeTaskDAO) ExtractNodeClusterTask(tx *dbs.Tx, clusterId int64, ser
 | 
			
		||||
 | 
			
		||||
	var version = time.Now().UnixNano()
 | 
			
		||||
	for _, nodeId := range nodeIds {
 | 
			
		||||
		err = this.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, serverId, taskType, version)
 | 
			
		||||
		err = this.CreateNodeTask(tx, nodeconfigs.NodeRoleNode, clusterId, nodeId, userId, serverId, taskType, version)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
@@ -169,11 +188,11 @@ func (this *NodeTaskDAO) ExtractAllClusterTasks(tx *dbs.Tx, role string) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, one := range ones {
 | 
			
		||||
		clusterId := int64(one.(*NodeTask).ClusterId)
 | 
			
		||||
		var clusterId = int64(one.(*NodeTask).ClusterId)
 | 
			
		||||
		switch role {
 | 
			
		||||
		case nodeconfigs.NodeRoleNode:
 | 
			
		||||
			var nodeTask = one.(*NodeTask)
 | 
			
		||||
			err = this.ExtractNodeClusterTask(tx, clusterId, int64(nodeTask.ServerId), nodeTask.Type)
 | 
			
		||||
			err = this.ExtractNodeClusterTask(tx, clusterId, int64(nodeTask.UserId), int64(nodeTask.ServerId), nodeTask.Type)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@ type NodeTask struct {
 | 
			
		||||
	Role       string `field:"role"`       // 节点角色
 | 
			
		||||
	NodeId     uint32 `field:"nodeId"`     // 节点ID
 | 
			
		||||
	ClusterId  uint32 `field:"clusterId"`  // 集群ID
 | 
			
		||||
	ServerId   uint32 `field:"serverId"`   // 服务ID
 | 
			
		||||
	ServerId   uint64 `field:"serverId"`   // 服务ID
 | 
			
		||||
	UserId     uint64 `field:"userId"`     // 用户ID
 | 
			
		||||
	Type       string `field:"type"`       // 任务类型
 | 
			
		||||
	UniqueId   string `field:"uniqueId"`   // 唯一ID:nodeId@type
 | 
			
		||||
	UpdatedAt  uint64 `field:"updatedAt"`  // 修改时间
 | 
			
		||||
@@ -18,19 +19,20 @@ type NodeTask struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NodeTaskOperator struct {
 | 
			
		||||
	Id         interface{} // ID
 | 
			
		||||
	Role       interface{} // 节点角色
 | 
			
		||||
	NodeId     interface{} // 节点ID
 | 
			
		||||
	ClusterId  interface{} // 集群ID
 | 
			
		||||
	ServerId   interface{} // 服务ID
 | 
			
		||||
	Type       interface{} // 任务类型
 | 
			
		||||
	UniqueId   interface{} // 唯一ID:nodeId@type
 | 
			
		||||
	UpdatedAt  interface{} // 修改时间
 | 
			
		||||
	IsDone     interface{} // 是否已完成
 | 
			
		||||
	IsOk       interface{} // 是否已完成
 | 
			
		||||
	Error      interface{} // 错误信息
 | 
			
		||||
	IsNotified interface{} // 是否已通知更新
 | 
			
		||||
	Version    interface{} // 版本
 | 
			
		||||
	Id         any // ID
 | 
			
		||||
	Role       any // 节点角色
 | 
			
		||||
	NodeId     any // 节点ID
 | 
			
		||||
	ClusterId  any // 集群ID
 | 
			
		||||
	ServerId   any // 服务ID
 | 
			
		||||
	UserId     any // 用户ID
 | 
			
		||||
	Type       any // 任务类型
 | 
			
		||||
	UniqueId   any // 唯一ID:nodeId@type
 | 
			
		||||
	UpdatedAt  any // 修改时间
 | 
			
		||||
	IsDone     any // 是否已完成
 | 
			
		||||
	IsOk       any // 是否已完成
 | 
			
		||||
	Error      any // 错误信息
 | 
			
		||||
	IsNotified any // 是否已通知更新
 | 
			
		||||
	Version    any // 版本
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNodeTaskOperator() *NodeTaskOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -149,5 +149,5 @@ func (this *NSClusterDAO) CountAllClustersWithSSLPolicyIds(tx *dbs.Tx, sslPolicy
 | 
			
		||||
 | 
			
		||||
// NotifyUpdate 通知更改
 | 
			
		||||
func (this *NSClusterDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error {
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleDNS, clusterId, 0, NSNodeTaskTypeConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleDNS, clusterId, 0, 0, NSNodeTaskTypeConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1761,11 +1761,11 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldClusterId > 0 {
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
@@ -1776,11 +1776,11 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if newClusterId > 0 {
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, 0, NodeTaskTypeConfigChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
		err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, 0, NodeTaskTypeIPItemChanged)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
@@ -1793,8 +1793,8 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindAllEnabledServersWithUserId 查找用户的所有的服务
 | 
			
		||||
func (this *ServerDAO) FindAllEnabledServersWithUserId(tx *dbs.Tx, userId int64) (result []*Server, err error) {
 | 
			
		||||
// FindAllBasicServersWithUserId 查找用户的所有服务的基础信息
 | 
			
		||||
func (this *ServerDAO) FindAllBasicServersWithUserId(tx *dbs.Tx, userId int64) (result []*Server, err error) {
 | 
			
		||||
	_, err = this.Query(tx).
 | 
			
		||||
		Result("id", "serverNames", "name", "isOn", "type", "groupIds", "clusterId", "dnsName").
 | 
			
		||||
		State(ServerStateEnabled).
 | 
			
		||||
@@ -1805,6 +1805,18 @@ func (this *ServerDAO) FindAllEnabledServersWithUserId(tx *dbs.Tx, userId int64)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindAllAvailableServersWithUserId 查找用户的所有可用服务信息
 | 
			
		||||
func (this *ServerDAO) FindAllAvailableServersWithUserId(tx *dbs.Tx, userId int64) (result []*Server, err error) {
 | 
			
		||||
	_, err = this.Query(tx).
 | 
			
		||||
		State(ServerStateEnabled).
 | 
			
		||||
		Attr("userId", userId).
 | 
			
		||||
		Attr("isOn", true).
 | 
			
		||||
		DescPk().
 | 
			
		||||
		Slice(&result).
 | 
			
		||||
		FindAll()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindEnabledServerIdWithWebId 根据WebId查找ServerId
 | 
			
		||||
func (this *ServerDAO) FindEnabledServerIdWithWebId(tx *dbs.Tx, webId int64) (serverId int64, err error) {
 | 
			
		||||
	if webId <= 0 {
 | 
			
		||||
@@ -2652,7 +2664,7 @@ func (this *ServerDAO) NotifyUpdate(tx *dbs.Tx, serverId int64) error {
 | 
			
		||||
	if clusterId == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, serverId, NodeTaskTypeConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, serverId, NodeTaskTypeConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyClusterUpdate 同步指定的集群
 | 
			
		||||
@@ -2660,7 +2672,7 @@ func (this *ServerDAO) NotifyClusterUpdate(tx *dbs.Tx, clusterId, serverId int64
 | 
			
		||||
	if clusterId <= 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, serverId, NodeTaskTypeConfigChanged)
 | 
			
		||||
	return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, serverId, NodeTaskTypeConfigChanged)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyDNSUpdate 通知当前集群DNS更新
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import (
 | 
			
		||||
	dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
@@ -52,7 +53,11 @@ func (this *UserDAO) EnableUser(tx *dbs.Tx, userId int64) error {
 | 
			
		||||
		Pk(userId).
 | 
			
		||||
		Set("state", UserStateEnabled).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdate(tx, userId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DisableUser 禁用条目
 | 
			
		||||
@@ -65,7 +70,11 @@ func (this *UserDAO) DisableUser(tx *dbs.Tx, userId int64) error {
 | 
			
		||||
		Pk(userId).
 | 
			
		||||
		Set("state", UserStateDisabled).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdate(tx, userId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindEnabledUser 查找启用的用户
 | 
			
		||||
@@ -190,15 +199,6 @@ func (this *UserDAO) UpdateUser(tx *dbs.Tx, userId int64, username string, passw
 | 
			
		||||
		return errors.New("invalid userId")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 是否启用变化
 | 
			
		||||
	oldIsOn, err := this.Query(tx).
 | 
			
		||||
		Pk(userId).
 | 
			
		||||
		Result("isOn").
 | 
			
		||||
		FindBoolCol()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var op = NewUserOperator()
 | 
			
		||||
	op.Id = userId
 | 
			
		||||
	op.Username = username
 | 
			
		||||
@@ -212,16 +212,12 @@ func (this *UserDAO) UpdateUser(tx *dbs.Tx, userId int64, username string, passw
 | 
			
		||||
	op.Remark = remark
 | 
			
		||||
	op.ClusterId = nodeClusterId
 | 
			
		||||
	op.IsOn = isOn
 | 
			
		||||
	err = this.Save(tx, op)
 | 
			
		||||
	err := this.Save(tx, op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldIsOn != isOn {
 | 
			
		||||
		return SharedServerDAO.NotifyUserClustersChange(tx, userId)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return this.NotifyUpdate(tx, userId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateUserInfo 修改用户基本信息
 | 
			
		||||
@@ -529,5 +525,65 @@ func (this *UserDAO) UpdateUserIsVerified(tx *dbs.Tx, userId int64, isRejected b
 | 
			
		||||
	op.IsRejected = isRejected
 | 
			
		||||
	op.RejectReason = rejectReason
 | 
			
		||||
	op.IsVerified = true
 | 
			
		||||
	return this.Save(tx, op)
 | 
			
		||||
	err := this.Save(tx, op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdate(tx, userId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RenewUserServersState 更新用户服务状态
 | 
			
		||||
func (this *UserDAO) RenewUserServersState(tx *dbs.Tx, userId int64) error {
 | 
			
		||||
	oldServersEnabled, err := this.Query(tx).
 | 
			
		||||
		Pk(userId).
 | 
			
		||||
		Result("serversEnabled").
 | 
			
		||||
		FindBoolCol()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newServersEnabled, err := this.CheckUserServersEnabled(tx, userId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldServersEnabled != newServersEnabled {
 | 
			
		||||
		err = this.Query(tx).
 | 
			
		||||
			Pk(userId).
 | 
			
		||||
			Set("serversEnabled", newServersEnabled).
 | 
			
		||||
			UpdateQuickly()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 创建变更通知
 | 
			
		||||
		clusterIds, err := SharedServerDAO.FindUserServerClusterIds(tx, userId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		for _, clusterId := range clusterIds {
 | 
			
		||||
			err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, userId, 0, NodeTaskTypeUserServersStateChanged)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyUpdate 用户变更通知
 | 
			
		||||
func (this *UserDAO) NotifyUpdate(tx *dbs.Tx, userId int64) error {
 | 
			
		||||
	if userId <= 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新用户服务状态
 | 
			
		||||
	err := this.RenewUserServersState(tx, userId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								internal/db/models/user_dao_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								internal/db/models/user_dao_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
			
		||||
//go:build !plus
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import "github.com/iwind/TeaGo/dbs"
 | 
			
		||||
 | 
			
		||||
// CheckUserServersEnabled 判断用户是否可用服务功能
 | 
			
		||||
func (this *UserDAO) CheckUserServersEnabled(tx *dbs.Tx, userId int64) (isEnabled bool, err error) {
 | 
			
		||||
	// 是否已删除、未启用、已拒绝
 | 
			
		||||
	one, err := this.Query(tx).
 | 
			
		||||
		Result("id", "isRejected", "state", "isOn").
 | 
			
		||||
		Pk(userId).
 | 
			
		||||
		Find()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	if one == nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	var user = one.(*User)
 | 
			
		||||
	if user.State != UserStateEnabled || !user.IsOn || user.IsRejected {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package models
 | 
			
		||||
package models_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	_ "github.com/iwind/TeaGo/bootstrap"
 | 
			
		||||
@@ -9,7 +10,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestUserDAO_UpdateUserFeatures(t *testing.T) {
 | 
			
		||||
	var dao = NewUserDAO()
 | 
			
		||||
	var dao = models.NewUserDAO()
 | 
			
		||||
	var tx *dbs.Tx
 | 
			
		||||
	err := dao.UpdateUsersFeatures(tx, []string{
 | 
			
		||||
		userconfigs.UserFeatureCodeServerACME,
 | 
			
		||||
@@ -18,3 +19,17 @@ func TestUserDAO_UpdateUserFeatures(t *testing.T) {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestUserDAO_CheckUserServersEnabled(t *testing.T) {
 | 
			
		||||
	dbs.NotifyReady()
 | 
			
		||||
 | 
			
		||||
	var dao = models.NewUserDAO()
 | 
			
		||||
	var tx *dbs.Tx
 | 
			
		||||
	for _, userId := range []int64{1, 2, 1000000} {
 | 
			
		||||
		isEnabled, err := dao.CheckUserServersEnabled(tx, userId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		t.Log("user:", userId, "isEnabled:", isEnabled)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@ type User struct {
 | 
			
		||||
	Modules         dbs.JSON `field:"modules"`         // 用户模块
 | 
			
		||||
	PriceType       string   `field:"priceType"`       // 计费类型:traffic|bandwidth
 | 
			
		||||
	PricePeriod     string   `field:"pricePeriod"`     // 结算周期
 | 
			
		||||
	ServersEnabled  uint8    `field:"serversEnabled"`  // 是否禁用所有服务
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UserOperator struct {
 | 
			
		||||
@@ -59,6 +60,7 @@ type UserOperator struct {
 | 
			
		||||
	Modules         any // 用户模块
 | 
			
		||||
	PriceType       any // 计费类型:traffic|bandwidth
 | 
			
		||||
	PricePeriod     any // 结算周期
 | 
			
		||||
	ServersEnabled  any // 是否禁用所有服务
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserOperator() *UserOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,7 @@ func (this *NodeTaskService) FindNodeTasks(ctx context.Context, req *pb.FindNode
 | 
			
		||||
			Version:   int64(task.Version),
 | 
			
		||||
			IsPrimary: primaryNodeId == nodeId,
 | 
			
		||||
			ServerId:  int64(task.ServerId),
 | 
			
		||||
			UserId:    int64(task.UserId),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -139,6 +140,7 @@ func (this *NodeTaskService) FindNodeClusterTasks(ctx context.Context, req *pb.F
 | 
			
		||||
				Error:     task.Error,
 | 
			
		||||
				UpdatedAt: int64(task.UpdatedAt),
 | 
			
		||||
				ServerId:  int64(task.ServerId),
 | 
			
		||||
				UserId:    int64(task.UserId),
 | 
			
		||||
				Node: &pb.Node{
 | 
			
		||||
					Id:   int64(task.NodeId),
 | 
			
		||||
					Name: nodeName,
 | 
			
		||||
@@ -264,6 +266,7 @@ func (this *NodeTaskService) FindNotifyingNodeTasks(ctx context.Context, req *pb
 | 
			
		||||
			UpdatedAt: int64(task.UpdatedAt),
 | 
			
		||||
			Node:      &pb.Node{Id: int64(task.NodeId)},
 | 
			
		||||
			ServerId:  int64(task.ServerId),
 | 
			
		||||
			UserId:    int64(task.UserId),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1442,7 +1442,7 @@ func (this *ServerService) FindAllEnabledServerNamesWithUserId(ctx context.Conte
 | 
			
		||||
		req.UserId = userId
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllEnabledServersWithUserId(tx, req.UserId)
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllBasicServersWithUserId(tx, req.UserId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -1478,7 +1478,7 @@ func (this *ServerService) FindAllUserServers(ctx context.Context, req *pb.FindA
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllEnabledServersWithUserId(tx, req.UserId)
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllBasicServersWithUserId(tx, req.UserId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -1498,6 +1498,39 @@ func (this *ServerService) FindAllUserServers(ctx context.Context, req *pb.FindA
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ComposeAllUserServersConfig 查找某个用户下的服务配置
 | 
			
		||||
func (this *ServerService) ComposeAllUserServersConfig(ctx context.Context, req *pb.ComposeAllUserServersConfigRequest) (*pb.ComposeAllUserServersConfigResponse, error) {
 | 
			
		||||
	_, err := this.ValidateNode(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllAvailableServersWithUserId(tx, req.UserId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var configs = []*serverconfigs.ServerConfig{}
 | 
			
		||||
	var cacheMap = utils.NewCacheMap()
 | 
			
		||||
	for _, server := range servers {
 | 
			
		||||
		config, err := models.SharedServerDAO.ComposeServerConfig(tx, server, cacheMap, true, false)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		configs = append(configs, config)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	configsJSON, err := json.Marshal(configs)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.ComposeAllUserServersConfigResponse{
 | 
			
		||||
		ServersConfigJSON: configsJSON,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindEnabledUserServerBasic 查找服务基本信息
 | 
			
		||||
func (this *ServerService) FindEnabledUserServerBasic(ctx context.Context, req *pb.FindEnabledUserServerBasicRequest) (*pb.FindEnabledUserServerBasicResponse, error) {
 | 
			
		||||
	_, userId, err := this.ValidateAdminAndUser(ctx, true)
 | 
			
		||||
 
 | 
			
		||||
@@ -762,3 +762,40 @@ func (this *UserService) CheckUserOTPWithUsername(ctx context.Context, req *pb.C
 | 
			
		||||
	}
 | 
			
		||||
	return &pb.CheckUserOTPWithUsernameResponse{RequireOTP: otpIsOn}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckUserServersState 检查用户服务可用状态
 | 
			
		||||
func (this *UserService) CheckUserServersState(ctx context.Context, req *pb.CheckUserServersStateRequest) (*pb.CheckUserServersStateResponse, error) {
 | 
			
		||||
	_, err := this.ValidateNode(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	isEnabled, err := models.SharedUserDAO.CheckUserServersEnabled(tx, req.UserId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &pb.CheckUserServersStateResponse{
 | 
			
		||||
		IsEnabled: isEnabled,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RenewUserServersState 更新用户服务可用状态
 | 
			
		||||
func (this *UserService) RenewUserServersState(ctx context.Context, req *pb.RenewUserServersStateRequest) (*pb.RPCSuccess, error) {
 | 
			
		||||
	_, userId, err := this.ValidateAdminAndUser(ctx, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if userId > 0 {
 | 
			
		||||
		req.UserId = userId
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	err = models.SharedUserDAO.RenewUserServersState(tx, req.UserId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.Success()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user