Skip to content

アーキテクチャ概要

Flexible Team Shareソリューションの技術アーキテクチャ。

このドキュメントは、システムアーキテクチャ、データフロー、処理レイヤーを含む、Flexible Team Shareソリューションの詳細な技術説明を提供します。

システムアーキテクチャ

UIレイヤー objectTeamMemberチームメンバーリストと管理 objectTeamMemberWizard管理者設定 ftsLabelsカスタムラベルユーティリティ CONTROLLERレイヤー ObjectTeamMemberControllerチームメンバーのCRUD操作 TeamMemberWizardController設定ウィザードの操作 DATAレイヤー ObjectTeamMember__cチームメンバーの割り当て Team_Sharing_Config__cオブジェクトごとの共有設定 FlexiTeamShare_Config__mdtアプリ設定 トリガー:ObjectTeamMemberTrigger 非同期処理レイヤー ShareRecordQueueable共有の作成/更新/削除 SharingRecalculationBatchバルク再計算 ExpiredTeamMemberCleanupBatch期限切れメンバーの日次クリーンアップ SALESFORCE共有モデル 標準共有オブジェクトAccountShare, ContactShare,CaseShare, LeadShare,OpportunityShare, … カスタムオブジェクト共有[CustomObject]__Share ObjectTeamMember__Shareチームメンバーの可視性

レイヤー

UIレイヤー

3つのLightning Web Components:

コンポーネント目的
objectTeamMemberレコードページにチームメンバーを表示します。追加/編集/削除、折りたたみ可能なリスト、設定可能な表示制限をサポートします。
objectTeamMemberWizardオブジェクトの設定、設定の管理、ジョブのスケジューリングを行う管理インターフェース。
ftsLabelsi18nサポート(35言語)のためのCustom Labelsを提供するユーティリティコンポーネント。

Controllerレイヤー

Controllerメソッド
ObjectTeamMemberControllergetTeamMembers()addTeamMember()updateTeamMember()removeTeamMember()isCurrentUserManager()isSharingConfigured()getAccessLevelOptions()
TeamMemberWizardControllergetExistingConfigs()getAvailableObjects()createConfig()toggleConfigStatus()deleteConfig()getScheduledJobInfo()scheduleCleanupJob()
SyncOwnerInvocablesyncOwners() — 親オーナーが変更されたときにOwnerチームメンバーを同期するInvocable Action。FlowまたはApexから呼び出し可能で、完全にバルク化されています。

Dataレイヤー

カスタムオブジェクトと、チームメンバーの変更時に起動するトリガー:

  • ObjectTeamMember__c — チームメンバーの割り当てを保存
  • Team_Sharing_Config__c — オブジェクトごとの共有設定
  • FlexiTeamShare_Config__mdt — アプリレベルの設定(Custom Metadata)
  • ObjectTeamMemberTriggerObjectTeamMemberTriggerHandler — Before Insert、Before Update、Before Deleteを処理

非同期処理レイヤー

コンポーネントタイプ目的
ShareRecordQueueableQueueable親オブジェクトとチームメンバーの共有レコードを作成、更新、削除
SharingRecalculationBatchBatchable設定変更時にすべての共有をバルク再計算
ExpiredTeamMemberCleanupBatchBatchable期限切れのチームメンバーを削除(毎日のスケジュールジョブ)
ExpiredTeamMemberCleanupSchedulerSchedulableクリーンアップバッチをスケジュール(毎日午前2:00に実行)

データフロー:チームメンバーの追加

ユーザー objectTeamMemberLWC ObjectTeamMemberController データベース ShareRecordQueueable 「Add Team Member」をクリック 入力を収集(ユーザー、アクセスレベル、ロール、終了日) addTeamMember(recordId, userId,accessLevel, role, endDate) INSERT ObjectTeamMember__c 成功 insert後にトリガーが発火 System.enqueueJob() 成功を返す チームメンバーリストを更新 非同期処理 INSERT [Object]Share INSERT ObjectTeamMember__Share

データフロー:オーナー変更の同期

alt [所有者が変更された] 管理者 レコードトリガーフロー SyncOwnerInvocable データベース ShareRecordQueueable レコード所有者を変更 UPDATE Account SET OwnerId = :newOwner トリガー: OwnerId変更 syncOwners([recordId]) SELECT FROM ObjectTeamMember__cWHERE Role__c = 'Owner' Ownerチームメンバー SELECT OwnerId FROM Account 新しい所有者ID UPDATE ObjectTeamMember__cSET User_Id__c = :newOwner 成功 System.enqueueJob() 非同期処理 古いAccountShareをDELETE(メンバーでない場合) INSERT new AccountShare [所有者に変更なし] success=true,「所有者に変更なし」 SyncOwnerResult

データフロー:期限切れメンバーのクリーンアップ

Salesforceスケジューラー(毎日午前2:00) ExpiredTeamMemberCleanupScheduler ExpiredTeamMemberCleanupBatch クエリ:SELECT FROM ObjectTeamMember__cWHERE End_Date__c < TODAY() 期限切れレコードをDELETE(トリガーが共有を削除)

エラーハンドリング

Controllerレイヤー

  • すべてのpublicメソッドがtry-catchでラップされています
  • Custom Labelsを介したユーザーフレンドリーなエラーメッセージ
  • LWCエラー表示のためのAuraHandledException

非同期処理

  • Database.insert/update/delete(records, false) — 部分的な成功
  • 個別のエラーはログに記録され、バッチ全体が失敗することはありません
  • バッチジョブでエラー統計を追跡

Triggerレイヤー

  • トリガーハンドラーパターンが再帰を防止
  • エラーはDML操作の呼び出し元に表示されます

パフォーマンスに関する考慮事項

非同期処理

  • 共有レコード操作はQueueableを使用(ノンブロッキング)
  • バルク操作は設定可能なバッチサイズでBatchableを使用
  • トリガーで共有レコードの同期DMLなし

クエリの最適化

  • WHERE句でインデックス付きフィールドを使用
  • Record_Id__c形式により効率的なLIKEクエリが可能
  • LIMIT句で結果セットを制限

キャッシング

  • 読み取り操作には@AuraEnabled(cacheable=true)
  • トランザクション内でアプリ設定をキャッシュ

統合アーキテクチャ

外部統合なし — このパッケージは完全にSalesforce内で動作します:

  • HTTPコールアウトなし
  • 外部APIなし
  • Named Credentialsなし
  • External Objectsなし
  • Connected Appsなし

プラットフォームの依存関係

コンポーネント使用方法
Apex Sharing共有レコードの作成/管理
Queueable Apex非同期共有レコード操作
Batchable Apexバルク共有再計算、クリーンアップ
Schedulable Apex毎日のクリーンアップジョブ
Custom Metadataアプリ設定
Lightning Web Componentsユーザーインターフェース
Custom Labels国際化