github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/admin/node.go (about) 1 package admin 2 3 import ( 4 model "github.com/cloudreve/Cloudreve/v3/models" 5 "github.com/cloudreve/Cloudreve/v3/pkg/cluster" 6 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 7 "strings" 8 ) 9 10 // AddNodeService 节点添加服务 11 type AddNodeService struct { 12 Node model.Node `json:"node" binding:"required"` 13 } 14 15 // Add 添加节点 16 func (service *AddNodeService) Add() serializer.Response { 17 if service.Node.ID > 0 { 18 if err := model.DB.Save(&service.Node).Error; err != nil { 19 return serializer.DBErr("Failed to save node record", err) 20 } 21 } else { 22 if err := model.DB.Create(&service.Node).Error; err != nil { 23 return serializer.DBErr("Failed to create node record", err) 24 } 25 } 26 27 if service.Node.Status == model.NodeActive { 28 cluster.Default.Add(&service.Node) 29 } 30 31 return serializer.Response{Data: service.Node.ID} 32 } 33 34 // Nodes 列出从机节点 35 func (service *AdminListService) Nodes() serializer.Response { 36 var res []model.Node 37 total := 0 38 39 tx := model.DB.Model(&model.Node{}) 40 if service.OrderBy != "" { 41 tx = tx.Order(service.OrderBy) 42 } 43 44 for k, v := range service.Conditions { 45 tx = tx.Where(k+" = ?", v) 46 } 47 48 if len(service.Searches) > 0 { 49 search := "" 50 for k, v := range service.Searches { 51 search += k + " like '%" + v + "%' OR " 52 } 53 search = strings.TrimSuffix(search, " OR ") 54 tx = tx.Where(search) 55 } 56 57 // 计算总数用于分页 58 tx.Count(&total) 59 60 // 查询记录 61 tx.Limit(service.PageSize).Offset((service.Page - 1) * service.PageSize).Find(&res) 62 63 isActive := make(map[uint]bool) 64 for i := 0; i < len(res); i++ { 65 if node := cluster.Default.GetNodeByID(res[i].ID); node != nil { 66 isActive[res[i].ID] = node.IsActive() 67 } 68 } 69 70 return serializer.Response{Data: map[string]interface{}{ 71 "total": total, 72 "items": res, 73 "active": isActive, 74 }} 75 } 76 77 // ToggleNodeService 开关节点服务 78 type ToggleNodeService struct { 79 ID uint `uri:"id"` 80 Desired model.NodeStatus `uri:"desired"` 81 } 82 83 // Toggle 开关节点 84 func (service *ToggleNodeService) Toggle() serializer.Response { 85 node, err := model.GetNodeByID(service.ID) 86 if err != nil { 87 return serializer.DBErr("Node not found", err) 88 } 89 90 // 是否为系统节点 91 if node.ID <= 1 { 92 return serializer.Err(serializer.CodeInvalidActionOnSystemNode, "", err) 93 } 94 95 if err = node.SetStatus(service.Desired); err != nil { 96 return serializer.DBErr("Failed to change node status", err) 97 } 98 99 if service.Desired == model.NodeActive { 100 cluster.Default.Add(&node) 101 } else { 102 cluster.Default.Delete(node.ID) 103 } 104 105 return serializer.Response{} 106 } 107 108 // NodeService 节点ID服务 109 type NodeService struct { 110 ID uint `uri:"id" json:"id" binding:"required"` 111 } 112 113 // Delete 删除节点 114 func (service *NodeService) Delete() serializer.Response { 115 // 查找用户组 116 node, err := model.GetNodeByID(service.ID) 117 if err != nil { 118 return serializer.DBErr("Node record not found", err) 119 } 120 121 // 是否为系统节点 122 if node.ID <= 1 { 123 return serializer.Err(serializer.CodeInvalidActionOnSystemNode, "", err) 124 } 125 126 cluster.Default.Delete(node.ID) 127 if err := model.DB.Delete(&node).Error; err != nil { 128 return serializer.DBErr("Failed to delete node record", err) 129 } 130 131 return serializer.Response{} 132 } 133 134 // Get 获取节点详情 135 func (service *NodeService) Get() serializer.Response { 136 node, err := model.GetNodeByID(service.ID) 137 if err != nil { 138 return serializer.DBErr("Node not exist", err) 139 } 140 141 return serializer.Response{Data: node} 142 }