// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . //go:build plus package models import ( "encoding/json" "errors" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/maps" ) // CreateAction 添加动作 func (this *NodeActionDAO) CreateAction(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64, condsConfig *nodeconfigs.NodeActionCondsConfig, actionConfig *nodeconfigs.NodeActionConfig, duration *shared.TimeDuration) (int64, error) { var op = NewNodeActionOperator() op.Role = role op.NodeId = nodeId condsJSON, err := json.Marshal(condsConfig) if err != nil { return 0, err } op.Conds = condsJSON actionJSON, err := json.Marshal(actionConfig) if err != nil { return 0, err } op.Action = actionJSON if duration == nil || duration.Count <= 0 { duration = &shared.TimeDuration{ Count: 1, Unit: shared.TimeDurationUnitHour, } } durationJSON, err := json.Marshal(duration) if err != nil { return 0, err } op.Duration = durationJSON op.IsOn = true op.State = NodeActionStateEnabled return this.SaveInt64(tx, op) } // DuplicateNodeAction 复制动作 func (this *NodeActionDAO) DuplicateNodeAction(tx *dbs.Tx, action *NodeAction, role nodeconfigs.NodeRole, newNodeId int64) error { if action == nil { return errors.New("'action' should not be nil") } var op = NewNodeActionOperator() op.Role = role op.NodeId = newNodeId op.IsOn = action.IsOn if len(action.Conds) > 0 { op.Conds = action.Conds } if len(action.Action) > 0 { op.Action = action.Action } if len(action.Duration) > 0 { op.Duration = action.Duration } op.Order = action.Order op.State = action.State return this.Save(tx, op) } // UpdateAction 修改动作 func (this *NodeActionDAO) UpdateAction(tx *dbs.Tx, actionId int64, condsConfig *nodeconfigs.NodeActionCondsConfig, actionConfig *nodeconfigs.NodeActionConfig, duration *shared.TimeDuration, isOn bool) error { if actionId <= 0 { return errors.New("invalid actionId") } var op = NewNodeActionOperator() op.Id = actionId condsJSON, err := json.Marshal(condsConfig) if err != nil { return err } op.Conds = condsJSON actionJSON, err := json.Marshal(actionConfig) if err != nil { return err } op.Action = actionJSON if duration == nil || duration.Count <= 0 { duration = &shared.TimeDuration{ Count: 1, Unit: shared.TimeDurationUnitHour, } } durationJSON, err := json.Marshal(duration) if err != nil { return err } op.Duration = durationJSON op.IsOn = isOn return this.Save(tx, op) } // DisableAllNodeActions 禁用单个节点所有动作 func (this *NodeActionDAO) DisableAllNodeActions(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64) error { return this.Query(tx). Attr("role", role). Attr("nodeId", nodeId). State(NodeStateEnabled). Set("state", NodeStateDisabled). UpdateQuickly() } // FindAllNodeActions 列出节点所有动作 func (this *NodeActionDAO) FindAllNodeActions(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64) (result []*NodeAction, err error) { _, err = this.Query(tx). State(NodeActionStateEnabled). Attr("role", role). Attr("nodeId", nodeId). Desc("order"). AscPk(). Slice(&result). FindAll() return } // FindAllAvailableNodeActionsWithParam 根据参数查询节点相关动作 // TODO 可能需要增加缓存以便于不用每次都查询数据库 func (this *NodeActionDAO) FindAllAvailableNodeActionsWithParam(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64, param nodeconfigs.NodeActionParam) (result []*NodeAction, err error) { _, err = this.Query(tx). State(NodeActionStateEnabled). Attr("role", role). Attr("nodeId", nodeId). Attr("isOn", true). Where("JSON_CONTAINS(conds, :paramQuery, '$.conds')"). Param("paramQuery", maps.Map{ "param": param, }.AsJSON()). Desc("order"). AscPk(). Slice(&result). FindAll() return } // CountNodeActions 计算节点动作数量 func (this *NodeActionDAO) CountNodeActions(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64) (int64, error) { return this.Query(tx). Attr("nodeId", nodeId). Attr("role", role). State(NodeActionStateEnabled). Count() } // UpdateNodeActionOrders 设置动作顺序 func (this *NodeActionDAO) UpdateNodeActionOrders(tx *dbs.Tx, actionIds []int64) error { var maxOrder = len(actionIds) + 1 for index, actionId := range actionIds { err := this.Query(tx). Pk(actionId). Set("order", maxOrder-index). UpdateQuickly() if err != nil { return err } } return nil }