Skip to content

Architecture Overview

Technical architecture of the Flexible Team Share solution.

This document provides a detailed technical description of the Flexible Team Share solution, including system architecture, data flow, and processing layers.

System Architecture

UI LAYER objectTeamMemberTeam member list & management objectTeamMemberWizardAdmin configuration ftsLabelsCustom labels utility CONTROLLER LAYER ObjectTeamMemberControllerCRUD operations for team members TeamMemberWizardControllerConfiguration wizard operations DATA LAYER ObjectTeamMember__cTeam member assignments Team_Sharing_Config__cPer-object sharing config FlexiTeamShare_Config__mdtApp configuration Triggers:ObjectTeamMemberTrigger ASYNC PROCESSING LAYER ShareRecordQueueableCreate/update/delete shares SharingRecalculationBatchBulk recalculation ExpiredTeamMemberCleanupBatchDaily cleanup of expired members SALESFORCE SHARING MODEL Standard Share ObjectsAccountShare, ContactShare,CaseShare, LeadShare,OpportunityShare, … Custom Object Shares[CustomObject]__Share ObjectTeamMember__ShareTeam member visibility

Layers

UI Layer

Three Lightning Web Components:

ComponentPurpose
objectTeamMemberDisplays team members on record pages. Supports add/edit/delete, collapsible list, and configurable display limit.
objectTeamMemberWizardAdmin interface for configuring objects, managing settings, and scheduling jobs.
ftsLabelsUtility component providing custom labels for i18n support (35 languages).

Controller Layer

ControllerMethods
ObjectTeamMemberControllergetTeamMembers(), addTeamMember(), updateTeamMember(), removeTeamMember(), isCurrentUserManager(), isSharingConfigured(), getAccessLevelOptions()
TeamMemberWizardControllergetExistingConfigs(), getAvailableObjects(), createConfig(), toggleConfigStatus(), deleteConfig(), getScheduledJobInfo(), scheduleCleanupJob()
SyncOwnerInvocablesyncOwners() — Invocable Action for syncing Owner team member when parent owner changes. Callable from Flow or Apex, fully bulkified.

Data Layer

Custom objects and a trigger that fires on team member changes:

  • ObjectTeamMember__c — stores team member assignments
  • Team_Sharing_Config__c — per-object sharing configuration
  • FlexiTeamShare_Config__mdt — app-level configuration (Custom Metadata)
  • ObjectTeamMemberTrigger → ObjectTeamMemberTriggerHandler — handles Before Insert, Before Update, Before Delete

Async Processing Layer

ComponentTypePurpose
ShareRecordQueueableQueueableCreates, updates, and deletes share records for parent objects and team members
SharingRecalculationBatchBatchableBulk recalculates all shares when configuration changes
ExpiredTeamMemberCleanupBatchBatchableDeletes expired team members (daily scheduled job)
ExpiredTeamMemberCleanupSchedulerSchedulableSchedules the cleanup batch (runs at 2:00 AM daily)

Data Flow: Adding a Team Member

User objectTeamMemberLWC ObjectTeamMemberController Database ShareRecordQueueable Click "Add Team Member" Collect input (User, AccessLevel, Role, End Date) addTeamMember(recordId, userId,accessLevel, role, endDate) INSERT ObjectTeamMember__c Success Trigger fires after insert System.enqueueJob() Return success Refresh team member list Async processing INSERT [Object]Share INSERT ObjectTeamMember__Share

Data Flow: Owner Change Synchronization

alt [Owner changed] Admin Record-TriggeredFlow SyncOwnerInvocable Database ShareRecordQueueable Changes record owner UPDATE Account SET OwnerId = :newOwner Trigger: OwnerId changed syncOwners([recordId]) SELECT FROM ObjectTeamMember__cWHERE Role__c = 'Owner' Owner team member SELECT OwnerId FROM Account New owner ID UPDATE ObjectTeamMember__cSET User_Id__c = :newOwner Success System.enqueueJob() Async processing DELETE old AccountShare(if not member) INSERT new AccountShare [Owner unchanged] success=true, "Owner unchanged" SyncOwnerResult

Data Flow: Expired Member Cleanup

Salesforce Scheduler(2:00 AM daily) ExpiredTeamMemberCleanupScheduler ExpiredTeamMemberCleanupBatch Query:SELECT FROM ObjectTeamMember__cWHERE End_Date__c < TODAY() DELETE expired records(triggers remove shares)

Error Handling

Controller Layer

  • All public methods wrapped in try-catch
  • User-friendly error messages via Custom Labels
  • AuraHandledException for LWC error display

Async Processing

  • Database.insert/update/delete(records, false) — partial success
  • Individual errors logged, don’t fail entire batch
  • Error statistics tracked in batch jobs

Trigger Layer

  • Trigger handler pattern prevents recursion
  • Errors surface to DML operation caller

Performance Considerations

Async Processing

  • Share record operations use Queueable (non-blocking)
  • Bulk operations use Batchable with configurable batch size
  • No synchronous DML on share records in triggers

Query Optimization

  • Indexed fields used in WHERE clauses
  • Record_Id__c format enables efficient LIKE queries
  • Limited result sets with LIMIT clauses

Caching

  • @AuraEnabled(cacheable=true) for read operations
  • App config cached in transaction

Integration Architecture

No external integrations — this package operates entirely within Salesforce:

  • No HTTP callouts
  • No external APIs
  • No Named Credentials
  • No External Objects
  • No Connected Apps

Platform Dependencies

ComponentUsage
Apex SharingCreates/manages share records
Queueable ApexAsync share record operations
Batchable ApexBulk share recalculation, cleanup
Schedulable ApexDaily cleanup job
Custom MetadataApp configuration
Lightning Web ComponentsUser interface
Custom LabelsInternationalization