Name

sn_oe_sfs.SidebarTeamsCustomTransformer

Description

SidebarTeamsCustomTransformer is used for transforming sidebar conversation message to the Teams message format.

Script

var SidebarTeamsCustomTransformer = Class.create();
SidebarTeamsCustomTransformer.prototype = {
  initialize: function() {
  },
  _getCollabUserSender: function(sender) {
  	var gr = new GlideRecord("sys_cs_collab_provider_user_profile");
  	gr.addQuery("external_user_id", sender);
  	gr.query();
  	if (!gr.next()) {
  		return null;
  	}
  	return gr.getValue("collab_user");
  },
  transformOutboundMessage: function(collabMessage) {
  	var collabChatId = collabMessage.collabChatId;
  	var payload = collabMessage.payload;
  	var messageType = collabMessage.messageType;
  	switch (messageType) {
  		case 'text':
  			return {
  				content_type: "text",
  				content: payload,
  				collab_chat_id: collabChatId,
  				attachments: []
  			};
  		case 'rich':
  			var parsedPayload = JSON.parse(payload);
  			if(parsedPayload.uiType == "MultiAttachmentsControl")
  				return {
  					content_type: "html",
  					content: parsedPayload.uiMetadata.message,
  					collab_chat_id: collabChatId,
  					attachments: parsedPayload.uiMetadata.attachments
  				};
  			break;
  		default:
  			break;
  	}
  	
  	return {};
  },
  transformInboundMessage: function(teamsMessage, teamsChangeType) {
  	var chatInboundMessage = {};
  	chatInboundMessage.externalChatId = teamsMessage.chatId;
  	chatInboundMessage.externalMessageId = teamsMessage.id;
  	chatInboundMessage.messageType = teamsMessage.messageType;
  	chatInboundMessage.createdDateTime = teamsMessage.createdDateTime;
  	chatInboundMessage.lastModifiedDateTime = teamsMessage.lastModifiedDateTime;
  	chatInboundMessage.lastEditedDateTime = teamsMessage.lastEditedDateTime;
  	chatInboundMessage.deletedDateTime = teamsMessage.deletedDateTime;
  	var fromUser = teamsMessage.from;
  	if (!fromUser || !fromUser.user || !fromUser.user.id) {
  		gs.error("The message sender info is empty");
  		return null;
  	}
  	//fromUser.user.id is external user id from sys_cs_collab_provider_user_profile
  	chatInboundMessage.externalSenderId = fromUser.user.id;
  	chatInboundMessage.userIdentityType = fromUser.user.userIdentityType;
  	var body = teamsMessage.body;
  	if (!body || (!body.content && teamsChangeType !== "deleted")) {
  		gs.error("The message body is empty");
  		return null;
  	}
  	chatInboundMessage.contentType = body.contentType;
  	if (teamsChangeType === "deleted") {
  		chatInboundMessage.content = "";
  	} else {
  		if (body.contentType === 'text') {
  			chatInboundMessage.content = body.content;
  		} else if (body.contentType === 'html') {
  			//if message contains emoji, it should have itemtype="http://schema.skype.com/Emoji, use the alt value for emoji
  			var emojiContent = body.content.replace(/<emoji.*?alt="(.*?)"[^>]+>/g, '$1');
  			if (!emojiContent) {
  				gs.debug("Message is empty after replace MS emoji with alt value");
  				return null;
  			}
  			//remove all html tags from the content,
  			var contentWithoutTag = emojiContent.replace(/<[^>]*>?/g, '');
  			// Append attachment URL to the content
  			teamsMessage.attachments.forEach(function (attachment) {
  				var urlWithSpace = attachment.contentUrl.replace(/[()[\] ]/g, function(c) {return '%' + c.charCodeAt(0).toString(16);});
  				contentWithoutTag = contentWithoutTag + " " + urlWithSpace;
  			});
  			if (!contentWithoutTag) {
  				gs.debug("Message is empty after remove all html tags");
  				return null;
  			}
  			// unescape the message. e.g. &lt;h1&gt;hello&lt;/h1&gt; will be converted to <p>hello</p>
  			var content = GlideStringUtil.unEscapeHTML(contentWithoutTag);
  			if (!content) {
  				gs.error("Message content is empty");
  				return null;
  			}
  			chatInboundMessage.content = content;
  		} else {
  			gs.error("Message content type is not supported " + body.contentType);
  			return null;
  		}
  	}
  	//get collab user:
  	chatInboundMessage.collabChatSender = this._getCollabUserSender(chatInboundMessage.externalSenderId);
  	if (!chatInboundMessage.collabChatSender) {
  		gs.error("No such collab user " + sender);
  		return null;
  	}
  	return chatInboundMessage;
  },
  transformInboundMember: function(teamsMember) {
  	var chatInboundMember = {};
  	chatInboundMember.externalUserId = teamsMember.userId;
  	chatInboundMember.email = teamsMember.email;
  	chatInboundMember.tenantId = teamsMember.tenantId;
  	chatInboundMember.id = teamsMember.id;
  	chatInboundMember.roles = teamsMember.roles;
  	chatInboundMember.displayName = teamsMember.displayName;
  	chatInboundMember.visibleHistoryStartDateTime = teamsMember.visibleHistoryStartDateTime;
  	chatInboundMember.user = teamsMember.user;
  	chatInboundMember.collabUser = this._getCollabUserSender(teamsMember.userId);
  	return chatInboundMember;
  },
  type: 'SidebarTeamsCustomTransformer'
};

Sys ID

d3dc4cccc3b911100f24c87af040dd34

Offical Documentation

Official Docs: