ApexでSalesforceのアプリケーションメニューを取得する
Salesforceの右上メニューのアプリケーション一覧を取得したくて、REST APIで取得したら問題が起きたので、Apexで実現した。
だめな例
よくこのように書いてあるが、これだとだめ。
参考:apex - How to Get App Name - Salesforce Stack Exchange
SELECT Id, Name, Label FROM AppMenuItem WHERE Type = 'TabSet'
- REST API
- システム管理者以外だと何も取得できない。
- Apex
-
with sharing
をつけても権限にかかわらず何でも取得できてしまう。 - 「サンプルコンソール」のような謎なアプリケーションも取得できてしまう。
-
正解
正解は以下のようにする。
@RemoteAction
global static List<AppMenuItem> getAppMenuItems(){
String loginUserId = UserInfo.getUserId();
List<SetupEntityAccess> entities = [
SELECT SetupEntityId
FROM SetupEntityAccess
WHERE ParentId
IN (select PermissionSetId from PermissionSetAssignment where AssigneeId = :loginUserId)
AND SetupEntityType = 'TabSet'
];
List<Id> entityIds = new List<Id>();
for(SetupEntityAccess entity : entities) {
entityIds.add(entity.SetupEntityId);
}
List<AppMenuItem> menus = [
SELECT Id, Name, Label, NamespacePrefix
FROM AppMenuItem
WHERE ApplicationId IN :entityIds
ORDER BY SortOrder ASC
];
return menus;
}
これでプロファイルであるアプリケーションを参照不可にすればちゃんと結果から除かれる。
「サンプルコーンソール」のような謎のアプリケーションも含まれなくなる。