Show overlapping groups in Confluence's space permisisons

what the name says

// ==UserScript==
// @name         Show overlapping groups in Confluence's space permisisons
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  what the name says
// @author       Dennis Stengele
// @match        https://*.atlassian.net/wiki/spaces/spacepermissions.action*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=atlassian.net
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

/* jshint esversion: 8 */

(async function () {
    'use strict';

    const baseUrl = location.origin;

    const permissionGroups = Array.from(document.querySelectorAll("table#gPermissionsTable tr.space-permission-row > th")).map((node) => node.innerText);

    const userRows = Array.from(document.querySelectorAll("table#uPermissionsTable tr.space-permission-row"));

    for (const userRow of userRows) {
        const userKey = userRow.dataset.key;

        const userGroups = await fetch(`${baseUrl}/wiki/rest/api/user/memberof?${new URLSearchParams({ accountId: userKey })}`).then(
            response => { return response.json(); }
        ).then(
            json => { return json.results.map((groupObject) => { return groupObject.name; }); }
        );

        const intersect = permissionGroups.filter((x) => { return userGroups.includes(x); });

        if (0 == intersect.length) { continue; }

        const usernameCell = userRow.querySelector("th");

        const userNameValue = usernameCell.innerText;

        console.log(`User ${userNameValue} (Key: ${userKey}) has groups [${userGroups.join(", ")}], intersected to [${intersect.join(", ")}]`);

        const newUsernameValue = `${userNameValue} (${intersect.join(", ")})`;

        usernameCell.innerText = newUsernameValue;
    }
})();