La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
Mar. 27, 2023•0 likes•103 views
Download to read offline
Report
Internet
Durant cette session, on va vous montrer les différentes fonctions de la Tooling API avec des cas d'utilisations concrets.
Et vous présentera quelques requêtes SOQL en Tooling API utilisable au quotidien ( Dev ou Admin)
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
1. Tooling API - Get Your Tooling
Game On
L’arme secrete (mais pas tant) des développeurs et
admins Salesforce
Developer Group Paris
Fabrice Challier
2. Forward Looking Statements
Ceci ne s’applique pas pour tout ce que vous verrez par la suite :
▪ L’intégralité de ce que vous verrez à été fait
par un développeur qui n’est pas un
cascadeur, donc vous vous pouvez aussi le
faire ☺
▪ Aucune org salesforce n’a été blessée ou
tuée durant l’ensemble des phases de
développement et de test
3. Fabrice Challier
CONSULTANT SALESFORCE /
TECH LEAD / FORMATEUR
Qui suis je?
• Senior developpeur
(specialiste Java)
• Consultant Salesforce / tech
lead / formateur
(dex450,dex602)
Competences :
• Paresse (expert)
5. Quizz 1/2
➔ select count() from FieldDefinition where EntityDefinitionId ='Case' and QualifiedApiName like '%__c
➔ select count() from FieldDefinition where EntityDefinitionId ='Case' and QualifiedApiName like '%__c'
(via la tooling)
Ces 2 requêtes retournent toujours le même nombre ?
6. Quizz 2/2
➔ La tooling permet d’injecter une requête SOQL dans une transaction.
C’est un hack ?? Mais que fait la police Salesforce
Ou Salesforce me laisse faire sans aucune conséquence ??
➔ La tooling permet d’injecter du code Apex dans une transaction (même en Prod et sans déploiement).
C’est un hack ?? Scandale, appelons l’armée , c’est inacceptable ?
Ou Salesforce me laisse faire sans aucune conséquence ??
8. Les objets de la tooling Api
En Spring 23 :
Salesforce expose actuellement 249 objets via la tooling Api
https://developer.salesforce.com/docs/atlas.en-us.api_toolin
g.meta/api_tooling/reference_objects_list.htm
9. TOOLING API
• Création/Modification/Suppression de config
• Activation du debug mode en masse
• Exécution des tests et analyse couverture de code
• Analyse de la structure des classes
• Débogage
• Exécution de code anonyme
• Recherche en SOQL
Une seule API mais plusieurs usages différents possibles
10. Fonction création/update/delete et soql
Création ou update de metadata
Exemples d’utilisation :
• Création d’une application pour tester des formules
• Création de traceFlag automatisé
• Suppression par script de record ( customMetadata, flow obsolete , etc
…)
• Etc ….
11. CRUD via la toolingApi en apex (1/2)
Méthode pour Créer , Modifier, Supprimer un objet via la tooling Api :
1. Public static void createObject(…){}
2. public static void updateObject(…){}
3. public static void deleteObject(…){}
4. public static void crud (…){}
12. CRUD via la toolingApi en apex (2/2)
Création d’un CustomLabel
Modification
Suppression
13. Fonction debug log
L’objet DebugLevel :
•Choix du level pour (ApexCode,ApexProfiling,Callout, etc …)
L’objet TraceFlag:
•Choix du debugLevel (DebugLevelId)
•Choix de l’entité à tracer (User, Classe,Apex Trigger,Automated Process)
•Date d’expiration de la trace (max 24h00)
Exemples d’utilisation :
Modifier une trace pour pouvoir logger plus de 24h00 une action spécifique via un batch
Pouvoir automatiquement tracer un utilisateur lorsqu’on utilise la fonction loginAs
Pouvoir réécrire complétement l’interface des log à votre convenance
16. Fonction TestResult / Code coverage
• L’objet ApexCodeCoverage :
• ApexClassOrTriggerId
• TestMethodName
• NumLinesCovered
• NumLinesUncovered
• Coverage (detail de la couverture ligne par ligne)
Exemples d’utilisation :
Rechercher avec précisions comment une classe est couverte en vue d’en faciliter le
déploiement en l’absence d’une classe de test correspondante
Créer une interface de visualisation de la couverture plus flexible que la console
20. Fonction execute anonymous/execution des classes
de test
• Objectifs :
• Pouvoir exécuter du code Apex à partir d’un simple appel
à un web service
Exemples d’utilisation :
Création d’un écran d’execution qui n’affiche que les debug
Création d’un écran pour afficher le resultat json retournée par une méthode (mocking lwc)
Etc …
24. Fonction debugging
ApexExecutionOverlayAction :
•ActionScriptType(None,SOQL,Apex) , isDumpingHead,Iteration,Line
ApexExecutionOverlayResult :
•ApexResult, ClassName, HeapDump, OverlayResultLength,SoqlResult
Exemples d’utilisation :
● Permet d'exécuter du soql, un dump ou même du code apex à chaud
● WARNING : Exécuter du code apex stop la transaction au moment de l’execution. Le
resultat n’est affiché que dans la log pas dans l’objet result
26. Features non exposé aujourd’hui
Utilisation du debugger avec un requête
Warning :
Mettre à jour un ApexExecutionOverlayAction ne reset pas l’expirationDate.
Il est préférable de le détruire et de le recréer
28. Résumé des fonctions
Breakpoint : limité à ce que les logs contiennent
Checkpoint (vscode) : limité à dumper à un instant du code la mémoire de SF durant la
première itération et pour l’utilisateur connecté
Debugger : dump à la n ième itération , pour tout user , peut executer une requete soql et peut
injecter du code apex à chaud
29. Résumé des informations
Afficher les checkpoint :
select ActionScriptType ,ExecutableEntityName ,IsDumpingHeap ,Iteration ,line,Scope.Name,ExpirationDate from ApexExecutionOverlayAction
Afficher les resultats :
select Id,ActionScriptType,ClassName,IsDumpingHeap,Iteration,OverlayResultLength,UserId from ApexExecutionOverlayResult
Récupérer un dump :
select HeapDump from ApexExecutionOverlayResult where id='XXXX'
Récupérer le resultat d’une requete soql :
select SOQLResult from ApexExecutionOverlayResult where id='XXXX'
Récupérer le resultat d’un code apex injecté :
Les informations sont dans le debug log généré
30. Symbol Table
Definition :
Type complexe contenant les différents éléments de votre classe , ApexTriggerMember ou
ApexClassMember
Exemples :
- Attribut de la classe : annotations , interface
- Propriétés de la classe : type, utilisé* , annotations , modificateurs (public,privé, static …), position dans le code
- Méthodes de la classe : utilisé*, annotations , modificateurs (public,privé, static …) , position dans le code
- Variables des méthodes : type, utilisé*
- Méthodes utilisés venant d’une autre classe
34. Modèle de données
ApexClass
Id
Body
ApexTriggerMember
ApexTrigger Id
ApexTrigger Body
MetadaContainer Id
MetadaContainer
Name (unique name)
ContainerAsyncRequest
MetadaContainer Id
Create and wait until it is processed by Salesforce
ApexPage
Id
Body
ApexTrigger
Id
Body
ApexClassMember
ApexClass Id
ApexClass Body
MetadaContainer Id
ApexPageMember
ApexClass Id
ApexClass Body
MetadaContainer Id
35. Quelques Liens utiles
▪ L’ensemble des objets manipulables via la tooling Api :
Tooling API Objects
• Un site qui explique comment générer les symboltable en apex:
https://andyinthecloud.com/2013/02/02/spring-cleaning-apex-code-with-the-tooling-api/
• Github :
https://github.com/elchacha/ToolingApiDemo
Si vous avez des questions , vous pouvez m’écrire à :
fabrice.challier@gmail.com
37. The Tooling API, is it for me?
Of course, we'll see why
by Fabrice Challier & Doria Hamelryk
38. Jani Souryavongsa
Role Model ◡̈
Fabrice Challier
Managing Director @Little Chaman
Salesforce Technical Lead
Salesforce Trainer @ISDI (dex450, dex602)
Toulouse User Group, Community Group Leader
Who are we?
39. Salesforce Developer Group Paris - March 23, 2023
Objectives of this session
● Present the Tooling Api
● Explain how it can be used by Admins
● Show Use Cases and Ready-to-use scripts
40. Metadata API Tooling API (since Spring ‘2013)
available in SOAP only available in REST, SOAP and SOQL
Retrieve results in nodes Retrieve results in list
Used for configuration migration Used for platform, for debugging, code coverage,…
Results - Shared info (with Metadata API):
Results - Additional info:
Select
CreatedById, CreatedBy.Name, CreatedDate, fullname, Id, LastModifiedById,
LastModifiedBy.Name, LastModifiedDate, ManageableState, Description,
ErrorDisplayField, ErrorMessage, ValidationName, Active
from ValidationRule
where EntityDefinition.DeveloperName ='Case' and Id='03d3z000000QlbjAAC'
Tooling API Query :
Difference between Metadata API & Tooling API
46. select
Id,CreatedBy.Name, CreatedDate, LastModifiedBy.Name, LastModifiedDate,
DeveloperName, EntityDefinition.DeveloperName, Description
from CustomField
“I want to see ALL custom fields created and check if they all have a description.”
Use Case : Custom Fields
47. The EntityDefinition : key for everything
select DeveloperName from CustomField where…
Standard Field?
Then use the ID directly with the Object API
…EntityDefinitionId ='Case’
Custom Field?
Then use the QualifiedApiName with the Object API
…EntityDefinition.QualifiedApiName = ‘MyObject__c’
OR
DeveloperName without ‘__c’
…EntityDefinition.DeveloperName = ‘MyObject’
49. select
DurableId,DeveloperName, issearchable, IsReportingEnabled, IsFieldHistoryTracked
from EntityDefinition
where PublisherId ='<local>' and qualifiedapiname like '%__c'
“I want to see on which custom object I can perform searches, reporting and
history tracking”
Use Case : Custom objects search & reporting
50. Select
Id, EntityDefinition.DeveloperName, Active, ValidationName, ErrorDisplayField,
ErrorMessage, Description
from ValidationRule
“I want to see all validation rules, check if they are active or not
and if error messages are homogeneous (wording)”
Use Case : Validation rules definition
51. Select
Id, EntityDefinition.DeveloperName, Active,ValidationName, ErrorDisplayField,
ErrorMessage, Description
from ValidationRule
where ErrorMessage like '%date%'
“I want to retrieve the validation rules having a specific Error Message”
Use Case : Validation rules messages
52. select
Id, Name, TableEnumOrId
from Layout
where Id not in (select LayoutId from ProfileLayout where RecordTypeId !=null) and
layoutType ='Standard'
“I want to list all layout that are not assigned to any profile”
Use Case : Layout assignment
53. select
MasterLabel, ProcessType, RunInMode, Status, Description
from Flow
where Status != 'Obsolete'
“I want to clean up my Automation (and kill Process Builders!)”
Use Case : Automation analysis
54. select
Type, Label, Remaining, Max, EntityDefinitionid
from EntityLimit
where EntityDefinitionid='Account'
“I want to monitor my object limit”
Use Case : Limits monitoring
⚠ Requires EntityDefinitionId or DurableId filter
55. select
MetadataComponentId, MetadataComponentName, MetadataComponentType,
RefMetadataComponentId, RefMetadataComponentName,RefMetadataComponentType
from MetadataComponentDependency
where MetadataComponentType = 'Layout' and RefMetadataComponentType='CustomField'
“I want to know which custom field is never displayed on layouts”
Use Case : Unused Fields (Step 1 on 3)
Layout ID Field ID
Layout Name Field API
Tricky
One !
58. Salesforce Developer Group Paris - March 23, 2023
Be careful with
MetadataComponentDependency
Never forget Salesforce limits :)
● You can only retrieve 2k
records with your query
● If you have > 2k records,
results will be truncated,
and not necessary to 2k records
:)
● You don’t have any warning !
59. select
ApiVersion, Category, DeveloperName, IsReleased,
ReleaseLabel, SupportsRevoke, StepStage, Title,
Description
from ReleaseUpdate where IsReleased=false
“I want to monitor all release updates and
check actions that need to be performed”
Use Case : Release updates
60. select
CreatedBy.Name, CreatedDate, Description, EndDate, LicenseType, SandboxInfoId,
SandboxName, source.SandboxName, Status, SystemModstamp from SandboxProcess
“I want to list all my sandboxes and their history (creation, refresh, delete)”
Use Case : Sandbox monitoring
61. select count() from FieldDefinition where EntityDefinitionId ='Case' and
QualifiedApiName like '%__c
FieldDefinition answer
Non tooling Api : la requête ne voit que les champs visible par l’utilisateur exécutant la
requête
Tooling Api : la requête voit tous les champs y compris ceux qui ne sont pas visible
63. Salesforce Developer Group Paris - March 23, 2023 27
● Tooling API is a powerful tool to retrieve Config
and Dev information
● It can be used by anyone having basic
knowledge of SOQL
● It’s possible to automate Health Check with the
Tooling API
● All capabilities are documented on
https://developer.salesforce.com/docs/atlas.en-us.234.0.api_to
oling.meta/api_tooling/reference_objects_list.htm
Tooling API: Summary
64. To go further
Ask help to your developer buddies if you don’t know
how to build your query.
Who knows, he/she could also learn something new :)
Do not hesitate to contact us if you have any question :
Doria Hamelryk : doria.hamelryk@gmail.com
Fabrice Challier : fabricechallier@gmail.com
This presentation and all the queries are available here :
bit.ly/cztooling