From 1bbcabb7284ba876ea79ad44654c54960b095ab4 Mon Sep 17 00:00:00 2001 From: Benjamin Borowski Date: Mon, 4 Dec 2023 11:07:23 -0800 Subject: [PATCH] Swap members (email) SCIM example --- examples/nm/change-member-emails.js | 48 +++++++++++++++++++++++++++++ examples/nm/data/groups.json | 2 +- examples/nm/shared.js | 12 ++++++++ examples/nm/user-remove.js | 12 ++------ 4 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 examples/nm/change-member-emails.js diff --git a/examples/nm/change-member-emails.js b/examples/nm/change-member-emails.js new file mode 100644 index 0000000..fb58e1e --- /dev/null +++ b/examples/nm/change-member-emails.js @@ -0,0 +1,48 @@ +/** + * Change access from one email to another. + */ + +const { RED_COLOR, yargs } = require('../shared/scim'); +const { + addMemberToGroup, + findMemberByEmail, + findOrProvisionUser, + removeMemberFromWorkspace, +} = require('./shared'); + +const argv = yargs + .option('groupId', { + alias: 'g', + describe: 'The ID of the group to add the User to', + demand: true, + default: '7d3e5712-a873-43a8-a4b5-2ab138a9e2ea', + }) + .option('old', { + alias: 'o', + describe: "User's current email address", + demand: true, + }) + .option('new', { + alias: 'n', + describe: "User's new email address", + demand: true, + }).argv; + +(async () => { + const { groupId, old: oldEmail, new: newEmail } = argv; + + // Find the old member + const oldMember = await findMemberByEmail(oldEmail); + if (!oldMember) { + return console.log(RED_COLOR, `No member by email <${oldEmail}> found`); + } + + // Provision the new member + const user = await findOrProvisionUser(newEmail); + if (!user.id) { + return console.log(RED_COLOR, 'Could not find or provision user'); + } + + await addMemberToGroup(argv.groupId, user.id); + await removeMemberFromWorkspace(oldMember.id); +})(); diff --git a/examples/nm/data/groups.json b/examples/nm/data/groups.json index 9f201f9..2410185 100644 --- a/examples/nm/data/groups.json +++ b/examples/nm/data/groups.json @@ -47,4 +47,4 @@ "memberCount": 4, "index": 3 } -] \ No newline at end of file +] diff --git a/examples/nm/shared.js b/examples/nm/shared.js index 62fb680..8e3c27a 100644 --- a/examples/nm/shared.js +++ b/examples/nm/shared.js @@ -92,6 +92,17 @@ async function findOrProvisionUser(email) { return user; } +async function removeMemberFromWorkspace(userId) { + try { + // DELETE https://api.notion.com/scim/v2/Users/{id} + const { status, statusText } = await scim.delete(`Users/${userId}`); + + console.log(`Removed member (${status}): ${statusText} - ${userId}`); + } catch ({ response: { status, statusText } }) { + console.log(`Failed to remove member (${status}): ${statusText}`); + } +} + async function getCache(fileName) { const tmpDir = path.join(__dirname, 'data'); const cachePath = path.join(tmpDir, `${fileName}.json`); @@ -128,6 +139,7 @@ module.exports = { findMemberByEmail, findOrProvisionUser, removeMemberFromGroup, + removeMemberFromWorkspace, getCache, setCache, }; diff --git a/examples/nm/user-remove.js b/examples/nm/user-remove.js index ffbcc45..f77398e 100644 --- a/examples/nm/user-remove.js +++ b/examples/nm/user-remove.js @@ -5,7 +5,7 @@ */ const { scim, yargs } = require('../shared/scim'); -const { findMemberByEmail } = require('./shared'); +const { findMemberByEmail, removeMemberFromWorkspace } = require('./shared'); const argv = yargs .option('email', { @@ -31,13 +31,5 @@ const argv = yargs return console.log('Could not find user'); } - // DELETE https://api.notion.com/scim/v2/Users/{id} - - try { - const { status, statusText } = await scim.delete(`Users/${userId}`); - - console.log(`${status}: ${statusText} - ${userId}`); - } catch ({ response: { status, statusText } }) { - console.log(`${status}: ${statusText}`); - } + await removeMemberFromWorkspace(userId); })();