diff --git a/main b/main index 38f6796..ffd146a 100755 Binary files a/main and b/main differ diff --git a/modules/structs/adminarea.go b/modules/structs/adminarea.go index 4c452c7..d2a93d1 100644 --- a/modules/structs/adminarea.go +++ b/modules/structs/adminarea.go @@ -4,4 +4,10 @@ package structs type AdminAreaRolesResponse struct { Roles []Role RolesPermissions []RolePermissions + Users []AdminAreaUserInfo +} + +type AdminAreaUserInfo struct { + Id string + RoleId string } diff --git a/modules/structs/user.go b/modules/structs/user.go index e1e96fd..6e14827 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -63,7 +63,7 @@ type UserInfoResponse struct { Avatar string Permissions []string AvailableCategories []string - Users []AllUsers + Users []UserShortInfoResponse TotalNotifications int } @@ -73,3 +73,10 @@ type UserProfileResponse struct { Sessions []UserSessionSocket ApiKeys []UserApiKey } + +// swagger:model UserShortInfoResponse +type UserShortInfoResponse struct { + Id string + Avatar string + Username string +} diff --git a/modules/structs/users.go b/modules/structs/users.go index 39abfc8..3c5f2fc 100644 --- a/modules/structs/users.go +++ b/modules/structs/users.go @@ -4,5 +4,12 @@ package structs type UsersResponse struct { RoleId string Users []AllUsers - Roles []Role + Roles []UserRoleShortInfo +} + +type UserRoleShortInfo struct { + Id string + Master bool + DisplayName string + SortingOrder int } diff --git a/public/swagger/swagger.json b/public/swagger/swagger.json index 55462de..2690180 100644 --- a/public/swagger/swagger.json +++ b/public/swagger/swagger.json @@ -434,6 +434,11 @@ "description": "You can create a new api key in your user profile", "name": "X-Api-Key", "in": "header" + }, + { + "description": "Page number", + "name": "page", + "in": "query" } ], "responses": { @@ -639,7 +644,7 @@ "200": { "description": "User info", "schema": { - "$ref": "#/definitions/UserInfoResponse" + "$ref": "#/definitions/UserShortInfoResponse" } }, "401": { @@ -811,6 +816,24 @@ "items": { "$ref": "#/definitions/RolePermissions" } + }, + "Users": { + "type": "array", + "items": { + "$ref": "#/definitions/AdminAreaUserInfo" + } + } + }, + "x-go-package": "jannex/admin-dashboard-backend/modules/structs" + }, + "AdminAreaUserInfo": { + "type": "object", + "properties": { + "Id": { + "type": "string" + }, + "RoleId": { + "type": "string" } }, "x-go-package": "jannex/admin-dashboard-backend/modules/structs" @@ -1001,6 +1024,9 @@ "type": "string", "x-go-name": "DisplayName" }, + "options": { + "x-go-name": "Options" + }, "parameterName": { "type": "string", "x-go-name": "ParameterName" @@ -1201,6 +1227,10 @@ "items": { "$ref": "#/definitions/Notification" } + }, + "TotalPages": { + "type": "integer", + "format": "int64" } }, "x-go-package": "jannex/admin-dashboard-backend/modules/structs" @@ -1294,6 +1324,9 @@ "type": "boolean", "x-go-name": "Global" }, + "options": { + "x-go-name": "Options" + }, "parameterName": { "type": "string", "x-go-name": "ParameterName" @@ -1338,7 +1371,7 @@ "UserInfoResponse": { "type": "object", "properties": { - "AvailableCategoryGroups": { + "AvailableCategories": { "type": "array", "items": { "type": "string" @@ -1366,7 +1399,7 @@ "Users": { "type": "array", "items": { - "$ref": "#/definitions/AllUsers" + "$ref": "#/definitions/UserShortInfoResponse" } } }, @@ -1414,6 +1447,25 @@ }, "x-go-package": "jannex/admin-dashboard-backend/modules/structs" }, + "UserRoleShortInfo": { + "type": "object", + "properties": { + "DisplayName": { + "type": "string" + }, + "Id": { + "type": "string" + }, + "Master": { + "type": "boolean" + }, + "SortingOrder": { + "type": "integer", + "format": "int64" + } + }, + "x-go-package": "jannex/admin-dashboard-backend/modules/structs" + }, "UserSessionSocket": { "type": "object", "properties": { @@ -1438,6 +1490,21 @@ }, "x-go-package": "jannex/admin-dashboard-backend/modules/structs" }, + "UserShortInfoResponse": { + "type": "object", + "properties": { + "Avatar": { + "type": "string" + }, + "Id": { + "type": "string" + }, + "Username": { + "type": "string" + } + }, + "x-go-package": "jannex/admin-dashboard-backend/modules/structs" + }, "UsersResponse": { "type": "object", "properties": { @@ -1447,7 +1514,7 @@ "Roles": { "type": "array", "items": { - "$ref": "#/definitions/Role" + "$ref": "#/definitions/UserRoleShortInfo" } }, "Users": { diff --git a/routers/router/api/v1/adminArea/roles.go b/routers/router/api/v1/adminArea/roles.go index 1dd8fb0..8d7b03b 100644 --- a/routers/router/api/v1/adminArea/roles.go +++ b/routers/router/api/v1/adminArea/roles.go @@ -1,6 +1,7 @@ package adminarea import ( + "jannex/admin-dashboard-backend/modules/database" "jannex/admin-dashboard-backend/modules/structs" "jannex/admin-dashboard-backend/modules/utils" "jannex/admin-dashboard-backend/socketclients" @@ -38,8 +39,13 @@ func GetRoles(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusUnauthorized) } + var users []structs.AdminAreaUserInfo + + database.DB.Model(&structs.User{}).Find(&users) + return c.JSON(structs.AdminAreaRolesResponse{ Roles: socketclients.GetAllRoles(), RolesPermissions: socketclients.GetAdminAreaRolesPermissions(), + Users: users, }) } diff --git a/routers/router/api/v1/user/user.go b/routers/router/api/v1/user/user.go index f307c05..bf4375e 100644 --- a/routers/router/api/v1/user/user.go +++ b/routers/router/api/v1/user/user.go @@ -25,7 +25,7 @@ func UserInfo(c *fiber.Ctx) error { // '200': // description: User info // schema: - // "$ref": "#/definitions/UserInfoResponse" + // "$ref": "#/definitions/UserShortInfoResponse" // '401': // description: No permissions // '500': @@ -38,13 +38,17 @@ func UserInfo(c *fiber.Ctx) error { categories := socketclients.GetAvailableCategories(userId) + var users []structs.UserShortInfoResponse + + database.DB.Model(&structs.User{}).Find(&users) + return c.JSON(structs.UserInfoResponse{ UserId: userId, Username: user.Username, Avatar: user.Avatar, Permissions: socketclients.GetPermissionsByRoleId(user.RoleId), AvailableCategories: categories, - Users: socketclients.GetAllUsers(), + Users: users, TotalNotifications: notification.GetTotalNotifications(userId), }) } diff --git a/routers/router/api/v1/users/users.go b/routers/router/api/v1/users/users.go index ef56c50..369ef1a 100644 --- a/routers/router/api/v1/users/users.go +++ b/routers/router/api/v1/users/users.go @@ -34,9 +34,13 @@ func GetUsers(c *fiber.Ctx) error { database.DB.Select("role_id").First(&user, "id = ?", c.Locals("userId").(string)) + var roles []structs.UserRoleShortInfo + + database.DB.Model(&structs.Role{}).Select("id, master, display_name, sorting_order").Find(&roles) + return c.JSON(structs.UsersResponse{ RoleId: user.RoleId, Users: socketclients.GetAllUsers(), - Roles: socketclients.GetAllRoles(), + Roles: roles, }) } diff --git a/socketclients/socketclients.go b/socketclients/socketclients.go index 388c281..a5e6535 100644 --- a/socketclients/socketclients.go +++ b/socketclients/socketclients.go @@ -57,6 +57,12 @@ func BroadcastMessageToTopicExceptUserSessionId(topic string, ignoreUserSessionI } } +func BroadcastMessageToTopicsExceptUserSessionId(topics []string, ignoreUserSessionId string, sendSocketMessage structs.SendSocketMessage) { + for _, topic := range topics { + BroadcastMessageToTopicExceptUserSessionId(topic, ignoreUserSessionId, sendSocketMessage) + } +} + func hasClientSubscribedToTopic(topic string, clientTopic string) bool { return clientTopic == topic || strings.HasPrefix(clientTopic, topic) } @@ -77,6 +83,12 @@ func BroadcastMessageToTopicExceptUserId(topic string, ignoreUserId string, send } } +func BroadcastMessageToTopicsExceptUserId(topics []string, ignoreUserId string, sendSocketMessage structs.SendSocketMessage) { + for _, topic := range topics { + BroadcastMessageToTopicExceptUserId(topic, ignoreUserId, sendSocketMessage) + } +} + func BroadcastMessageToUsersWithPermission(neededPermission string, sendSocketMessage structs.SendSocketMessage) { var rolePermissions []structs.RolePermission @@ -594,7 +606,8 @@ func AdminAreaUpdateRole(conn *websocket.Conn, body map[string]interface{}) { }, }) - BroadcastMessageToTopicExceptUserSessionId(utils.SubscribedTopicAdminAreaRoles, + BroadcastMessageToTopicsExceptUserSessionId( + []string{utils.SubscribedTopicAdminAreaRoles, utils.SubscribedTopicUsers}, sessionId, structs.SendSocketMessage{ Cmd: utils.SentCmdAdminAreaRoleUpdated, @@ -674,10 +687,12 @@ func AdminAreaMoveRoleToSortingOrder(conn *websocket.Conn, body map[string]inter return } - BroadcastMessageToTopic(utils.SubscribedTopicAdminAreaRoles, structs.SendSocketMessage{ - Cmd: utils.SentCmdAdminAreaUpdateRoleSortingOrder, - Body: body, - }) + BroadcastMessageToTopics( + []string{utils.SubscribedTopicAdminAreaRoles, utils.SubscribedTopicUsers}, + structs.SendSocketMessage{ + Cmd: utils.SentCmdAdminAreaUpdateRoleSortingOrder, + Body: body, + }) logger.AddSystemLog("User %s has changed the sorting order of role %s to %s", conn.Locals("userId").(string), roleId, strconv.Itoa(newSortingOrder)) @@ -725,7 +740,8 @@ func UpdateUserRole(conn *websocket.Conn, userId string, roleId string) { }, }) - BroadcastMessageToTopicExceptUserId(utils.SubscribedTopicUsers, + BroadcastMessageToTopicsExceptUserId( + []string{utils.SubscribedTopicUsers, utils.SubscribedTopicAdminAreaRoles}, userId, structs.SendSocketMessage{ Cmd: utils.SentCmdAllUsersUserRoleUpdated, Body: struct { @@ -858,22 +874,24 @@ func AllUsersCreateNewUser(conn *websocket.Conn, body map[string]interface{}) { database.DB.Create(&newUser) - BroadcastMessageToTopic(utils.SubscribedTopicUsers, structs.SendSocketMessage{ - Cmd: utils.SentCmdAllUsersNewUserCreated, - Body: struct { - Id string - Username string - RoleId string - ConnectionStatus uint8 - Deactivated bool - }{ - Id: newUser.Id, - Username: username, - RoleId: roleId, - ConnectionStatus: utils.ConnectionStateOffline, - Deactivated: false, - }, - }) + BroadcastMessageToTopics( + []string{utils.SubscribedTopicUsers, utils.SubscribedTopicAdminAreaRoles}, + structs.SendSocketMessage{ + Cmd: utils.SentCmdAllUsersNewUserCreated, + Body: struct { + Id string + Username string + RoleId string + ConnectionStatus uint8 + Deactivated bool + }{ + Id: newUser.Id, + Username: username, + RoleId: roleId, + ConnectionStatus: utils.ConnectionStateOffline, + Deactivated: false, + }, + }) logger.AddSystemLog("User %s has created the user %s with the assigned role %s", conn.Locals("userId").(string), newUser.Id, roleId) @@ -903,16 +921,18 @@ func AllUsersDeleteUser(conn *websocket.Conn, userId string) { CloseAndDeleteAllUserConnections(userId) - BroadcastMessageToTopic(utils.SubscribedTopicUsers, structs.SendSocketMessage{ - Cmd: utils.SentCmdAllUsersUserDeleted, - Body: struct { - UserId string - ScannerId string - }{ - UserId: userId, - ScannerId: scannerInUsage.Id, - }, - }) + BroadcastMessageToTopics( + []string{utils.SubscribedTopicUsers, utils.SubscribedTopicAdminAreaRoles}, + structs.SendSocketMessage{ + Cmd: utils.SentCmdAllUsersUserDeleted, + Body: struct { + UserId string + ScannerId string + }{ + UserId: userId, + ScannerId: scannerInUsage.Id, + }, + }) logger.AddSystemLog("User %s has deleted the user %s", conn.Locals("userId").(string), userId) @@ -1113,4 +1133,4 @@ func DeleteLogManagerServerConnection(userId string, id string) { }) logger.AddSystemLog("User %s has removed log manager server connection with id %s", userId, id) -} \ No newline at end of file +} diff --git a/socketserver/hub.go b/socketserver/hub.go index 5e311e6..b08a6ce 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -198,8 +198,8 @@ func RunHub() { database.DB.Create(&role) - socketclients.BroadcastMessageToTopic( - utils.SubscribedTopicAdminAreaRoles, + socketclients.BroadcastMessageToTopics( + []string{utils.SubscribedTopicAdminAreaRoles, utils.SubscribedTopicUsers}, structs.SendSocketMessage{ Cmd: utils.SentCmdAdminAreaNewRoleCreated, Body: role,