From d6a4fd80f9d8243a17e123a35c647592b98c7398 Mon Sep 17 00:00:00 2001 From: AnandMahajan2799 <99655598+AnandMahajan2799@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:20:34 +0530 Subject: [PATCH 1/2] Create groupMembershipUtils.js Utility Script Include for managing user-group relationships. It provides methods to: Retrieve users in a group (getGroupMembers) Retrieve groups a user belongs to (getUserGroups) Add users to a group (addGroupMembers) Remove users from a group (removeGroupMembers) Supports both client and server-side operations. --- .../groupMembershipUtils.js | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Server-Side Components/Script Includes/GroupMembershipUtils for client and server/groupMembershipUtils.js diff --git a/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/groupMembershipUtils.js b/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/groupMembershipUtils.js new file mode 100644 index 0000000000..4e8719e3f3 --- /dev/null +++ b/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/groupMembershipUtils.js @@ -0,0 +1,122 @@ +/** + * This utility script include provides methods for managing and querying user-group memberships + * in the sys_user_grmember table. + * Accessible from both server-side and client-side (for AJAX-compatible methods). + */ +var GroupMembershipUtils = Class.create(); +GroupMembershipUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, { + + /** + * Returns a comma-separated list of user sys_ids who are members of the specified group. + * Can be called from both server and client sides. + * + * @param {string} [groupSysID] - (Optional) sys_id of the group. If not provided, expects 'group_sys_id' parameter (used in client-side call). + * @returns {string} Comma-separated sys_ids of users in the group. + */ + getGroupMembers: function(groupSysID) { + var group = groupSysID ? groupSysID : this.getParameter('group_sys_id'); + if (!group) return; + var users = []; + + var grGroupMembers = new GlideRecord('sys_user_grmember'); + grGroupMembers.addQuery('group', group); + grGroupMembers.query(); + while (grGroupMembers.next()) { + users.push(grGroupMembers.getValue('user')); + } + + return users.join(); + }, + + /** + * Returns a comma-separated list of group sys_ids that the specified user is a member of. + * Can be called from both server and client sides. + * + * @param {string} [userSysId] - (Optional) sys_id of the user. If not provided, expects 'user_sys_id' parameter (used in client-side call). + * @returns {string} Comma-separated sys_ids of groups the user belongs to. + */ + getUserGroups: function(userSysId) { + var user = userSysId ? userSysId : this.getParameter('user_sys_id'); + if (!user) return; + var groups = []; + + var grGroupMembers = new GlideRecord('sys_user_grmember'); + grGroupMembers.addQuery('user', user); + grGroupMembers.query(); + while (grGroupMembers.next()) { + groups.push(grGroupMembers.getValue('group')); + } + + return groups.join(); + }, + + /** + * Adds multiple users to a specified group. + * Prevents unique key violation error by checking if the user is already a member. + * + * **Server-side only.** + * + * @param {string} groupSysID - sys_id of the group. + * @param {Array} userSysIDs - Array of user sys_ids to be added to the group. + * @returns {number} The count of successfully added group memberships. + */ + addGroupMembers: function(groupSysID, userSysIDs) { + if (!groupSysID || !userSysIDs) return 0; + + var count = 0; + + for (var i = 0; i < userSysIDs.length; i++) { + var grGroupMembers = new GlideRecord('sys_user_grmember'); + grGroupMembers.addQuery('group', groupSysID); + grGroupMembers.addQuery('user', userSysIDs[i]); + grGroupMembers.query(); + + // Only insert if membership does not already exist + if (!grGroupMembers.next()) { + grGroupMembers.initialize(); + grGroupMembers.setValue('group', groupSysID); + grGroupMembers.setValue('user', userSysIDs[i]); + + if (grGroupMembers.insert()) { + count++; + } + } + } + + return count; + }, + + /** + * Removes multiple users from a specified group. + * Only removes if a membership exists. + * + * **Server-side only.** + * + * @param {string} groupSysID - sys_id of the group. + * @param {Array} userSysIDs - Array of user sys_ids to be removed from the group. + * @returns {number} The count of successfully removed group memberships. + */ + removeGroupMembers: function(groupSysID, userSysIDs) { + if (!groupSysID || !userSysIDs) return 0; + + var count = 0; + + for (var i = 0; i < userSysIDs.length; i++) { + var grGroupMembers = new GlideRecord('sys_user_grmember'); + grGroupMembers.addQuery('group', groupSysID); + grGroupMembers.addQuery('user', userSysIDs[i]); + grGroupMembers.query(); + + // Only delete if membership exists + if (grGroupMembers.next()) { + if (grGroupMembers.deleteRecord()) { + count++; + } + } + } + + return count; + }, + + type: 'GroupMembershipUtils' +}); From 46d40c3624930d0d5ac8885c50ec4906a4f68ee8 Mon Sep 17 00:00:00 2001 From: AnandMahajan2799 <99655598+AnandMahajan2799@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:21:47 +0530 Subject: [PATCH 2/2] Create readme.md Detailed description --- .../readme.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Server-Side Components/Script Includes/GroupMembershipUtils for client and server/readme.md diff --git a/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/readme.md b/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/readme.md new file mode 100644 index 0000000000..9fcdc0858a --- /dev/null +++ b/Server-Side Components/Script Includes/GroupMembershipUtils for client and server/readme.md @@ -0,0 +1,11 @@ +Utility Script Include for managing user-group relationships in ServiceNow (sys_user_grmember table). + +It provides methods to: +Retrieve users in a group (getGroupMembers) +Retrieve groups a user belongs to (getUserGroups) +Add users to a group (addGroupMembers) +Remove users from a group (removeGroupMembers) + +Supports both client and server-side operations (where applicable), ensures no duplicate group memberships, and simplifies bulk updates. + +Ideal for use in server scripts, GlideAjax calls, reference qualifiers, etc to streamline group membership management.