Name

sn_oe_sfs.CollabTeamsUserSync

Description

Synchronize collab users with Teams users.

Script

var CollabTeamsUserSync = Class.create();
CollabTeamsUserSync.prototype = {
  initialize: function(providerId, pageSize) {
      this.providerId = providerId;
      this.pageSize = pageSize || 100;
      this._usersById = {};
  },

  sync: function() {
      var teamsUsers = {};
  	gs.info("Starting sync with provider: " + this.providerId);

      do {
          teamsUsers = this._fetchTeamUsersPage(teamsUsers.skip_token);
          teamsUsers.users.forEach(this._processTeamsUserEntry, this);

          gs.debug("got " + Object.keys(this._usersById).length + " users so far");
      } while (teamsUsers.skip_token);

      this._checkRemovedUsers();
  },

  //Private
  _fetchTeamUsersPage: function(skipToken) {
      var params = {
          'page_size': this.pageSize
      };
      if (skipToken) {
          params.skip_token = skipToken;
      }
      return sn_fd.FlowAPI.executeActionQuick('sn_oe_sfs.get_users', params);
  },

  _processTeamsUserEntry: function(user) {

      gs.debug("User===> " + user.displayName);

      this._usersById[user.id] = true;
      var exGr = new GlideRecord("sys_cs_collab_provider_user_profile");
      exGr.addQuery("provider_user_id", user.userPrincipalName);
      exGr.query();
      if (!exGr.next()) {
          var sysUserQuery = new GlideRecord("sys_user");
          var externalUser = true;
          sysUserQuery.addQuery("email", user.mail);
          sysUserQuery.query();
          if (sysUserQuery.next()) {
              externalUser = false;
          }

          var newCollabUser = new GlideRecord("sys_cs_collab_user");
          newCollabUser.initialize();
          newCollabUser.external_user = externalUser;
  		newCollabUser.create_external_conversation = externalUser;
          if (!externalUser) {
              newCollabUser.user = sysUserQuery.sys_id;
          }
          var newCollabUserId = newCollabUser.insert();

          this._addCollabProfile(user, newCollabUserId);
          gs.info("User " + user.displayName + " added");
      }
  },

  _checkRemovedUsers: function() {
      var existingExternal = new GlideRecord("sys_cs_collab_provider_user_profile");
      existingExternal.addQuery("collab_user.external_user", true);
      existingExternal.query();
      while (existingExternal.next()) {
          if (!this._usersById[existingExternal.external_user_id]) {
              gs.info(existingExternal.display_name + " is no longer an external user");
              existingExternal.deleteRecord();
          }
      }
  },

  _emailToUse: function(teamsUser) {
      if (teamsUser.mail) {
          return teamsUser.mail;
      } else {
          return teamsUser.userPrincipalName;
      }
  },

  _addCollabProfile: function(teamsUser, collabUserId) {
      var newGr = new GlideRecord("sys_cs_collab_provider_user_profile");
      newGr.initialize();
      newGr.provider_user_id = teamsUser.userPrincipalName;
      newGr.display_name = teamsUser.displayName;
      newGr.external_user_id = teamsUser.id;
      newGr.provider = this.providerId;
      newGr.active = true;
      newGr.collab_user = collabUserId;
      newGr.insert();
  },

  type: 'CollabTeamsUserSync'
};

Sys ID

dbdd2c64531e91101c1addeeff7b12d8

Offical Documentation

Official Docs: