Members: Bulk Deactivate

View as Markdown

This script deactivates and deletes all users found, using a single parameter that can be configured in the script as a wildcard.

Refer to the Sigma REST API Recipes QuickStart for step-by-step instructions.

Example script

Node
1// This script identifies users in Sigma matching a specified name pattern, retrieves their status, and deactivates (soft-deletes) them.
2
3// Load environment variables from a specific .env file for configuration
4require('dotenv').config({ path: 'sigma-api-recipes/.env' });
5
6// Import the function to obtain a bearer token from the authenticate-bearer module
7const getBearerToken = require('../get-access-token');
8
9// Import Axios for making HTTP requests
10const axios = require('axios');
11
12// Load use-case specific variables from environment variables
13const baseURL = process.env.baseURL; // Base URL for the Sigma API
14const userNamePattern = new RegExp(process.env.USER_NAME_PATTERN, 'i'); // Regex pattern for user names (case-insensitive)
15const deactivateOnly = process.env.DEACTIVATE_ONLY === 'true'; // Boolean flag for deactivate-only mode
16
17// Function to fetch the isInactive status of a user by memberId
18async function fetchIsInactiveStatus(memberId, accessToken) {
19 const url = `${baseURL}/members/${memberId}`; // API endpoint to get member details
20 console.log(`Fetching isInactive status for memberId: ${memberId} at URL: ${url}`);
21 try {
22 const response = await axios.get(url, {
23 headers: {
24 Authorization: `Bearer ${accessToken}`,
25 },
26 });
27 return response.data.isInactive || false; // Return isInactive status or false if not set
28 } catch (error) {
29 console.error(`Error fetching isInactive status for memberId: ${memberId}`, error.response ? error.response.data : error);
30 return false; // Default to false if an error occurs
31 }
32}
33
34// Function to list all members and filter by name using the regex pattern
35async function listUsers(accessToken) {
36 const url = `${baseURL}/members?includeInactive=true`; // Include inactive users in the list
37 console.log(`Listing users from: ${url}`);
38 try {
39 const response = await axios.get(url, {
40 headers: {
41 Authorization: `Bearer ${accessToken}`,
42 },
43 });
44
45 // Filter users by name (firstName + lastName) using regex pattern
46 const filteredUsers = response.data.entries.filter(user =>
47 userNamePattern.test(`${user.firstName} ${user.lastName}`)
48 );
49
50 // Fetch isInactive status for each filtered user
51 const usersWithStatus = [];
52 for (const user of filteredUsers) {
53 const isInactive = await fetchIsInactiveStatus(user.memberId, accessToken);
54 if (!isInactive) {
55 usersWithStatus.push({ ...user, isInactive });
56 }
57 }
58
59 console.log('Filtered Users with isInactive Status:', usersWithStatus);
60 return usersWithStatus;
61 } catch (error) {
62 console.error(`Error fetching users: ${error}`);
63 return [];
64 }
65}
66
67// Function to "soft-delete" (deactivate) a member
68async function deleteUser(user, accessToken) {
69 try {
70 const url = `${baseURL}/members/${user.memberId}`;
71 const response = await axios.delete(url, {
72 headers: {
73 Authorization: `Bearer ${accessToken}`,
74 Accept: 'application/json',
75 },
76 });
77 console.log(`Deactivated (deleted) user: ${user.firstName} ${user.lastName} (ID: ${user.memberId})`);
78 console.log('Response:', response.data);
79 } catch (error) {
80 console.error(`Error deactivating (deleting) user ${user.firstName} ${user.lastName}:`, error.response ? error.response.data : error);
81 }
82}
83
84// Main function to manage the overall workflow
85async function main() {
86 const accessToken = await getBearerToken();
87 if (!accessToken) {
88 console.error('Failed to obtain Bearer token.');
89 return;
90 }
91
92 const users = await listUsers(accessToken);
93 if (users.length > 0) {
94 console.log(`Found ${users.length} active user(s) matching the pattern.`);
95 for (const user of users) {
96 await deleteUser(user, accessToken); // Deactivate the user
97 if (!deactivateOnly) {
98 console.warn('Delete functionality is disabled in the current implementation.');
99 }
100 }
101 } else {
102 console.log('No active users matched the specified pattern.');
103 }
104}
105
106// Execute the main function
107main();
Response Example
1{"success":true}

Endpoints used

  1. Get authentication token: GET BearerToken function
  2. List all users: GET /v2/members
  3. Deactivate a user: PATCH /v2/members/{memberId}