An easier way to do Apex record sharing.
Divvy myDivvy = new Divvy();
// One record to one User or Group
myDivvy.registerRead(mySObject.Id, userOrGroupId);
myDivvy.registerEdit(mySObject.Id, userOrGroupId);
myDivvy.RegisterRevoke(mySObject.Id, userOrGroupId);
// One record to many Users or Groups
myDivvy.registerRead(mySObject.Id, userOrGroupIdSet);
myDivvy.registerEdit(mySObject.Id, userOrGroupIdSet);
myDivvy.RegisterRevoke(mySObject.Id, userOrGroupIdSet);
// Many records to one User or Group
myDivvy.registerRead(recordIdSet, userOrGroupId);
myDivvy.registerEdit(recordIdSet, userOrGroupId);
myDivvy.RegisterRevoke(recordIdSet, userOrGroupId);
// Many records to many Users or Groups
myDivvy.registerRead(recordIdSet, userOrGroupIdSet);
myDivvy.registerEdit(recordIdSet, userOrGroupIdSet);
myDivvy.RegisterRevoke(recordIdSet, userOrGroupIdSet);
// Finally, write the Share Record updates to the database
myDivvy.commitShares();
It's best to show with some examples of how Apex Recording Sharing is done normally.
CaseShare myObjectShare =
new CaseShare(
CaseId=myObject.Id,
CaseAccessLevel=...,
UserOrGroupId=...
);
Share SObject Name:
- name of the SObject being shared + Share
Share SObject Fields:
- CaseId - Id for Case SObject being shared
- CaseAccessLevel - Access Level to grant
Note, both the fields include the name of the SObject being shared
MyCustomObject__Share myObjectShare =
new MyCustomObject__Share(
ParentId=myObject.Id,
AccessLevel=...,
UserOrGroupId=...
);
Share SObject Name:
- name of the SObject being shared + __Share
Share SObject Fields:
- ParentId - Id for Custom SObject being shared
- AccessLevel - Access Level to grant
Note, both the fields do not include the name of the SObject being shared
ServiceAppointmentShare myObjectShare =
new ServiceAppointmentShare(
ParentId=myObject.Id,
AccessLevel=...,
UserOrGroupId=...
);
Share SObject Name:
- name of the SObject being shared + Share
Share SObject Fields:
- ParentId - Id for Custom SObject being shared
- AccessLevel - Access Level to grant
Note, both the fields do not include the name of the SObject being shared
Wait... Aren't Field Service SObjects considered Standard?
Yes, they are. Do a getDescribe().isCustom()
and you'll see false
.
However, Field Service, formerly Field Service Lightning and external to
Salesforce, SObjects used to be custom objects before Salesforce
acquired the company. Now that Field Service is part of Salesforce, the
__c
and __Share
were dropped, but the Share
SObject retains the Custom Share SObject field names.