feat(api): implement sorting functionality for nodes and servers
This commit is contained in:
@@ -3,6 +3,7 @@ package node
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -35,3 +36,47 @@ func (n *Node) BeforeCreate(tx *gorm.DB) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *Node) BeforeDelete(tx *gorm.DB) error {
|
||||
if err := tx.Exec("UPDATE `nodes` SET sort = sort - 1 WHERE sort > ?", n.Sort).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *Node) BeforeUpdate(tx *gorm.DB) error {
|
||||
var count int64
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").Model(&Server{}).
|
||||
Where("sort = ? AND id != ?", n.Sort, n.Id).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count > 1 {
|
||||
// reorder sort
|
||||
if err := reorderSortWithNode(tx); err != nil {
|
||||
logger.Errorf("[Server] BeforeUpdate reorderSort error: %v", err.Error())
|
||||
return err
|
||||
}
|
||||
// get max sort
|
||||
var maxSort int
|
||||
if err := tx.Model(&Server{}).Select("MAX(sort)").Scan(&maxSort).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
n.Sort = maxSort + 1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func reorderSortWithNode(tx *gorm.DB) error {
|
||||
var nodes []Node
|
||||
if err := tx.Order("sort, id").Find(&nodes).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for i, node := range nodes {
|
||||
if node.Sort != i+1 {
|
||||
if err := tx.Exec("UPDATE `nodes` SET sort = ? WHERE id = ?", i+1, node.Id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
"github.com/pkg/errors"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@@ -37,6 +38,35 @@ func (m *Server) BeforeCreate(tx *gorm.DB) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Server) BeforeDelete(tx *gorm.DB) error {
|
||||
if err := tx.Exec("UPDATE `servers` SET sort = sort - 1 WHERE sort > ?", m.Sort).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Server) BeforeUpdate(tx *gorm.DB) error {
|
||||
var count int64
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").Model(&Server{}).
|
||||
Where("sort = ? AND id != ?", m.Sort, m.Id).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count > 1 {
|
||||
// reorder sort
|
||||
if err := reorderSortWithServer(tx); err != nil {
|
||||
logger.Errorf("[Server] BeforeUpdate reorderSort error: %v", err.Error())
|
||||
return err
|
||||
}
|
||||
// get max sort
|
||||
var maxSort int
|
||||
if err := tx.Model(&Server{}).Select("MAX(sort)").Scan(&maxSort).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
m.Sort = maxSort + 1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalProtocols Marshal server protocols to json
|
||||
func (m *Server) MarshalProtocols(list []Protocol) error {
|
||||
var validate = make(map[string]bool)
|
||||
@@ -118,3 +148,18 @@ func (m *Protocol) Unmarshal(data []byte) error {
|
||||
}
|
||||
return json.Unmarshal(data, &aux)
|
||||
}
|
||||
|
||||
func reorderSortWithServer(tx *gorm.DB) error {
|
||||
var servers []Server
|
||||
if err := tx.Order("sort, id").Find(&servers).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for i, server := range servers {
|
||||
if server.Sort != i+1 {
|
||||
if err := tx.Exec("UPDATE `servers` SET sort = ? WHERE id = ?", i+1, server.Id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user