2016-04-18

Apexでコミュニティロールの共有設定

Apexを使って、コミュニティのロールに対して共有レコードを割り当てる時の備忘録。

カスタマーコミュニティ(Customer Community Plusのみ)とパートナーコミュニティでは取引先に対してロールが割り当てられているので、以下のフローでロールに対する共有レコードを割り当てることが可能です。

  1. 共有対象(コミュニティユーザ)のAccountIDをキーにUserRoleを取得
  2. UserRoleのIDをキーにGroupを取得
  3. GroupのIDを使って共有レコードを作成
具体的には以下のようなコードになります。
Id accId = '{input your account id}';
List<UserRole> roles = [
    SELECT
        id,
        PortalAccountId,
        Name
    FROM
        UserRole
    WHERE
        PortalAccountId = :accId
        AND
        PortalRole = 'Worker' // or 'Executive', 'Manager'
];

List<Group> groups = [
    SELECT 
        Id,
        RelatedId,
        Type
    FROM 
        Group
    WHERE
        RelatedId = :roles[0].Id
        AND
        Type = 'RoleAndSubordinates' // or 'Role'
];

insert new AccountShare(
    RowCause = 'Manual',
    AccountId = accId,
    UserOrGroupId = groups[0].Id,
    AccountAccessLevel = 'Edit',
    ContactAccessLevel = 'Edit',
    OpportunityAccessLevel = 'Edit',
    CaseAccessLevel = 'Edit'
);

取引先1つ当たりのロールを1つ以上に指定した場合は、UserRoleが複数取得されてしまうので、PortalRoleに"Executive"、"Manager"、"Worker"を指定して絞り込めば、それぞれ"エグゼクティブ"、"マネージャ"、"ユーザ"なロールを取得することが出来ます。

RoleAndSubordinatesはロール&下位ロールを指します。

参考URL

このエントリーをはてなブックマークに追加