From 75e5cb761a5200130889294618dbc123ba6972ab Mon Sep 17 00:00:00 2001 From: tobotronprime Date: Mon, 11 Sep 2017 16:07:16 +0100 Subject: [PATCH] Create PBBUnsharing.cls creates an un share to group block to compliment the share to group block --- src/classes/PBBUnsharing.cls | 117 +++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/classes/PBBUnsharing.cls diff --git a/src/classes/PBBUnsharing.cls b/src/classes/PBBUnsharing.cls new file mode 100644 index 0000000..8acef32 --- /dev/null +++ b/src/classes/PBBUnsharing.cls @@ -0,0 +1,117 @@ +/** + * @name PBBUnsharing + * @description ProcessBuilderBlock class to offer the unsharing functionality + * @revision + * Tobotron 26-01-2017 Created class + */ +public with sharing class PBBUnsharing { + + @InvocableMethod(label = 'Unshare record from User or Group') + public static void unshareRecordFromUserOrGroup(List requests) { + + Map shareTableHelperMap = new Map(); + + ShareTableHelper tShareTableHelper = null; + Schema.sObjectType tObjectType = null; + String tShareTableName = null; + + for (UnshareRecordRequest aReq : requests) { + + tObjectType = aReq.recordId.getSObjectType(); + tShareTableName = getShareTableName(tObjectType); + + if (shareTableHelperMap.containsKey(tShareTableName)) { + tShareTableHelper = shareTableHelperMap.get(tShareTableName); + tShareTableHelper.recordSet.add(aReq); + } else { + tShareTableHelper = new ShareTableHelper(tShareTableName, getIdFieldName(tObjectType), new Set {aReq}); + shareTableHelperMap.put(tShareTableName, tShareTableHelper); + } + } + System.debug(LoggingLevel.DEBUG, 'PBBUnsharing.unshareRecordFromUserOrGroup; shareTableHelperMap is: ' + shareTableHelperMap); + + List listToDelete = new List(); + + String tQuery = null; + ShareTableHelper tShareTableHelperX = null; + List singleObjectList = null; + Set tRecordSet = null; + + for (String aShareTableName : shareTableHelperMap.keySet()) { + + tShareTableHelperX = shareTableHelperMap.get(aShareTableName); + System.debug(LoggingLevel.DEBUG, 'PBBUnsharing.unshareRecordFromUserOrGroup; tShareTableHelperX is: ' + tShareTableHelperX); + + tQuery = 'SELECT Id FROM ' + aShareTableName + ' WHERE RowCause = \'Manual\'' + generateWhereClause(tShareTableHelperX); + System.debug(LoggingLevel.DEBUG, 'PBBUnsharing.unshareRecordFromUserOrGroup; tQuery is: ' + tQuery); + + singleObjectList = Database.query(tQuery); + System.debug(LoggingLevel.DEBUG, 'PBBUnsharing.unshareRecordFromUserOrGroup; singleObjectList is: ' + singleObjectList); + + if (!singleObjectList.isEmpty()) { + listToDelete.addAll(singleObjectList); + } + } + + System.debug(LoggingLevel.DEBUG, 'PBBUnsharing.unshareRecordFromUserOrGroup; listToDelete is: ' + listToDelete); + if (!listToDelete.isEmpty()) { + Database.Delete(listToDelete, false); + } + } + + private static String getIdFieldName(Schema.sObjectType pObjectType) { + if (String.valueOf(pObjectType).contains('__c')) { + return 'ParentID'; + } else { + return String.valueOf(pObjectType) + 'Id'; + } + } + + private static String getShareTableName(Schema.sObjectType pObjectType) { + + String shareTableName = null; + + if (String.valueOf(pObjectType).contains('__c')) { + shareTableName = String.valueOf(pObjectType).removeEnd('c') + 'Share'; + } else { + shareTableName = String.valueOf(pObjectType) + 'Share'; + } + + return shareTableName; + } + + private static String generateWhereClause(ShareTableHelper helper) { + String tResult = ' AND ('; + + for (UnshareRecordRequest aReq : helper.recordSet) { + tResult += ' ( ' + helper.idFieldName + ' = \'' + aReq.recordId + '\' AND UserOrGroupId = \'' + aReq.userOrGroupId + '\' )'; + tResult += ' OR '; + } + // remove last OR + tResult = tResult.substring(0, tResult.length() - 4); + tResult += ')'; + + return tResult; + } + + public class UnshareRecordRequest { + + @InvocableVariable(required = true label = 'Record Id') + public Id recordId; + + @InvocableVariable(required = true label = 'User or Group Id') + public Id userOrGroupId; + } + + public class ShareTableHelper { + public String shareTableName; + public String idFieldName; + public Set recordSet; + + public ShareTableHelper(String pShareTableName, String pIdFieldName, Set pRecordSet) { + this.shareTableName = pShareTableName; + this.idFieldName = pIdFieldName; + this.recordSet = pRecordSet; + } + } +}