优化用户服务整体启用和禁用

This commit is contained in:
GoEdgeLab
2022-10-23 16:22:20 +08:00
parent 08a1263815
commit aa1a534bf8
18 changed files with 275 additions and 69 deletions

View File

@@ -608,7 +608,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
return err return err
} }
for _, clusterId := range clusterIds { 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 { if err != nil {
return err return err
} }
@@ -616,7 +616,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
} else { } else {
clusterIds, err := SharedNodeClusterDAO.FindAllEnabledNodeClusterIds(tx) clusterIds, err := SharedNodeClusterDAO.FindAllEnabledNodeClusterIds(tx)
for _, clusterId := range clusterIds { 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 { if err != nil {
return err return err
} }
@@ -668,7 +668,7 @@ func (this *IPItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64) error {
if len(resultClusterIds) > 0 { if len(resultClusterIds) > 0 {
for _, clusterId := range resultClusterIds { 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 { if err != nil {
return err return err
} }

View File

@@ -301,7 +301,7 @@ func (this *IPListDAO) NotifyUpdate(tx *dbs.Tx, listId int64, taskType NodeTaskT
if len(resultClusterIds) > 0 { if len(resultClusterIds) > 0 {
for _, clusterId := range resultClusterIds { 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 { if err != nil {
return err return err
} }

View File

@@ -368,7 +368,7 @@ func (this *MetricItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64, isPublic bool)
return err return err
} }
for _, clusterId := range clusterIds { 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 { if err != nil {
return err return err
} }
@@ -380,7 +380,7 @@ func (this *MetricItemDAO) NotifyUpdate(tx *dbs.Tx, itemId int64, isPublic bool)
return err return err
} }
for _, clusterId := range clusterIds { 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 { if err != nil {
return err return err
} }

View File

@@ -1132,7 +1132,7 @@ func (this *NodeClusterDAO) UpdateClusterDDoSProtection(tx *dbs.Tx, clusterId in
if err != nil { if err != nil {
return err return err
} }
return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeDDosProtectionChanged) return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeDDosProtectionChanged)
} }
// FindClusterGlobalServerConfig 查询全局服务配置 // FindClusterGlobalServerConfig 查询全局服务配置
@@ -1175,12 +1175,12 @@ func (this *NodeClusterDAO) UpdateClusterGlobalServerConfig(tx *dbs.Tx, clusterI
return err return err
} }
return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, NodeTaskTypeGlobalServerConfigChanged) return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeGlobalServerConfigChanged)
} }
// NotifyUpdate 通知更新 // NotifyUpdate 通知更新
func (this *NodeClusterDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error { 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更新 // NotifyDNSUpdate 通知DNS更新

View File

@@ -177,5 +177,5 @@ func (this *NodeClusterMetricItemDAO) ExistsClusterItem(tx *dbs.Tx, clusterId in
// NotifyUpdate 通知更新 // NotifyUpdate 通知更新
func (this *NodeClusterMetricItemDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error { 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)
} }

View File

@@ -2018,7 +2018,7 @@ func (this *NodeDAO) UpdateNodeDDoSProtection(tx *dbs.Tx, nodeId int64, ddosProt
return err return err
} }
if clusterId > 0 { 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 return nil
} }
@@ -2030,7 +2030,7 @@ func (this *NodeDAO) NotifyUpdate(tx *dbs.Tx, nodeId int64) error {
if err != nil { if err != nil {
return err 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 { if err != nil {
return err return err
} }
@@ -2046,7 +2046,7 @@ func (this *NodeDAO) NotifyLevelUpdate(tx *dbs.Tx, nodeId int64) error {
return err return err
} }
for _, clusterId := range clusterIds { 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 { if err != nil {
return err return err
} }

View File

@@ -14,13 +14,16 @@ import (
type NodeTaskType = string type NodeTaskType = string
const ( const (
// CDN相关
NodeTaskTypeConfigChanged NodeTaskType = "configChanged" // 节点整体配置变化 NodeTaskTypeConfigChanged NodeTaskType = "configChanged" // 节点整体配置变化
NodeTaskTypeDDosProtectionChanged NodeTaskType = "ddosProtectionChanged" // 节点DDoS配置变更 NodeTaskTypeDDosProtectionChanged NodeTaskType = "ddosProtectionChanged" // 节点DDoS配置变更
NodeTaskTypeGlobalServerConfigChanged NodeTaskType = "globalServerConfigChanged" // 全局服务设置变化 NodeTaskTypeGlobalServerConfigChanged NodeTaskType = "globalServerConfigChanged" // 全局服务设置变化
NodeTaskTypeIPItemChanged NodeTaskType = "ipItemChanged" NodeTaskTypeIPItemChanged NodeTaskType = "ipItemChanged" // IP条目变更
NodeTaskTypeNodeVersionChanged NodeTaskType = "nodeVersionChanged" NodeTaskTypeNodeVersionChanged NodeTaskType = "nodeVersionChanged" // 节点版本变化
NodeTaskTypeScriptsChanged NodeTaskType = "scriptsChanged" NodeTaskTypeScriptsChanged NodeTaskType = "scriptsChanged" // 脚本配置变化
NodeTaskTypeNodeLevelChanged NodeTaskType = "nodeLevelChanged" NodeTaskTypeNodeLevelChanged NodeTaskType = "nodeLevelChanged" // 节点级别变化
NodeTaskTypeUserServersStateChanged NodeTaskType = "userServersStateChanged" // 用户服务状态变化
// NS相关 // NS相关
@@ -54,17 +57,25 @@ func init() {
} }
// CreateNodeTask 创建单个节点任务 // 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 { if clusterId <= 0 || nodeId <= 0 {
return nil return nil
} }
var uniqueId = role + "@" + types.String(nodeId) + "@node@" + types.String(serverId) + "@" + taskType var uniqueId = role + "@" + types.String(nodeId) + "@node@" + types.String(serverId) + "@" + taskType
// 用户信息
// 没有直接加入到 uniqueId 中,是为了兼容以前的字段值
if userId > 0 {
uniqueId += "@" + types.String(userId)
}
var updatedAt = time.Now().Unix() var updatedAt = time.Now().Unix()
_, _, err := this.Query(tx). _, _, err := this.Query(tx).
InsertOrUpdate(maps.Map{ InsertOrUpdate(maps.Map{
"role": role, "role": role,
"clusterId": clusterId, "clusterId": clusterId,
"nodeId": nodeId, "nodeId": nodeId,
"userId": userId,
"serverId": serverId, "serverId": serverId,
"type": taskType, "type": taskType,
"uniqueId": uniqueId, "uniqueId": uniqueId,
@@ -87,17 +98,25 @@ func (this *NodeTaskDAO) CreateNodeTask(tx *dbs.Tx, role string, clusterId int64
} }
// CreateClusterTask 创建集群任务 // 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 { if clusterId <= 0 {
return nil return nil
} }
var uniqueId = role + "@" + types.String(clusterId) + "@" + types.String(serverId) + "@cluster@" + types.String(serverId) + "@" + taskType 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() var updatedAt = time.Now().Unix()
_, _, err := this.Query(tx). _, _, err := this.Query(tx).
InsertOrUpdate(maps.Map{ InsertOrUpdate(maps.Map{
"role": role, "role": role,
"clusterId": clusterId, "clusterId": clusterId,
"userId": userId,
"serverId": serverId, "serverId": serverId,
"nodeId": 0, "nodeId": 0,
"type": taskType, "type": taskType,
@@ -121,7 +140,7 @@ func (this *NodeTaskDAO) CreateClusterTask(tx *dbs.Tx, role string, clusterId in
} }
// ExtractNodeClusterTask 分解边缘节点集群任务 // 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) nodeIds, err := SharedNodeDAO.FindAllNodeIdsMatch(tx, clusterId, true, configutils.BoolStateYes)
if err != nil { if err != nil {
return err return err
@@ -140,7 +159,7 @@ func (this *NodeTaskDAO) ExtractNodeClusterTask(tx *dbs.Tx, clusterId int64, ser
var version = time.Now().UnixNano() var version = time.Now().UnixNano()
for _, nodeId := range nodeIds { 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 { if err != nil {
return err return err
} }
@@ -169,11 +188,11 @@ func (this *NodeTaskDAO) ExtractAllClusterTasks(tx *dbs.Tx, role string) error {
return err return err
} }
for _, one := range ones { for _, one := range ones {
clusterId := int64(one.(*NodeTask).ClusterId) var clusterId = int64(one.(*NodeTask).ClusterId)
switch role { switch role {
case nodeconfigs.NodeRoleNode: case nodeconfigs.NodeRoleNode:
var nodeTask = one.(*NodeTask) 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 { if err != nil {
return err return err
} }

View File

@@ -6,7 +6,8 @@ type NodeTask struct {
Role string `field:"role"` // 节点角色 Role string `field:"role"` // 节点角色
NodeId uint32 `field:"nodeId"` // 节点ID NodeId uint32 `field:"nodeId"` // 节点ID
ClusterId uint32 `field:"clusterId"` // 集群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"` // 任务类型 Type string `field:"type"` // 任务类型
UniqueId string `field:"uniqueId"` // 唯一IDnodeId@type UniqueId string `field:"uniqueId"` // 唯一IDnodeId@type
UpdatedAt uint64 `field:"updatedAt"` // 修改时间 UpdatedAt uint64 `field:"updatedAt"` // 修改时间
@@ -18,19 +19,20 @@ type NodeTask struct {
} }
type NodeTaskOperator struct { type NodeTaskOperator struct {
Id interface{} // ID Id any // ID
Role interface{} // 节点角色 Role any // 节点角色
NodeId interface{} // 节点ID NodeId any // 节点ID
ClusterId interface{} // 集群ID ClusterId any // 集群ID
ServerId interface{} // 服务ID ServerId any // 服务ID
Type interface{} // 任务类型 UserId any // 用户ID
UniqueId interface{} // 唯一IDnodeId@type Type any // 任务类型
UpdatedAt interface{} // 修改时间 UniqueId any // 唯一IDnodeId@type
IsDone interface{} // 是否已完成 UpdatedAt any // 修改时间
IsOk interface{} // 是否已完成 IsDone any // 是否已完成
Error interface{} // 错误信息 IsOk any // 是否已完成
IsNotified interface{} // 是否已通知更新 Error any // 错误信息
Version interface{} // 版本 IsNotified any // 是否已通知更新
Version any // 版本
} }
func NewNodeTaskOperator() *NodeTaskOperator { func NewNodeTaskOperator() *NodeTaskOperator {

View File

@@ -149,5 +149,5 @@ func (this *NSClusterDAO) CountAllClustersWithSSLPolicyIds(tx *dbs.Tx, sslPolicy
// NotifyUpdate 通知更改 // NotifyUpdate 通知更改
func (this *NSClusterDAO) NotifyUpdate(tx *dbs.Tx, clusterId int64) error { 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)
} }

View File

@@ -1761,11 +1761,11 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
} }
if oldClusterId > 0 { 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 { if err != nil {
return err return err
} }
err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, NodeTaskTypeIPItemChanged) err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, oldClusterId, 0, 0, NodeTaskTypeIPItemChanged)
if err != nil { if err != nil {
return err return err
} }
@@ -1776,11 +1776,11 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
} }
if newClusterId > 0 { 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 { if err != nil {
return err return err
} }
err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, NodeTaskTypeIPItemChanged) err = SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, newClusterId, 0, 0, NodeTaskTypeIPItemChanged)
if err != nil { if err != nil {
return err return err
} }
@@ -1793,8 +1793,8 @@ func (this *ServerDAO) UpdateUserServersClusterId(tx *dbs.Tx, userId int64, oldC
return err return err
} }
// FindAllEnabledServersWithUserId 查找用户的所有服务 // FindAllBasicServersWithUserId 查找用户的所有服务的基础信息
func (this *ServerDAO) FindAllEnabledServersWithUserId(tx *dbs.Tx, userId int64) (result []*Server, err error) { func (this *ServerDAO) FindAllBasicServersWithUserId(tx *dbs.Tx, userId int64) (result []*Server, err error) {
_, err = this.Query(tx). _, err = this.Query(tx).
Result("id", "serverNames", "name", "isOn", "type", "groupIds", "clusterId", "dnsName"). Result("id", "serverNames", "name", "isOn", "type", "groupIds", "clusterId", "dnsName").
State(ServerStateEnabled). State(ServerStateEnabled).
@@ -1805,6 +1805,18 @@ func (this *ServerDAO) FindAllEnabledServersWithUserId(tx *dbs.Tx, userId int64)
return 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 // FindEnabledServerIdWithWebId 根据WebId查找ServerId
func (this *ServerDAO) FindEnabledServerIdWithWebId(tx *dbs.Tx, webId int64) (serverId int64, err error) { func (this *ServerDAO) FindEnabledServerIdWithWebId(tx *dbs.Tx, webId int64) (serverId int64, err error) {
if webId <= 0 { if webId <= 0 {
@@ -2652,7 +2664,7 @@ func (this *ServerDAO) NotifyUpdate(tx *dbs.Tx, serverId int64) error {
if clusterId == 0 { if clusterId == 0 {
return nil return nil
} }
return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, serverId, NodeTaskTypeConfigChanged) return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, serverId, NodeTaskTypeConfigChanged)
} }
// NotifyClusterUpdate 同步指定的集群 // NotifyClusterUpdate 同步指定的集群
@@ -2660,7 +2672,7 @@ func (this *ServerDAO) NotifyClusterUpdate(tx *dbs.Tx, clusterId, serverId int64
if clusterId <= 0 { if clusterId <= 0 {
return nil return nil
} }
return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, serverId, NodeTaskTypeConfigChanged) return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, serverId, NodeTaskTypeConfigChanged)
} }
// NotifyDNSUpdate 通知当前集群DNS更新 // NotifyDNSUpdate 通知当前集群DNS更新

View File

@@ -5,6 +5,7 @@ import (
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils" dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
"github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
@@ -52,9 +53,13 @@ func (this *UserDAO) EnableUser(tx *dbs.Tx, userId int64) error {
Pk(userId). Pk(userId).
Set("state", UserStateEnabled). Set("state", UserStateEnabled).
Update() Update()
if err != nil {
return err return err
} }
return this.NotifyUpdate(tx, userId)
}
// DisableUser 禁用条目 // DisableUser 禁用条目
func (this *UserDAO) DisableUser(tx *dbs.Tx, userId int64) error { func (this *UserDAO) DisableUser(tx *dbs.Tx, userId int64) error {
if userId <= 0 { if userId <= 0 {
@@ -65,9 +70,13 @@ func (this *UserDAO) DisableUser(tx *dbs.Tx, userId int64) error {
Pk(userId). Pk(userId).
Set("state", UserStateDisabled). Set("state", UserStateDisabled).
Update() Update()
if err != nil {
return err return err
} }
return this.NotifyUpdate(tx, userId)
}
// FindEnabledUser 查找启用的用户 // FindEnabledUser 查找启用的用户
func (this *UserDAO) FindEnabledUser(tx *dbs.Tx, userId int64, cacheMap *utils.CacheMap) (*User, error) { func (this *UserDAO) FindEnabledUser(tx *dbs.Tx, userId int64, cacheMap *utils.CacheMap) (*User, error) {
if cacheMap == nil { if cacheMap == nil {
@@ -190,15 +199,6 @@ func (this *UserDAO) UpdateUser(tx *dbs.Tx, userId int64, username string, passw
return errors.New("invalid userId") return errors.New("invalid userId")
} }
// 是否启用变化
oldIsOn, err := this.Query(tx).
Pk(userId).
Result("isOn").
FindBoolCol()
if err != nil {
return err
}
var op = NewUserOperator() var op = NewUserOperator()
op.Id = userId op.Id = userId
op.Username = username op.Username = username
@@ -212,16 +212,12 @@ func (this *UserDAO) UpdateUser(tx *dbs.Tx, userId int64, username string, passw
op.Remark = remark op.Remark = remark
op.ClusterId = nodeClusterId op.ClusterId = nodeClusterId
op.IsOn = isOn op.IsOn = isOn
err = this.Save(tx, op) err := this.Save(tx, op)
if err != nil { if err != nil {
return err return err
} }
if oldIsOn != isOn { return this.NotifyUpdate(tx, userId)
return SharedServerDAO.NotifyUserClustersChange(tx, userId)
}
return nil
} }
// UpdateUserInfo 修改用户基本信息 // UpdateUserInfo 修改用户基本信息
@@ -529,5 +525,65 @@ func (this *UserDAO) UpdateUserIsVerified(tx *dbs.Tx, userId int64, isRejected b
op.IsRejected = isRejected op.IsRejected = isRejected
op.RejectReason = rejectReason op.RejectReason = rejectReason
op.IsVerified = true 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
} }

View 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
}

View File

@@ -1,6 +1,7 @@
package models package models_test
import ( import (
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
_ "github.com/iwind/TeaGo/bootstrap" _ "github.com/iwind/TeaGo/bootstrap"
@@ -9,7 +10,7 @@ import (
) )
func TestUserDAO_UpdateUserFeatures(t *testing.T) { func TestUserDAO_UpdateUserFeatures(t *testing.T) {
var dao = NewUserDAO() var dao = models.NewUserDAO()
var tx *dbs.Tx var tx *dbs.Tx
err := dao.UpdateUsersFeatures(tx, []string{ err := dao.UpdateUsersFeatures(tx, []string{
userconfigs.UserFeatureCodeServerACME, userconfigs.UserFeatureCodeServerACME,
@@ -18,3 +19,17 @@ func TestUserDAO_UpdateUserFeatures(t *testing.T) {
t.Fatal(err) 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)
}
}

View File

@@ -30,6 +30,7 @@ type User struct {
Modules dbs.JSON `field:"modules"` // 用户模块 Modules dbs.JSON `field:"modules"` // 用户模块
PriceType string `field:"priceType"` // 计费类型traffic|bandwidth PriceType string `field:"priceType"` // 计费类型traffic|bandwidth
PricePeriod string `field:"pricePeriod"` // 结算周期 PricePeriod string `field:"pricePeriod"` // 结算周期
ServersEnabled uint8 `field:"serversEnabled"` // 是否禁用所有服务
} }
type UserOperator struct { type UserOperator struct {
@@ -59,6 +60,7 @@ type UserOperator struct {
Modules any // 用户模块 Modules any // 用户模块
PriceType any // 计费类型traffic|bandwidth PriceType any // 计费类型traffic|bandwidth
PricePeriod any // 结算周期 PricePeriod any // 结算周期
ServersEnabled any // 是否禁用所有服务
} }
func NewUserOperator() *UserOperator { func NewUserOperator() *UserOperator {

View File

@@ -40,6 +40,7 @@ func (this *NodeTaskService) FindNodeTasks(ctx context.Context, req *pb.FindNode
Version: int64(task.Version), Version: int64(task.Version),
IsPrimary: primaryNodeId == nodeId, IsPrimary: primaryNodeId == nodeId,
ServerId: int64(task.ServerId), 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, Error: task.Error,
UpdatedAt: int64(task.UpdatedAt), UpdatedAt: int64(task.UpdatedAt),
ServerId: int64(task.ServerId), ServerId: int64(task.ServerId),
UserId: int64(task.UserId),
Node: &pb.Node{ Node: &pb.Node{
Id: int64(task.NodeId), Id: int64(task.NodeId),
Name: nodeName, Name: nodeName,
@@ -264,6 +266,7 @@ func (this *NodeTaskService) FindNotifyingNodeTasks(ctx context.Context, req *pb
UpdatedAt: int64(task.UpdatedAt), UpdatedAt: int64(task.UpdatedAt),
Node: &pb.Node{Id: int64(task.NodeId)}, Node: &pb.Node{Id: int64(task.NodeId)},
ServerId: int64(task.ServerId), ServerId: int64(task.ServerId),
UserId: int64(task.UserId),
}) })
} }

View File

@@ -1442,7 +1442,7 @@ func (this *ServerService) FindAllEnabledServerNamesWithUserId(ctx context.Conte
req.UserId = userId req.UserId = userId
} }
servers, err := models.SharedServerDAO.FindAllEnabledServersWithUserId(tx, req.UserId) servers, err := models.SharedServerDAO.FindAllBasicServersWithUserId(tx, req.UserId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1478,7 +1478,7 @@ func (this *ServerService) FindAllUserServers(ctx context.Context, req *pb.FindA
} }
var tx = this.NullTx() var tx = this.NullTx()
servers, err := models.SharedServerDAO.FindAllEnabledServersWithUserId(tx, req.UserId) servers, err := models.SharedServerDAO.FindAllBasicServersWithUserId(tx, req.UserId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1498,6 +1498,39 @@ func (this *ServerService) FindAllUserServers(ctx context.Context, req *pb.FindA
}, nil }, 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 查找服务基本信息 // FindEnabledUserServerBasic 查找服务基本信息
func (this *ServerService) FindEnabledUserServerBasic(ctx context.Context, req *pb.FindEnabledUserServerBasicRequest) (*pb.FindEnabledUserServerBasicResponse, error) { func (this *ServerService) FindEnabledUserServerBasic(ctx context.Context, req *pb.FindEnabledUserServerBasicRequest) (*pb.FindEnabledUserServerBasicResponse, error) {
_, userId, err := this.ValidateAdminAndUser(ctx, true) _, userId, err := this.ValidateAdminAndUser(ctx, true)

View File

@@ -762,3 +762,40 @@ func (this *UserService) CheckUserOTPWithUsername(ctx context.Context, req *pb.C
} }
return &pb.CheckUserOTPWithUsernameResponse{RequireOTP: otpIsOn}, nil 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