SlideShare a Scribd company logo
1 of 65
Download to read offline
Tooling API - Get Your Tooling
Game On
L’arme secrete (mais pas tant) des développeurs et
admins Salesforce
Developer Group Paris
Fabrice Challier
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
Fabrice Challier
CONSULTANT SALESFORCE /
TECH LEAD / FORMATEUR
Qui suis je?
• Senior developpeur
(specialiste Java)
• Consultant Salesforce / tech
lead / formateur
(dex450,dex602)
Competences :
• Paresse (expert)
TOOLING API
USAGES DE L’OUTILS
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 ?
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 ??
Metadata Api vs Tooling Api
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
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
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 ….
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 (…){}
CRUD via la toolingApi en apex (2/2)
Création d’un CustomLabel
Modification
Suppression
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
Monitorer les entités que l’on souhaite tracer
Exemple de suivi d’un trace all users
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
Couverture de classe dans un tableau triable
Couverture d’une classe par efficacité
Afficher la couverture des classes d’un projet sfdx
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 …
Utilisation executeAnonymous
Utilisation executeAnonymous pour les LWC (1/2)
Utilisation executeAnonymous pour les LWC(2/2)
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
Demo Time
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
Exemple d’un headDump obtenu via le debugger salesforce
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
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é
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
Symbol Table (code examples)
Symbol Table (Apex Class)
Générée à chaque modification de la classe (donc facile à exploiter)
Symbol Table (ApexClassMember / ApexTriggerMember)
Doit être généré par du code
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
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
The Tooling API, is it for me?
Of course, we'll see why
by Fabrice Challier & Doria Hamelryk
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?
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
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
Salesforce Developer Group Paris - March 23, 2023
Tooling API
Why and how to use it
Useful for developers
● Search Metadata in SOQL
● Enabling debug mode & Debugging
● Test execution and code coverage analysis
● Class structure analysis
● Configuration modification
● Package generation
● Many more…
Tooling API Usage
Useful for admins
● Naming convention
● Object & Fields description
● Sharing Model analysis
● Wording of Validation Rules
● Layout not assigned
● Object Limits monitoring
● Many more…
Workbench Developer Console
Tooling API : query Tools
Inspector (chrome extension)
Admin Booster
(https://www.adminbooster.com/)
Tooling API : query Tools
Salesforce Developer Group Paris - March 23, 2023
Tooling API
Use Cases & Script Samples: SOQL
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
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’
select
DurableId,DeveloperName,description,InternalSharingModel,ExternalSharingModel,Qualifie
dApiName
from EntityDefinition
where PublisherId ='<local>' and qualifiedapiname like '%__c'
“I want to see ALL my custom objects and check best practices related to their
name, description and sharing models”
Use Case : Custom objects definition & sharing
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
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
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
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
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
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
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 !
select
id, developername, EntityDefinition.QualifiedApiName
from customfield
“I want to know which custom field is never displayed on layouts”
Use Case : Unused Fields (Step 2 on 3)
Field ID Object API
Field API
Tricky
One !
=VLOOKUP(A2;Depend!D:D;1;0)
=VLOOKUP(CELL_WITH_ID_FROM_FIELDS_LIST;TAB_WITH_DEPENDENCIES_LIST!COLUMN_WITH_RefMetadataComponentId;1;0)
“I want to know which custom field is never displayed on layouts”
Use Case : Unused Fields (Step 3 on 3)
One tab with
dependencies list
One tab with fields list
One Vlookup formula
Tricky
One !
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 !
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
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
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
Salesforce Developer Group Paris - March 23, 2023
Tooling API
Conclusion
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
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
Salesforce Developer Group Paris - March 23, 2023
Thank You

More Related Content

Similar to La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !

Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv PsGregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)SmartnSkilled
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
AOP.pptx
AOP.pptxAOP.pptx
AOP.pptxManalAg
 
Play Framework
Play FrameworkPlay Framework
Play FrameworkArmaklan
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsOCTO Technology
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 

