Name

global.SubscriptionServiceImpl

Description

Gets installed as part of com.snc.activity_subscriptions plugin Activity Subscriptions Framework. Contains all the methods to perform Subscriptions related operations.

Script

var SubscriptionServiceImpl = Class.create();
SubscriptionServiceImpl.prototype = {
  initialize: function(activitySubContext) {
  	this.activitySubContext = activitySubContext;
  	this.activityDAO = activitySubContext.getActivityDAO();
  	this.subscriptionDAO =  activitySubContext.getSubscriptionDAO();
  	this.ADVANCED_A_LEVEL_ACTIVITY_TYPE="65c47eca531332003760ddeeff7b125c";
  	this.SUB_OBJ_TOPIC = '17bd03c467103200ace49a6617415aed';
  	this.BADGE_AWARDED_TYPE = "4dc9bef93b32320037556b4ee3efc4e3";
  	this.USER_MENTIONED_VERB = "mentioned";
  	this.SUBSCRIBER_ID;
  },

  subscribe: function(subObjTypeId,subObjId){
  	if(this.activitySubContext.isCommunityPluginActive == true && subObjTypeId == this.SUB_OBJ_TOPIC && !sn_communities.CommunityConstants.ENABLE_TOPICS){
  		return {"status":400,"message": "Object passed is not a subscribable object"};
  	}
  	var subscriberId;
  	if(this.SUBSCRIBER_ID)
  		subscriberId = this.subscriptionDAO.getLiveProfileId(this.SUBSCRIBER_ID);
  	else
  		subscriberId = this.subscriptionDAO.getLiveProfileId();
  	if(!subObjTypeId || !subObjId || !subscriberId)
  		return {"status":400,
  				"message":"Make sure sub_obj_type, sub_obj_id and subscriber_id are valid",
  				"subObjTypeId":subObjTypeId,
  				"subObjId": subObjId,
  				"subscriberId":subscriberId};
  	try{
  		var subObjInfo = this.subscriptionDAO.getSubscribableObjectInfo(subObjTypeId);
  		if(!subObjInfo)
  			return {"status":400,"message": "Object passed is not a subscribable object"};
  		var subObjTableName = subObjInfo.table_name;
  		var subscription  = this.isSubscribed(subObjId, subscriberId).subscriptionId;
  		if(subscription)
  			return {"status":400,"message": "User already subscribed to the given subscribable object"};

  		//Create default stream if user doesn't have one
  		var stream = this.subscriptionDAO.getUserStream(subscriberId);
  		var streamId;
  		if(!stream)
  			streamId = this.subscriptionDAO.createUserStream(subscriberId);
  		else
  			streamId = stream.streamId;
  		//subscribe
  		this.subscriptionDAO.createSubscription(subObjTableName, subObjId, subObjTypeId, subscriberId, streamId);

  	}catch(err){
  		return {"status":500,"message":err.message};
  	}

  	return {"status":201,"message":"User is subscribed to the subscribable object"};
  },

  unsubscribe: function(subObjId, subscriber){
  	var subscriberId = subscriber || this.subscriptionDAO.getLiveProfileId();
  	if(!subObjId || !subscriberId)
  		return {"status":400,"message":"Make sure sub_obj_id and subscriber_id are valid"};

  	try{
  		var retStatus = this.subscriptionDAO.deleteSubscription(subscriberId,subObjId);
  		if(retStatus === 0)
  			return {"status":200,"message":"User is unsubscribed to the subscribable object"};
  		else
  			return {"status":400,"message":"There is no subscription for this user for the given object"};
  	}catch(err){
  		return {"status":500,"message":err};
  	}
  },
  /**
  *   This method allows to unsubscribe users
  *   from a give subscribable object
  *	Please use this method with caution as it deletes multiple
  *   subscription records
  **/
  unSubscribeUsers: function(sub_obj_id, users){
  	var result;
  	try{
  		result = this.subscriptionDAO.unSubscribeUsers(sub_obj_id, users);
  		if(result && result.unsubscribed_count && result.unsubscribed_count > 0){
  			result.status = "202";
  			result.message = "success";
  		}else{
  			result.status = "204";
  			result.message = "No records found!";
  		}
  	}catch(err){
  		result.status = "404";
  		result.message = err.message;
  	}
  	result.users = users;
  	return result;
  },

  subscribeUser: function(subObjTypeId, subObjId, subscribeUserId) {
  	this.SUBSCRIBER_ID = subscribeUserId;
  	return this.subscribe(subObjTypeId,subObjId);
  },

  subscribeUsers: function (subObjTypeId, subObjId, subscribeUserIds) {
  	if (!subObjTypeId || !subObjId || !subscribeUserIds)
  		return {
  			"status": 400,
  			"message": "Make sure subObjTypeId, subObjId, subscribeUserIds are valid",
  			"subObjTypeId": subObjTypeId,
  			"subObjId": subObjId,
  			"subscribeUserIds": subscribeUserIds
  		};
  	try {
  		var subObjInfo = this.subscriptionDAO.getSubscribableObjectInfo(subObjTypeId);
  		if (!subObjInfo)
  			return {
  				"status": 400,
  				"message": "Object passed is not a subscribable object"
  			};
  		var subObjTableName = subObjInfo.table_name;

  		this.subscriptionDAO.subscribeUsers(subObjTableName, subObjId, subObjTypeId, subscribeUserIds);

  	} catch (err) {
  		return {
  			"status": 500,
  			"message": err.message
  		};
  	}

  	return {
  		"status": 201,
  		"message": "Users are subscribed to the subscribable object"
  	};
  },
  isSubscribed: function(objectId, subscriberId)
  {
  	subscriberId = subscriberId || this.subscriptionDAO.getLiveProfileId();
  	if(!objectId || !subscriberId)
  		return {"status":400,"message":"make sure subscribable object and subsriber ids are valid",
  				"objectId":objectId,
  				"subscriberId":subscriberId};
  	try{
  		var retStatus = this.subscriptionDAO.isSubscribed(objectId, subscriberId);

  		if(retStatus.subscriptionId)
  			return {"status":201,"subscriptionId": retStatus.subscriptionId,"createdDate":retStatus.creationDate};
  		else
  			return {"status":201,"subscriptionId": null};
  	}catch(err){
  		return {"status":500,"message":err.message};
  	}
  },

  getSubscriptionStatusForSubObjects: function(subObjectIds, subObjectType){
  	try{
  		if(gs.nil(subObjectIds)){
  			return [];
  		}
  		var resultsData = this.activitySubContext.getSubscriptionDAO().getSubscriptionStatusForSubObjects(subObjectIds, subObjectType);
  		return resultsData;
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },

  getLiveProfileId: function(userId){
  	return this.subscriptionDAO.getLiveProfileId(userId);
  },
  createUserStream: function(profileId, streamName, fanoutToStream){
  	try{
  		var result = this.subscriptionDAO.createUserStream(profileId, streamName, fanoutToStream);
  		if(result && !result.status){
  			return {"streamId": result + '', "status": 201,"message": streamName + " stream is created", "fanout": fanoutToStream};
  		}else if(result && result.status)
  			return result;
  		else{
  			return {"status": 400,"message": "stream is not created"};
  		}
  	}catch(err){
  		return {"status": 500,"message": err.message};
  	}
  },
  getUserStream: function(profileId, streamName){
  	var stream = this.subscriptionDAO.getUserStream(profileId, streamName);
  	if(!stream){
  		return {"status":400,"message":"Stream not found!",
  				"profileId":profileId,"streamName":streamName};
  	}
  	return stream;
  },
  updateUserStream: function(profileId, streamName, fanoutToStream){
  	try{
  		var result = this.subscriptionDAO.updateUserStream(profileId, streamName, fanoutToStream);
  		if(result && result.status)
  			return result;
  		if(result){
  			result.status = 201;
  			return result;
  		}
  	}catch(err){
  		return {"status": 500,"message": err.message};
  	}
  },
  isNotificationDisabled: function(activityType){
  	if(activityType){
  		var module = activityType.module;
  		if(module){
  			return module.disable_notifications;
  		}
  	}
  	return false;
  },
  getSubscribers: function(current,activityType){
  	//Check objects based on global preferences first
  	//anything disabled at the global level will not be included in the list
  	
  	var topicTable = '';
  	var topicsEnabled = false;
  	if(this.activitySubContext.isCommunityPluginActive == true){
  		topicTable = sn_communities.CommunityConstants.TOPIC_TABLE;
  		topicsEnabled = sn_communities.CommunityConstants.ENABLE_TOPICS;
  	}
  	var objList = this.getSubObjList(current, topicTable, topicsEnabled);
  	var subscribers;
  	var i;
  	var preferences;
  	var authorSubscribed;
  	var isFeedback;
  	var authorProfileId;
  	var authorUserId;
  	try{
  	if(this.activitySubContext.isCommunityPluginActive == true){
  		isFeedback = new sn_communities.CommunityFeedback().getFeedbackTypeId(current.activity_type_id.verb);
  		authorProfileId = current.object_id.content.profile;
  	}
  	if(objList && objList.additionalField1Id){
  		//Check preference for least subscription first
  		subscribers = this._getObjSubscribers(current.additional_field1,
  											  current.additional_field1_name, current.actor_id, current.activity_type_id,
  											  authorProfileId, isFeedback);
  	}
  	var objSubscribers;
  	if(current.target_name == 'live_profile'
  	   && activityType && activityType.fanout_to_target == true || activityType.sys_id==this.ADVANCED_A_LEVEL_ACTIVITY_TYPE && (!topicTable || (topicsEnabled || current.addl_sub_obj2_name != topicTable))){
  		var targetProfile = this.subscriptionDAO.getLiveProfileRec(current.target_id);
  		if(targetProfile)
  			if(subscribers && subscribers.slice(-1)!=',')
  				subscribers += "," +targetProfile.document;
  			else if(subscribers)
  				subscribers += targetProfile.document;
  			else
  				subscribers=targetProfile.document;
  	}
  	if(objList && objList.targetId){
  		objSubscribers = this._getObjSubscribers(current.target_id,
  												 current.target_name, current.actor_id, current.activity_type_id, 
  												 authorProfileId, isFeedback);
  		if(objSubscribers){
  			if(subscribers)
  				subscribers += "," + objSubscribers;
  			else
  				subscribers = objSubscribers;
  		}
  	}
  	if(objList && objList.objectId){
  		objSubscribers = this._getObjSubscribers(current.object_id,
  												 current.object_name, current.actor_id, current.activity_type_id, 
  												 authorProfileId, isFeedback);
  		if(isFeedback && authorProfileId){
  			authorSubscribed = this.isSubscribed(current.object_id, authorProfileId);
  			if(authorSubscribed.subscriptionId)
  				authorUserId = this._getAuthorBasedOnPreferences(current.object_name, authorProfileId, current.object_name);
  			if(authorUserId)
  				objSubscribers += "," + authorUserId;
  		}
  		if(objSubscribers){
  			if(subscribers)
  				subscribers += "," + objSubscribers;
  			else
  				subscribers = objSubscribers;
  		}
  	}
  	if(objList && objList.additionalSubObj2Id){//Mostly specific object subscribers. later add an order field on ActivityType
  		objSubscribers = this._getObjSubscribers(current.addl_sub_obj2,
  												 current.addl_sub_obj2_name, current.actor_id, current.activity_type_id,
  												 authorProfileId, isFeedback);
  		if(isFeedback && authorProfileId){
  			authorSubscribed = this.isSubscribed(current.addl_sub_obj2, authorProfileId);
  			if(authorSubscribed.subscriptionId)
  				authorUserId = this._getAuthorBasedOnPreferences(current.addl_sub_obj2_name, authorProfileId, current.object_name);
  			if(authorUserId)
  				objSubscribers += "," + authorUserId;
  		}
  		if(objSubscribers){
  			if(subscribers)
  				subscribers += "," + objSubscribers;
  			else
  				subscribers = objSubscribers;
  		}
  	}
  	if(objList && objList.additionalSubObj3Id){//Mostly specific object subscribers. later add an order field on ActivityType
  		objSubscribers = this._getObjSubscribers(current.addl_sub_obj3,
  												 current.addl_sub_obj3_name, current.actor_id, current.activity_type_id, 
  												 authorProfileId, isFeedback);
  		if(objSubscribers){
  			if(subscribers)
  				subscribers += "," + objSubscribers;
  			else
  				subscribers = objSubscribers;
  		}
  	}
  	if(objList && objList.actorId){
  		objSubscribers = this._getObjSubscribers(current.actor_id,
  												 current.actor_name, current.actor_id, current.activity_type_id);
  		if(objSubscribers){
  			if(subscribers)
  				subscribers += "," + objSubscribers;
  			else
  				subscribers = objSubscribers;
  		}
  	}
  	if(subscribers && subscribers.lastIndexOf(",") == (subscribers.length -1))
  		subscribers = subscribers.substring(0,subscribers.length -1);//trim extra ',' from the end
  	return subscribers;
  	}catch(err){
  		gs.info('ACTSUB:error:' + err.message);
  	}
  	
  },

  filterSubscribersByGlobalPreferences: function(userIds) {
  	if(!userIds || userIds.length == 0)
  		return;
  	return this.subscriptionDAO.filterUsersByGlobalPreferences(userIds);
  },

  filterSubscribersByPreferences: function(subObjectName, activityTypeId, users){
  	if (!subObjectName || !activityTypeId || !users)
  		return [];

  	var subscribers = [];
  	users = this.filterSubscribersByGlobalPreferences(users);
  	var subObjTypeId = this.subscriptionDAO.getSubObjByTableName(subObjectName);
  	for(i=0 ; subObjTypeId && i < users.length; i++){
  		try{
  			if(this._getPreferences(users[i], subObjTypeId, activityTypeId))
  				subscribers.push(users[i]);
  		}catch(err){
  			gs.info('ACTSUB:error:' + err.message);
  		}
  	}
  	return subscribers;
  },

  _getObjSubscribers: function(subObjectId, subObjectName, actorId, activityTypeId, author, isFeedback){
  	var subscribers='';
  	var subObjectSubscribers = this.subscriptionDAO.getSubscribers(subObjectId, actorId, true, author, isFeedback);//checkNotifPreference=true
  	var preferences;
  	if(subObjectSubscribers){
  		var subObjTypeId = this.subscriptionDAO.getSubObjByTableName(subObjectName);
  		for(i=0 ; subObjTypeId && i<subObjectSubscribers.subProfIds.length;i++){
  			try{
  				if(this._getPreferences(subObjectSubscribers.subProfIds[i], subObjTypeId, activityTypeId))
  					subscribers += subObjectSubscribers.subSysIds[i];
  					if(i < subObjectSubscribers.subSysIds.length-1)
  						subscribers += ',';
  			}catch(err){
  				gs.info('ACTSUB:error:' + err.message);
  			}
  		}
  	}
  	return subscribers;
  },
  _getAuthorBasedOnPreferences: function(subObjectName, authorLiveProfileId, objectName){
  	var authorActivityType = this.activityDAO.getActivityType(objectName, "my_content_feedback");
  	var subObjTypeId = this.subscriptionDAO.getSubObjByTableName(subObjectName);
  	try{
  		if(this._getPreferences(authorLiveProfileId, subObjTypeId, authorActivityType.sys_id)){
  			return authorLiveProfileId.document;
  		}
  	}catch(err){
  		gs.info('ACTSUB:error:' + err.message);
  	}
  },
  _getPreferences: function(subObjectSubscriber, subObjTypeId, activityTypeId){
  	var preference = this.subscriptionDAO.getPreferences(subObjectSubscriber, subObjTypeId, activityTypeId);
  	try{
  		if(preference.activities && preference.activities.length > 0
  			&& (parseInt(preference.activities[0].pref_code.user_default) & 1))
  			return true;
  	}catch(err){
  		gs.info('ACTSUB:error:' + err.message);
  	}
  	return false;
  },
  getSubObjList: function(current, topicTable, topicsEnabled){
  	var prefMap = this.subscriptionDAO.getSubObjGlblPref(current);
  	var objList = {};
  	//Check for E-Mail global preference and add objects accordingly
  	if(prefMap[current.actor_name] & 1 == 1){
  		objList.actorId = current.actor_id + '';
  	}
  	if(prefMap[current.object_name] & 1 == 1){
  		objList.objectId = current.object_id + '';
  	}
  	if(prefMap[current.target_name] & 1 == 1){
  		objList.targetId = current.target_id + '';
  	}
  	if(current.additional_field1 && (prefMap[current.additional_field1_name] & 1 == 1) && (!topicTable || (topicsEnabled || current.additional_field1_name != topicTable))){
  		objList.additionalField1Id = current.additional_field1 + '';
  	}
  	if(current.addl_sub_obj2 && (prefMap[current.addl_sub_obj2_name] & 1 == 1) && (!topicTable || (topicsEnabled || current.addl_sub_obj2_name != topicTable))){
  		objList.additionalSubObj2Id = current.addl_sub_obj2 + '';
  	}
  	if(current.addl_sub_obj3 && (prefMap[current.addl_sub_obj3_name] & 1 == 1)){
  		objList.additionalSubObj3Id = current.addl_sub_obj3 + '';
  	}
  	return objList;
  },
  getAllSubObjList: function(current, topicTable, topicsEnabled){
  	var objList = '';
  	if(current.activity_type_id.sys_id == this.BADGE_AWARDED_TYPE)
  		objList =  current.object_id + ',' + current.target_id;
  	else if(current.activity_type_id.verb != this.USER_MENTIONED_VERB)
  		objList = current.actor_id + ',' + current.object_id + ',' + current.target_id;
  	if(current.additional_field1 && (!topicTable || (topicsEnabled || current.additional_field1_name != topicTable)))
  		objList += ',' + current.additional_field1;
  	if(current.addl_sub_obj2 && (!topicTable || (topicsEnabled || current.addl_sub_obj2_name != topicTable)))
  		objList += ',' + current.addl_sub_obj2;
  	if(current.addl_sub_obj3)
  		objList += ',' + current.addl_sub_obj3;
  	return objList;
  },
  
  getAllSubscribers: function(current, activityType){
  	var topicTable = '',
  		topicsEnabled = false;
  	var subObjs;
  	
  	if(this.activitySubContext.isCommunityPluginActive == true){
  		topicTable = sn_communities.CommunityConstants.TOPIC_TABLE;
  		topicsEnabled = sn_communities.CommunityConstants.ENABLE_TOPICS;
  	}
  	
  	subObjs = this.getAllSubObjList(current, topicTable, topicsEnabled);
  	
  	var subscribers = this.subscriptionDAO.getSubscribers(subObjs);
  	if(current.target_name == 'live_profile'
  	   && activityType && activityType.fanout_to_target == true){
  		var targetProfile = this.subscriptionDAO.getLiveProfileRec(current.target_id);
  		if(targetProfile && subscribers && subscribers.subSysIds)
  			subscribers.subSysIds.push(targetProfile.document);
  		else if(targetProfile)
  			subscribers.subSysIds = [targetProfile.document];
  	}
  	if(subscribers && subscribers.subSysIds){
  		if(activityType.sys_id==this.ADVANCED_A_LEVEL_ACTIVITY_TYPE && (!topicTable || (topicsEnabled || current.addl_sub_obj2_name != topicTable))){
  			var targetProfile = this.subscriptionDAO.getLiveProfileRec(current.target_id);
  			var targetsys_id=''+targetProfile.document;
  			var index = subscribers.subSysIds.indexOf(targetsys_id);
  			if (index > -1)
  				subscribers.subSysIds.splice(index, 1);
  		}
  		return new global.ArrayUtil().unique(subscribers.subSysIds).join(',');
  	}
  },

  getActSubCounts: function(liveProfileId, onlyActCount, onlySubsCount){
  	try{
  		var resultsData = this.activitySubContext.getSubscriptionDAO().getActSubCounts(liveProfileId, onlyActCount, onlySubsCount);
  		resultsData.status = '200';
  		return resultsData;
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  getSubscriptionsBySubscriber: function(profile, subObjType, getList, orderBy, firstRow, lastRow, searchString){
  	try{
  		var resultsData = this.activitySubContext.getSubscriptionDAO().getSubscriptionsBySubscriber(profile, subObjType, getList, orderBy, firstRow, lastRow, searchString);
  		resultsData.status = '200';
  		return resultsData;
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  getSubscribersBySubscription: function(subObjId, subObjType, orderBy, firstRow, lastRow, searchString, fetchCount){
  	try{
  		var resultsData = this.activitySubContext.getSubscriptionDAO().getSubscribersBySubscription(subObjId, subObjType, orderBy,
  																									firstRow, lastRow, searchString, fetchCount);
  		resultsData.status = '200';
  		return resultsData;
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  getFollowingsByFollower: function(profile, subObjType, orderBy, firstRow, lastRow, searchString){
  	try{
  		var resultsData = this.activitySubContext.getSubscriptionDAO().getFollowingsByFollower(profile, subObjType, orderBy, firstRow, lastRow, searchString);
  		resultsData.status = '200';
  		return resultsData;
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}

  },
  getSubscriptions: function(profile){
  	return this.subscriptionDAO.getSubscriptions(profile);
  },

  getAllSubObjSubscribers: function(subObjId,actorId) {
  	try{
  		return this.subscriptionDAO.getSubscribers(subObjId,actorId, false).subSysIds;
  	}catch(err){
  	}
  	return [];
  },

  getSubObjSubscribers: function(subObjId,actorId){
  	try{
  		var subscribers = this.subscriptionDAO.getSubscribers(subObjId,actorId, true).subSysIds;
  		return {"status":'200',"subscribers": subscribers};
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },

  getSubscribableObjects: function(setupPref, module){
  	try{
  		var subObjects = this.subscriptionDAO.getSubscribableObjects(setupPref, module);
  		return {"status":'200',"subObjects": subObjects};
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  getPreferences: function(profileId, subObject, activityTypeId){
  	try{
  		var preferences = this.subscriptionDAO.getPreferences(profileId, subObject, activityTypeId);
  		return {status:'200',preferences: preferences};
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  updatePreferences: function(prefData){
  	try{
  		var result = this.subscriptionDAO.updatePreferences(prefData);
  		if(result && result.length > 0)
  			return {"status":'201',"message": 'Preferences updated successfully!', "result": result};
  		return {"status":"200","message": 'Nothing to update!', "result": result};
  	}catch(err){
  		return {"status":"400","error":err.message};
  	}
  },
  
  canFetchPreferences: function(profileId) {
  	return this.subscriptionDAO.canFetchPreferences(profileId);
  },

  hasAccessToSubObjectStream: function(operation, subObjectStream) {
      var userId = subObjectStream.subscriber_id.document;
      if (gs.hasRole('actsub_admin'))
          return true;
      if (pm.isActive('com.sn_communities') && gs.hasRole('sn_communities.community_user')) {
          if (operation == ActivityConstants.READ && gs.getUserID() != userId)
              return false;
          if (operation == ActivityConstants.READ && subObjectStream.sub_obj_type == 'b4e6c9bc530132006242d7b08cc5879c') //do not check for meta subscriptions
              return true; //cannot assert security for non-community objects
          return new sn_communities.CommunityActivityService().hasAccessToSubscription(subObjectStream);
      }
      if (gs.hasRole('actsub_user')) {
          if (operation == ActivityConstants.CREATE)
              return true;
          return gs.getUserID() == userId;
      }
      return false;
  },

  type: 'SubscriptionServiceImpl'
};

Sys ID

450427fe67a722005ab69a6617415afc

Offical Documentation

Official Docs: