diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 174e0d9..0b8103f 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -29,38 +29,40 @@ const ( // commands sent to web clients const ( - SentCmdInitUserSocketConnection = 1 - SentCmdUpdateConnectedUsers = 2 - SentCmdNewGroupTaskStarted = 3 - SentCmdNewGroupTaskStep = 4 - SentCmdUpdateGroupTaskStep = 5 - SentCmdUpdateGroupTask = 6 - SentCmdReloadingGroupTasks = 7 - SentCmdGroupTasksReloaded = 8 - SentCmdUpdateUserSessions = 9 - SentCmdUpdateAllUsersUserAvatar = 10 - SentCmdNewScanner = 11 - SentCmdDeleteScanner = 12 - SentCmdUpdateScannerUsedBy = 13 - SentCmdScanResult = 14 - SentCmdUpdateScannerLastUsed = 15 - SentCmdTaskLocked = 16 - SentCmdTaskUnlocked = 17 - SentCmdUserProfileUpdated = 18 - SentCmdAdminAreaNewRoleCreated = 19 - SentCmdAdminAreaRoleUpdated = 20 + SentCmdInitUserSocketConnection = 1 + SentCmdUpdateConnectedUsers = 2 + SentCmdNewGroupTaskStarted = 3 + SentCmdNewGroupTaskStep = 4 + SentCmdUpdateGroupTaskStep = 5 + SentCmdUpdateGroupTask = 6 + SentCmdReloadingGroupTasks = 7 + SentCmdGroupTasksReloaded = 8 + SentCmdUpdateUserSessions = 9 + SentCmdUpdateAllUsersUserAvatar = 10 + SentCmdNewScanner = 11 + SentCmdDeleteScanner = 12 + SentCmdUpdateScannerUsedBy = 13 + SentCmdScanResult = 14 + SentCmdUpdateScannerLastUsed = 15 + SentCmdTaskLocked = 16 + SentCmdTaskUnlocked = 17 + SentCmdUserProfileUpdated = 18 + SentCmdAdminAreaNewRoleCreated = 19 + SentCmdAdminAreaRoleUpdated = 20 + SentCmdAdminAreaUpdateRoleSortingOrder = 21 ) // commands received from web clients const ( - ReceivedCmdStartGroupTasks = 1 - ReceivedCmdTaskFailedTryAgainRunTaskStep = 2 - ReceivedCmdTaskContinueTaskStep = 3 - ReceivedCmdReloadGroupTasks = 4 - ReceivedCmdTaskLocking = 5 - ReceivedCmdUpdateUserProfile = 6 - ReceivedCmdAdminAreaCreateNewRole = 7 - ReceivedCmdAdminAreaUpdateRole = 8 + ReceivedCmdStartGroupTasks = 1 + ReceivedCmdTaskFailedTryAgainRunTaskStep = 2 + ReceivedCmdTaskContinueTaskStep = 3 + ReceivedCmdReloadGroupTasks = 4 + ReceivedCmdTaskLocking = 5 + ReceivedCmdUpdateUserProfile = 6 + ReceivedCmdAdminAreaCreateNewRole = 7 + ReceivedCmdAdminAreaUpdateRole = 8 + ReceivedCmdAdminAreaUpdateRoleSortingOrder = 9 ) const ( diff --git a/socketclients/socketclients.go b/socketclients/socketclients.go index 5afd4f8..1315c43 100644 --- a/socketclients/socketclients.go +++ b/socketclients/socketclients.go @@ -11,6 +11,7 @@ import ( "github.com/gofiber/websocket/v2" "github.com/rs/zerolog/log" "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" ) func BroadcastMessage(sendSocketMessage structs.SendSocketMessage) { @@ -298,7 +299,7 @@ func UpdateUserProfile(conn *websocket.Conn, changes map[string]interface{}) { func isValueLenValid(value string, min int, max int) bool { l := len(value) - return l > min && l < max + return l >= min && l <= max } func GetAllRoles() []structs.Role { @@ -471,3 +472,62 @@ func AdminAreaUpdateRole(sessionId string, body map[string]interface{}) { }, }) } + +func MoveRoleToSortingOrder(body map[string]interface{}) { + roleId := body["RoleId"].(string) + direction := int(body["Direction"].(float64)) + + var role structs.Role + + if err := database.DB.First(&role, "id = ?", roleId).Error; err != nil { + log.Error().Msgf("Failed to get role %s", err.Error()) + return + } + + currentSortingOrder := role.SortingOrder + var newSortingOrder int + + if direction == 1 { + newSortingOrder = currentSortingOrder + 1 + + log.Debug().Msgf("up %v %v", newSortingOrder, currentSortingOrder) + + if newSortingOrder > database.GetRoleSortingOrder()-1 { + return + } + } else { + newSortingOrder = currentSortingOrder - 1 + + if newSortingOrder < 0 { + return + } + } + + // If the new sorting order number is smaller than the current sorting order number, + // increase the sorting order numbers of all roles between the new and current sorting order by 1 + if newSortingOrder < currentSortingOrder { + if err := database.DB.Model(&structs.Role{}).Where("sorting_order >= ? AND sorting_order < ?", newSortingOrder, currentSortingOrder).Update("sorting_order", gorm.Expr("sorting_order + 1")).Error; err != nil { + log.Error().Msgf("Failed to update sorting order upwards %s", err.Error()) + return + } + } else if newSortingOrder > currentSortingOrder { + // If the new sorting order number is larger than the current sorting order number, + // decrease the sorting order numbers of all roles between the current and new sorting order by 1. + if err := database.DB.Model(&structs.Role{}).Where("sorting_order > ? AND sorting_order <= ?", currentSortingOrder, newSortingOrder).Update("sorting_order", gorm.Expr("sorting_order - 1")).Error; err != nil { + log.Error().Msgf("Failed to update sorting order downwards %s", err.Error()) + return + } + } + + // Update the sorting order number of the moved role + if err := database.DB.Model(&role).Update("sorting_order", newSortingOrder).Error; err != nil { + log.Debug().Msgf("Failed to update sorting order %s", err.Error()) + return + } + + // TODO: check permissions + BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdAdminAreaUpdateRoleSortingOrder, + Body: body, + }) +} diff --git a/socketserver/hub.go b/socketserver/hub.go index 31b50e0..2438c39 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -218,6 +218,9 @@ func RunHub() { case utils.ReceivedCmdAdminAreaUpdateRole: socketclients.AdminAreaUpdateRole(data.Conn.Locals("sessionId").(string), receivedMessage.Body) break + case utils.ReceivedCmdAdminAreaUpdateRoleSortingOrder: + socketclients.MoveRoleToSortingOrder(receivedMessage.Body) + break default: log.Error().Msgf("Received unknown message: %v", receivedMessage) break