Similar to La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi ! (20)

Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv Ps
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
sfPot aop
sfPot aopsfPot aop
sfPot aop
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)
Support formation vidéo : OCA Java SE 8 Programmer (1Z0-808) (1)
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
AOP.pptx
AOP.pptxAOP.pptx
AOP.pptx
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les fronts
 
ATL et SVG
ATL et SVGATL et SVG
ATL et SVG
 
Apache ANT
Apache ANTApache ANT
Apache ANT
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Flex Unit Testing
Flex Unit TestingFlex Unit Testing
Flex Unit Testing
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 

More from Paris Salesforce Developer Group

Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?
Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?
Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?Paris Salesforce Developer Group
 
Mon Expérience avec le Certified Technical Architect Review Board
 Mon Expérience avec le Certified Technical Architect Review Board Mon Expérience avec le Certified Technical Architect Review Board
Mon Expérience avec le Certified Technical Architect Review BoardParis Salesforce Developer Group
 
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...Paris Salesforce Developer Group
 
Pratiques administration avancées et techniques de développement
Pratiques administration avancées et techniques de développementPratiques administration avancées et techniques de développement
Pratiques administration avancées et techniques de développementParis Salesforce Developer Group
 
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15Paris Salesforce Developer Group
 
Versionning et travail en équipe avec Salesforce - 27/11/2014
Versionning et travail en équipe avec Salesforce - 27/11/2014Versionning et travail en équipe avec Salesforce - 27/11/2014
Versionning et travail en équipe avec Salesforce - 27/11/2014Paris Salesforce Developer Group
 
Paris Salesforce Developer Group - 16 09 2014 - Summer '14
Paris Salesforce Developer Group - 16 09 2014 - Summer '14Paris Salesforce Developer Group - 16 09 2014 - Summer '14
Paris Salesforce Developer Group - 16 09 2014 - Summer '14Paris Salesforce Developer Group
 

More from Paris Salesforce Developer Group (19)

Pour Noël, devenez chrome extensioniste!
Pour Noël, devenez chrome extensioniste!Pour Noël, devenez chrome extensioniste!
Pour Noël, devenez chrome extensioniste!
 
GraphQL (la nouvelle API de référence de Salesforce ?!)
GraphQL (la nouvelle API de référence de Salesforce ?!)GraphQL (la nouvelle API de référence de Salesforce ?!)
GraphQL (la nouvelle API de référence de Salesforce ?!)
 
Introduction à la plateforme Anypoint de MuleSoft
Introduction à la plateforme Anypoint de MuleSoftIntroduction à la plateforme Anypoint de MuleSoft
Introduction à la plateforme Anypoint de MuleSoft
 
Release spring '22 - Community Groups français
Release spring '22 - Community Groups françaisRelease spring '22 - Community Groups français
Release spring '22 - Community Groups français
 
Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?
Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?
Scratch orgs...vous pensiez en avoir terminé avec les sandboxes ?
 
Mon Expérience avec le Certified Technical Architect Review Board
 Mon Expérience avec le Certified Technical Architect Review Board Mon Expérience avec le Certified Technical Architect Review Board
Mon Expérience avec le Certified Technical Architect Review Board
 
Mieux acheminer les emails avec salesforce
Mieux acheminer les emails avec salesforceMieux acheminer les emails avec salesforce
Mieux acheminer les emails avec salesforce
 
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
 
Dreamforce Global Gathering
Dreamforce Global GatheringDreamforce Global Gathering
Dreamforce Global Gathering
 
Getting started with Salesforce DX
Getting started with Salesforce DXGetting started with Salesforce DX
Getting started with Salesforce DX
 
Pratiques administration avancées et techniques de développement
Pratiques administration avancées et techniques de développementPratiques administration avancées et techniques de développement
Pratiques administration avancées et techniques de développement
 
Sensibilisation à la Sécurité Salesforce
Sensibilisation à la Sécurité SalesforceSensibilisation à la Sécurité Salesforce
Sensibilisation à la Sécurité Salesforce
 
