123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package cluster
- import (
- "net/http"
- "github.com/0xJacky/Nginx-UI/model"
- "github.com/gin-gonic/gin"
- "github.com/samber/lo"
- "github.com/uozi-tech/cosy"
- "gorm.io/gorm"
- )
- type APIRespEnvGroup struct {
- model.EnvGroup
- SyncNodes []*model.Environment `json:"sync_nodes,omitempty" gorm:"-"`
- }
- func GetGroup(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).
- SetTransformer(func(m *model.EnvGroup) any {
- db := cosy.UseDB(c)
- var nodes []*model.Environment
- if len(m.SyncNodeIds) > 0 {
- db.Model(&model.Environment{}).
- Where("id IN (?)", m.SyncNodeIds).
- Find(&nodes)
- }
- return &APIRespEnvGroup{
- EnvGroup: *m,
- SyncNodes: nodes,
- }
- }).
- Get()
- }
- func GetGroupList(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).GormScope(func(tx *gorm.DB) *gorm.DB {
- return tx.Order("order_id ASC")
- }).
- SetScan(func(tx *gorm.DB) any {
- var groups []*APIRespEnvGroup
- var nodeIDs []uint64
- tx.Find(&groups)
- for _, group := range groups {
- nodeIDs = append(nodeIDs, group.SyncNodeIds...)
- }
- var nodes []*model.Environment
- nodeIDs = lo.Uniq(nodeIDs)
- if len(nodeIDs) > 0 {
- db := cosy.UseDB(c)
- db.Model(&model.Environment{}).
- Where("id IN (?)", nodeIDs).
- Find(&nodes)
- }
- nodeMap := lo.SliceToMap(nodes, func(node *model.Environment) (uint64, *model.Environment) {
- return node.ID, node
- })
- for _, group := range groups {
- for _, nodeID := range group.SyncNodeIds {
- if node, ok := nodeMap[nodeID]; ok {
- group.SyncNodes = append(group.SyncNodes, node)
- }
- }
- }
- return groups
- }).
- PagingList()
- }
- func ReloadNginx(c *gin.Context) {
- var json struct {
- NodeIDs []uint64 `json:"node_ids" binding:"required"`
- }
- if !cosy.BindAndValid(c, &json) {
- return
- }
- go syncReload(json.NodeIDs)
- c.JSON(http.StatusOK, gin.H{
- "message": "ok",
- })
- }
- func RestartNginx(c *gin.Context) {
- var json struct {
- NodeIDs []uint64 `json:"node_ids" binding:"required"`
- }
- if !cosy.BindAndValid(c, &json) {
- return
- }
- go syncRestart(json.NodeIDs)
- c.JSON(http.StatusOK, gin.H{
- "message": "ok",
- })
- }
- func AddGroup(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).
- SetValidRules(gin.H{
- "name": "required",
- "sync_node_ids": "omitempty",
- "post_sync_action": "omitempty,oneof=" + model.PostSyncActionNone + " " + model.PostSyncActionReloadNginx,
- "upstream_test_type": "omitempty,oneof=" + model.UpstreamTestLocal + " " + model.UpstreamTestRemote + " " + model.UpstreamTestMirror,
- }).
- Create()
- }
- func ModifyGroup(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).
- SetValidRules(gin.H{
- "name": "required",
- "sync_node_ids": "omitempty",
- "post_sync_action": "omitempty,oneof=" + model.PostSyncActionNone + " " + model.PostSyncActionReloadNginx,
- "upstream_test_type": "omitempty,oneof=" + model.UpstreamTestLocal + " " + model.UpstreamTestRemote + " " + model.UpstreamTestMirror,
- }).
- Modify()
- }
- func DeleteGroup(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).Destroy()
- }
- func RecoverGroup(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).Recover()
- }
- func UpdateGroupsOrder(c *gin.Context) {
- cosy.Core[model.EnvGroup](c).UpdateOrder()
- }
|