Skip to content

Commit 01bb3d8

Browse files
Group Member utility script include for retrieving and managing group memberships (#1782)
* 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. * Create readme.md Detailed description
1 parent 0c577ea commit 01bb3d8

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/**
2+
* This utility script include provides methods for managing and querying user-group memberships
3+
* in the sys_user_grmember table.
4+
* Accessible from both server-side and client-side (for AJAX-compatible methods).
5+
*/
6+
var GroupMembershipUtils = Class.create();
7+
GroupMembershipUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
8+
9+
/**
10+
* Returns a comma-separated list of user sys_ids who are members of the specified group.
11+
* Can be called from both server and client sides.
12+
*
13+
* @param {string} [groupSysID] - (Optional) sys_id of the group. If not provided, expects 'group_sys_id' parameter (used in client-side call).
14+
* @returns {string} Comma-separated sys_ids of users in the group.
15+
*/
16+
getGroupMembers: function(groupSysID) {
17+
var group = groupSysID ? groupSysID : this.getParameter('group_sys_id');
18+
if (!group) return;
19+
var users = [];
20+
21+
var grGroupMembers = new GlideRecord('sys_user_grmember');
22+
grGroupMembers.addQuery('group', group);
23+
grGroupMembers.query();
24+
while (grGroupMembers.next()) {
25+
users.push(grGroupMembers.getValue('user'));
26+
}
27+
28+
return users.join();
29+
},
30+
31+
/**
32+
* Returns a comma-separated list of group sys_ids that the specified user is a member of.
33+
* Can be called from both server and client sides.
34+
*
35+
* @param {string} [userSysId] - (Optional) sys_id of the user. If not provided, expects 'user_sys_id' parameter (used in client-side call).
36+
* @returns {string} Comma-separated sys_ids of groups the user belongs to.
37+
*/
38+
getUserGroups: function(userSysId) {
39+
var user = userSysId ? userSysId : this.getParameter('user_sys_id');
40+
if (!user) return;
41+
var groups = [];
42+
43+
var grGroupMembers = new GlideRecord('sys_user_grmember');
44+
grGroupMembers.addQuery('user', user);
45+
grGroupMembers.query();
46+
while (grGroupMembers.next()) {
47+
groups.push(grGroupMembers.getValue('group'));
48+
}
49+
50+
return groups.join();
51+
},
52+
53+
/**
54+
* Adds multiple users to a specified group.
55+
* Prevents unique key violation error by checking if the user is already a member.
56+
*
57+
* **Server-side only.**
58+
*
59+
* @param {string} groupSysID - sys_id of the group.
60+
* @param {Array<string>} userSysIDs - Array of user sys_ids to be added to the group.
61+
* @returns {number} The count of successfully added group memberships.
62+
*/
63+
addGroupMembers: function(groupSysID, userSysIDs) {
64+
if (!groupSysID || !userSysIDs) return 0;
65+
66+
var count = 0;
67+
68+
for (var i = 0; i < userSysIDs.length; i++) {
69+
var grGroupMembers = new GlideRecord('sys_user_grmember');
70+
grGroupMembers.addQuery('group', groupSysID);
71+
grGroupMembers.addQuery('user', userSysIDs[i]);
72+
grGroupMembers.query();
73+
74+
// Only insert if membership does not already exist
75+
if (!grGroupMembers.next()) {
76+
grGroupMembers.initialize();
77+
grGroupMembers.setValue('group', groupSysID);
78+
grGroupMembers.setValue('user', userSysIDs[i]);
79+
80+
if (grGroupMembers.insert()) {
81+
count++;
82+
}
83+
}
84+
}
85+
86+
return count;
87+
},
88+
89+
/**
90+
* Removes multiple users from a specified group.
91+
* Only removes if a membership exists.
92+
*
93+
* **Server-side only.**
94+
*
95+
* @param {string} groupSysID - sys_id of the group.
96+
* @param {Array<string>} userSysIDs - Array of user sys_ids to be removed from the group.
97+
* @returns {number} The count of successfully removed group memberships.
98+
*/
99+
removeGroupMembers: function(groupSysID, userSysIDs) {
100+
if (!groupSysID || !userSysIDs) return 0;
101+
102+
var count = 0;
103+
104+
for (var i = 0; i < userSysIDs.length; i++) {
105+
var grGroupMembers = new GlideRecord('sys_user_grmember');
106+
grGroupMembers.addQuery('group', groupSysID);
107+
grGroupMembers.addQuery('user', userSysIDs[i]);
108+
grGroupMembers.query();
109+
110+
// Only delete if membership exists
111+
if (grGroupMembers.next()) {
112+
if (grGroupMembers.deleteRecord()) {
113+
count++;
114+
}
115+
}
116+
}
117+
118+
return count;
119+
},
120+
121+
type: 'GroupMembershipUtils'
122+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Utility Script Include for managing user-group relationships in ServiceNow (sys_user_grmember table).
2+
3+
It provides methods to:
4+
Retrieve users in a group (getGroupMembers)
5+
Retrieve groups a user belongs to (getUserGroups)
6+
Add users to a group (addGroupMembers)
7+
Remove users from a group (removeGroupMembers)
8+
9+
Supports both client and server-side operations (where applicable), ensures no duplicate group memberships, and simplifies bulk updates.
10+
11+
Ideal for use in server scripts, GlideAjax calls, reference qualifiers, etc to streamline group membership management.

0 commit comments

Comments
 (0)