-
Notifications
You must be signed in to change notification settings - Fork 0
Quick Start
Setting up the Apex Orbit Framework (AOF) in your Salesforce organization involves deploying its core components and configuring the necessary custom objects and platform events for error handling. This guide assumes you are familiar with Salesforce deployment tools such as Salesforce DX (SFDX), Ant Migration Tool, or Change Sets.
- Salesforce Org: A Salesforce Developer Edition, Sandbox, or Enterprise Edition (or similar) org where you have administrative and deployment permissions.
- Deployment Tool: Your preferred Salesforce deployment tool (SFDX CLI is recommended for modern development).
- Understanding of Apex and Salesforce Metadata: Basic knowledge of Apex classes, triggers, custom objects, and platform events.
This custom metadata type provides configuration settings for the Apex Orbit Framework (AOF) trigger handler. It allows administrators to control trigger behavior without modifying code.
| Field Label | API Name | Data Type | Description |
|---|---|---|---|
| SObject API Name | SObjectApiName__c | Text(255) | API name of the SObject this configuration applies to (e.g., Account, Contact, Custom_Object__c) |
| Active | IsActive__c | Checkbox | Controls whether triggers for this SObject are active |
| Before Insert | BeforeInsert__c | Checkbox | Controls whether Before Insert trigger events are processed |
| After Insert | AfterInsert__c | Checkbox | Controls whether After Insert trigger events are processed |
| Before Update | BeforeUpdate__c | Checkbox | Controls whether Before Update trigger events are processed |
| After Update | AfterUpdate__c | Checkbox | Controls whether After Update trigger events are processed |
| Before Delete | BeforeDelete__c | Checkbox | Controls whether Before Delete trigger events are processed |
| After Delete | AfterDelete__c | Checkbox | Controls whether After Delete trigger events are processed |
| After Undelete | AfterUndelete__c | Checkbox | Controls whether After Undelete trigger events are processed |
| Execution Order | ExecutionOrder__c | Number(18, 0) | Controls the order of execution when multiple handlers exist for the same SObject |
| Environment | Environment__c | Text(50) | Optional field to specify which environment this configuration applies to (e.g., Production, Sandbox, Dev) |
| Description | Description__c | Text(255) | Description of this configuration record |
| Custom Logic | CustomLogic__c | Long Text Area(32768) | Optional field for storing JSON or other configuration data for custom logic |
The core AOF consists of the following Apex classes and metadata components that need to be deployed to your Salesforce org:
-
Core Apex Classes:
AOF_TriggerHandler.clsAOF_Application_Domain.clsAOF_Application_Selector.cls-
AOF_Application_Service.cls(Interface) AOF_Application_UnitOfWork.clsAOF_ErrorHandlerService.cls
-
Error Handling Metadata:
-
Platform Event:
ErrorLogEvent__e-
Fields (Recommended):
-
Timestamp__c(DateTime, Required) -
TransactionId__c(Text(255), Optional) -
OriginatingClassName__c(Text(255), Required) -
OriginatingMethodName__c(Text(255), Required) -
LineNumber__c(Number(10, 0), Optional) -
ErrorMessage__c(Long Text Area(131072), Required) -
StackTrace__c(Long Text Area(131072), Optional) -
SObjectType__c(Text(255), Optional) -
RecordIds__c(Long Text Area(10000), Optional) - Store comma-separated Ids -
Severity__c(Text(50), Required) - e.g., Critical, High, Medium, Low, Info
-
-
Fields (Recommended):
-
Custom SObject:
Error_Log__c- Label: Error Log
- Plural Label: Error Logs
-
API Name:
Error_Log__c -
Fields (to mirror Platform Event and add tracking):
-
ErrorLogName(Auto Number, e.g.,EL-{00000}) -
Timestamp__c(DateTime, Required) -
TransactionId__c(Text(255), Optional, Indexed) -
OriginatingClassName__c(Text(255), Required, Indexed) -
OriginatingMethodName__c(Text(255), Required) -
LineNumber__c(Number(10, 0), Optional) -
ErrorMessage__c(Long Text Area(131072), Required) -
StackTrace__c(Long Text Area(131072), Optional) -
SObjectType__c(Text(255), Optional, Indexed) -
RecordIds__c(Long Text Area(10000), Optional) -
Severity__c(Picklist, Required) - Values: Critical, High, Medium, Low, Info -
Status__c(Picklist, Default: New) - Values: New, Investigating, Resolved, Ignored -
AssignedTo__c(Lookup(User), Optional) -
ResolutionNotes__c(Long Text Area(32768), Optional)
-
-
Apex Trigger for Platform Event:
ErrorLogEventSubscriber.trigger(or a similar name) onErrorLogEvent__e.- This trigger will subscribe to
ErrorLogEvent__eand createError_Log__crecords.
trigger ErrorLogEventSubscriber on ErrorLogEvent__e (after insert) { List<Error_Log__c> logsToCreate = new List<Error_Log__c>(); for (ErrorLogEvent__e event : Trigger.New) { Error_Log__c log = new Error_Log__c( Timestamp__c = event.Timestamp__c, TransactionId__c = event.TransactionId__c, OriginatingClassName__c = event.OriginatingClassName__c, OriginatingMethodName__c = event.OriginatingMethodName__c, LineNumber__c = event.LineNumber__c, ErrorMessage__c = event.ErrorMessage__c, StackTrace__c = event.StackTrace__c, SObjectType__c = event.SObjectType__c, RecordIds__c = event.RecordIds__c, Severity__c = event.Severity__c, Status__c = 'New' // Default status ); logsToCreate.add(log); } if (!logsToCreate.isEmpty()) { // Consider error handling for DML on Error_Log__c itself, though it should be rare. // Using Database.insert with allOrNone=false can log partial successes if needed. Database.insert(logsToCreate, false); } }
- This trigger will subscribe to
-
Platform Event:
-
Example SObject Components (Optional, for reference):
AOF_AccountSelector.clsAOF_AccountDomain.clsAccountTrigger.trigger
-
Organize Project Structure: Ensure your project directory is structured correctly for SFDX. The core classes, platform event, custom object, and event trigger should be in their respective metadata folders (e.g.,
force-app/main/default/classes/,force-app/main/default/platformEvents/,force-app/main/default/objects/,force-app/main/default/triggers/).A conceptual directory structure:
your-sfdx-project/ force-app/main/default/ classes/ AOF_TriggerHandler.cls AOF_TriggerHandler.cls-meta.xml AOF_Application_Domain.cls AOF_Application_Domain.cls-meta.xml AOF_Application_Selector.cls AOF_Application_Selector.cls-meta.xml AOF_Application_Service.cls AOF_Application_Service.cls-meta.xml AOF_Application_UnitOfWork.cls AOF_Application_UnitOfWork.cls-meta.xml AOF_ErrorHandlerService.cls AOF_ErrorHandlerService.cls-meta.xml // Example Account classes (optional) AOF_AccountSelector.cls AOF_AccountSelector.cls-meta.xml AOF_AccountDomain.cls AOF_AccountDomain.cls-meta.xml triggers/ ErrorLogEventSubscriber.trigger ErrorLogEventSubscriber.trigger-meta.xml // Example Account trigger (optional) AccountTrigger.trigger AccountTrigger.trigger-meta.xml platformEvents/ ErrorLogEvent__e.platformEvent-meta.xml objects/ Error_Log__c/ fields/ Timestamp__c.field-meta.xml // ... other Error_Log__c fields Error_Log__c.object-meta.xml // layouts, tabs, permissionsets (optional, for Error_Log__c management) -
Define
ErrorLogEvent__ePlatform Event: Create theErrorLogEvent__e.platformEvent-meta.xmlfile with the field definitions as specified above. Ensure thepublishBehavioris set toPublishAfterCommit(default) orPublishImmediatelybased on your requirements (PublishAfterCommit is generally safer). -
Define
Error_Log__cCustom Object: Create the directory structure and XML files for theError_Log__ccustom object and its fields as detailed in the "Components to Deploy" section. -
Create Apex Classes and Triggers: Place the
.clsand.triggerfiles (along with their corresponding-meta.xmlfiles) in theclassesandtriggersdirectories. -
Authorize Your Org and Deploy: Use the SFDX CLI to authorize your target Salesforce org and deploy the components.
# Authorize your org (if not already done) sfdx auth:web:login --setalias YourOrgAlias # Deploy the source code and metadata sfdx project deploy start --target-org YourOrgAlias
Alternatively, if you have specific components in a package.xml:
sfdx project deploy start --manifest path/to/your/package.xml --target-org YourOrgAlias
-
Permissions for
Error_Log__c:- Ensure relevant user profiles or permission sets have Create and Read access to the
Error_Log__cobject and its fields. Administrators or support personnel might need Edit and Delete permissions as well. - The user context under which the
ErrorLogEventSubscriber.triggerruns will need create permission onError_Log__c. Platform Event triggers run as theAutomated Processuser by default, which usually has broad permissions, but it's good to be aware.
- Ensure relevant user profiles or permission sets have Create and Read access to the
-
Platform Event Subscriber Status:
- After deployment, the
ErrorLogEventSubscriber.triggershould be active. You can verify its status in Setup under "Platform Event Triggers".
- After deployment, the
-
Tab and Layout for
Error_Log__c(Optional):- For easier management of error logs, consider creating a Custom Tab for the
Error_Log__cobject and configuring its page layout.
- For easier management of error logs, consider creating a Custom Tab for the
-
Testing the Error Handling:
- Intentionally cause an error in a test class or an anonymous Apex script that uses
AOF_ErrorHandlerService.logError(...). - Verify that an
ErrorLogEvent__eis published (can be checked via Streaming Monitor or Apex tests that publish events). - Verify that a corresponding
Error_Log__crecord is created.
- Intentionally cause an error in a test class or an anonymous Apex script that uses
Once deployed and configured, you can start using the AOF by:
- Creating SObject-specific triggers that delegate to
AOF_TriggerHandler. - Developing SObject-specific Domain classes (extending
AOF_Application_Domain) to house your record-level business logic. - Developing SObject-specific Selector classes (extending
AOF_Application_Selector) for all your SOQL queries. - Optionally, creating Service classes (implementing
AOF_Application_Service) for more complex, cross-object business logic. - Using
AOF_Application_UnitOfWorkwithin your Domain or Service classes to manage DML operations. - Calling
AOF_ErrorHandlerService.logError(...)within your catch blocks to log exceptions.
Refer to the "Usage Guide and Examples" section for detailed instructions on how to build out these components for your SObjects.

Home
Quick Start
Usage Guide and Examples
Metadata‐Driven Trigger
Best Practices
Core Principles
Framework Architecture and Layers
Trigger Handler Layer
Service Layer
Domain Layer
Selector Layer
Unit of Work Layer
Error Handling Framework
Trigger Execution Flow
Scalability and Performance
Security Considerations
Core Components In-Depth
Error Handling In-Depth
Customization and Extension