- Skill ID
- jaganpro/sf-skills/sf-industry-commoncore-callable-apex
- Publisher
- jaganpro
- Repository
- sf-skills
- Installs
- 0
- Files
- 17
- License
- MIT
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
jaganpro/sf-skills/sf-industry-commoncore-callable-apexInstalls these files- CREDITS.md
- README.md
- SKILL.md
- examples/Test_QuoteByProductCallable/IndustriesCallableException.cls
- examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls
- examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls
- examples/Test_QuoteByProductCallable/TRANSCRIPT.md
- examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls
- examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls
- examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls
- examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls
- examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md
- examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls
- examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls
- examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls
- examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls
- examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md
What this skill tells the agent
sf-industry-commoncore-callable-apex: Callable Apex for Salesforce Industries Common Core
Specialist for Salesforce Industries Common Core callable Apex implementations. Produce secure, deterministic, and configurable Apex that cleanly integrates with OmniStudio and Industries extension points.
Core Responsibilities
- Callable Generation: Build
System.Callableclasses with safe action dispatch - Callable Review: Audit existing callable implementations for correctness and risks
- Validation & Scoring: Evaluate against the 120-point rubric
- Industries Fit: Ensure compatibility with OmniStudio/Industries extension points
Workflow (4-Phase Pattern)
Phase 1: Requirements Gathering
Ask for:
- Entry point (OmniScript, Integration Procedure, DataRaptor, or other Industries hook)
- Action names (strings passed into
call) - Input/output contract (required keys, types, and response shape)
- Data access needs (objects/fields, CRUD/FLS rules)
- Side effects (DML, callouts, async requirements)
Then:
- Scan for existing callable classes:
Glob: **/*Callable*.cls - Identify shared utilities or base classes used for Industries extensions
- Create a task list
Phase 2: Design & Contract Definition
Define the callable contract:
- Action list (explicit, versioned strings)
- Input schema (required keys + types)
- Output schema (consistent response envelope)
Recommended response envelope:
{
"success": true|false,
"data": {...},
"errors": [ { "code": "...", "message": "..." } ]
}Action dispatch rules:
- Use
switch on action - Default case throws a typed exception
- No dynamic method invocation or reflection
VlocityOpenInterface / VlocityOpenInterface2 contract mapping:
When designing for legacy Open Interface extensions (or dual Callable + Open Interface support), map the signature:
invokeMethod(String methodName, Map<String, Object> inputMap, Map<String, Object> outputMap, Map<String, Object> options)| Parameter | Role | Callable equivalent |
|---|---|---|
methodName | Action selector (same semantics as action) | action in call(action, args) |
inputMap | Primary input data (required keys, types) | args.get('inputMap') |
outputMap | Mutable map where results are written (out-by-reference) | Return value; Callable returns envelope instead |
options | Additional context (parent DataRaptor/OmniScript context, invocation metadata) | args.get('options') |
Design rules for Open Interface contracts:
- Treat
inputMapandoptionsas the combined input schema - Define what keys must be written to
outputMapper action (success and error cases) - Preserve
methodNamestrings so they align with Callableactionstrings - Document whether
optionsis required, optional, or unused for each action
Phase 3: Implementation Pattern
Vanilla System.Callable (flat args, no Open Interface coupling):
public with sharing class Industries_OrderCallable implements System.Callable {
public Object call(String action, Map<String, Object> args) {
switch on action {
when 'createOrder' {
return createOrder(args != null ? args : new Map<String, Object>());
}
when else {
throw new IndustriesCallableException('Unsupported action: ' + action);
}
}
}
private Map<String, Object> createOrder(Map<String, Object> args) {
// Validate input (e.g. args.get('orderId')), run business logic, return response envelope
return new Map<String, Object>{ 'success' => true };
}
}Use the vanilla pattern when callers pass flat args and no VlocityOpenInterface integration is required.
Callable skeleton (same inputs as VlocityOpenInterface):
Use inputMap and options keys in args when integrating with Open Interface or when callers pass that structure:
public with sharing class Industries_OrderCallable implements System.Callable {
public Object call(String action, Map<String, Object> args) {
Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
? (Map<String, Object>) args.get('inputMap') : (args != null ? args : new Map<String, Object>());
Map<String, Object> options = (args != null && args.containsKey('options'))
? (Map<String, Object>) args.get('options') : new Map<String, Object>();
if (inputMap == null) { inputMap = new Map<String, Object>(); }
if (options == null) { options = new Map<String, Object>(); }
switch on action {
when 'createOrder' {
return createOrder(inputMap, options);
}
when else {
throw new IndustriesCallableException('Unsupported action: ' + action);
}
}
}
private Map<String, Object> createOrder(Map<String, Object> inputMap, Map<String, Object> options) {
// Validate input, run business logic, return response envelope
return new Map<String, Object>{ 'success' => true };
}
}Input format: Callers pass args as { 'inputMap' => Map<String, Object>, 'options' => Map<String, Object> }. For backward compatibility with flat callers, if args lacks 'inputMap', treat args itself as inputMap and use an empty map for options.
Implementation rules:
- Keep
call()thin; delegate to private methods or service classes - Validate and coerce input types early (null-safe)
- Enforce CRUD/FLS and sharing (
with sharing,Security.stripInaccessible()) - Bulkify when args include record collections
- Use
WITH USER_MODEfor SOQL when appropriate
VlocityOpenInterface / VlocityOpenInterface2 implementation:
When implementing omnistudio.VlocityOpenInterface or omnistudio.VlocityOpenInterface2, use the signature:
global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
Map<String, Object> outputMap, Map<String, Object> options)Open Interface skeleton:
global with sharing class Industries_OrderOpenInterface implements omnistudio.VlocityOpenInterface2 {
global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
Map<String, Object> outputMap, Map<String, Object> options) {
switch on methodName {
when 'createOrder' {
Map<String, Object> result = createOrder(inputMap, options);
outputMap.putAll(result);
return true;
}
when else {
outputMap.put('success', false);
outputMap.put('errors', new List<Map<String, Object>>{
new Map<String, Object>{ 'code' => 'UNSUPPORTED_ACTION', 'message' => 'Unsupported action: ' + methodName }
});
return false;
}
}
}
private Map<String, Object> createOrder(Map<String, Object> inputMap, Map<String, Object> options) {
// Validate input, run business logic, return response envelope
return new Map<String, Object>{ 'success' => true, 'data' => new Map<String, Object>() };
}
}Open Interface implementation rules:
- Write results into
outputMapviaputAll()or individualput()calls; do not return the envelope frominvokeMethod - Return
truefor success,falsefor unsupported or failed actions - Use the same internal private methods as the Callable (same
inputMapandoptionsparameters); only the entry point differs - Populate
outputMapwith the same envelope shape (success,data,errors) for consistency
Both Callable and Open Interface accept the same inputs (inputMap, options) and delegate to identical private method signatures for shared logic.
Phase 4: Testing & Validation
Minimum tests:
More from jaganpro
Use this skill in a project
Open any RiverX project, search the Skills panel for jaganpro/sf-skills/sf-industry-commoncore-callable-apex, and install it in one click.