Salesforce Performance hacks - Client Side
Salesforce Performance hacks - Client SideSalesforce Performance hacks - Client Side
Salesforce Performance hacks - Client Side
 
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15
Introducing salesforce shield - Paris Salesforce Developer Group - Oct 15
 
Meetup 06/2015 - @testsetup
Meetup 06/2015 - @testsetupMeetup 06/2015 - @testsetup
Meetup 06/2015 - @testsetup
 
Meetup Custom Metadata - 1st Part
Meetup Custom Metadata - 1st PartMeetup Custom Metadata - 1st Part
Meetup Custom Metadata - 1st Part
 
Lightning week - Paris DUG
Lightning week - Paris DUGLightning week - Paris DUG
Lightning week - Paris DUG
 
Versionning et travail en équipe avec Salesforce - 27/11/2014
Versionning et travail en équipe avec Salesforce - 27/11/2014Versionning et travail en équipe avec Salesforce - 27/11/2014
Versionning et travail en équipe avec Salesforce - 27/11/2014
 
Paris Salesforce Developer Group - 16 09 2014 - Summer '14
Paris Salesforce Developer Group - 16 09 2014 - Summer '14Paris Salesforce Developer Group - 16 09 2014 - Summer '14
Paris Salesforce Developer Group - 16 09 2014 - Summer '14
 

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 ??
  • 7. Metadata Api vs Tooling Api
  • 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
  • 14. Monitorer les entités que l’on souhaite tracer
  • 15. Exemple de suivi d’un trace all users
  • 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
  • 17. Couverture de classe dans un tableau triable
  • 18. Couverture d’une classe par efficacité
  • 19. Afficher la couverture des classes d’un projet sfdx
  • 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
  • 27. Exemple d’un headDump obtenu via le debugger salesforce
  • 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
  • 31. Symbol Table (code examples)
  • 32. Symbol Table (Apex Class) Générée à chaque modification de la classe (donc facile à exploiter)
  • 33. Symbol Table (ApexClassMember / ApexTriggerMember) Doit être généré par du code
  • 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
  • 36.
  • 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
  • 41. Salesforce Developer Group Paris - March 23, 2023 Tooling API Why and how to use it
  • 42. Useful for developers ● Search Metadata in SOQL ● Enabling debug mode & Debugging ● Test execution and code coverage analysis ● Class structure analysis ● Configuration modification ● Package generation ● Many more… Tooling API Usage Useful for admins ● Naming convention ● Object & Fields description ● Sharing Model analysis ● Wording of Validation Rules ● Layout not assigned ● Object Limits monitoring ● Many more…
  • 44. Inspector (chrome extension) Admin Booster (https://www.adminbooster.com/) Tooling API : query Tools
  • 45. Salesforce Developer Group Paris - March 23, 2023 Tooling API Use Cases & Script Samples: SOQL
  • 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’
  • 48. select DurableId,DeveloperName,description,InternalSharingModel,ExternalSharingModel,Qualifie dApiName from EntityDefinition where PublisherId ='<local>' and qualifiedapiname like '%__c' “I want to see ALL my custom objects and check best practices related to their name, description and sharing models” Use Case : Custom objects definition & sharing
  • 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 !
  • 56. select id, developername, EntityDefinition.QualifiedApiName from customfield “I want to know which custom field is never displayed on layouts” Use Case : Unused Fields (Step 2 on 3) Field ID Object API Field API Tricky One !
  • 57. =VLOOKUP(A2;Depend!D:D;1;0) =VLOOKUP(CELL_WITH_ID_FROM_FIELDS_LIST;TAB_WITH_DEPENDENCIES_LIST!COLUMN_WITH_RefMetadataComponentId;1;0) “I want to know which custom field is never displayed on layouts” Use Case : Unused Fields (Step 3 on 3) One tab with dependencies list One tab with fields list One Vlookup formula 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
  • 62. Salesforce Developer Group Paris - March 23, 2023 Tooling API Conclusion
  • 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
  • 65. Salesforce Developer Group Paris - March 23, 2023 Thank You