Aller au contenu

Vue d'ensemble de l'architecture

Ce document fournit une description technique détaillée de la solution Flexible Team Share, incluant l’architecture système, le flux de données et les couches de traitement.

flowchart TB
    subgraph UI["UI LAYER"]
        direction LR
        LWC1["objectTeamMember<br/>Team member list & management"]
        LWC2["objectTeamMemberWizard<br/>Admin configuration"]
        LWC3["ftsLabels<br/>Custom labels utility"]
    end

    subgraph CTRL["CONTROLLER LAYER"]
        direction LR
        C1["ObjectTeamMemberController<br/>CRUD operations for team members"]
        C2["TeamMemberWizardController<br/>Configuration wizard operations"]
    end

    subgraph DATA["DATA LAYER"]
        direction LR
        D1["ObjectTeamMember__c<br/>Team member assignments"]
        D2["Team_Sharing_Config__c<br/>Per-object sharing config"]
        D3["FlexiTeamShare_Config__mdt<br/>App configuration"]
        D4["Triggers:<br/>ObjectTeamMemberTrigger"]
    end

    subgraph ASYNC["ASYNC PROCESSING LAYER"]
        direction LR
        A1["ShareRecordQueueable<br/>Create/update/delete shares"]
        A2["SharingRecalculationBatch<br/>Bulk recalculation"]
        A3["ExpiredTeamMemberCleanupBatch<br/>Daily cleanup of expired members"]
    end

    subgraph SHARE["SALESFORCE SHARING MODEL"]
        direction LR
        S1["Standard Share Objects<br/>AccountShare, ContactShare,<br/>CaseShare, LeadShare,<br/>OpportunityShare, etc."]
        S2["Custom Object Shares<br/>[CustomObject]__Share"]
        S3["ObjectTeamMember__Share<br/>Team member visibility"]
    end

    UI --> CTRL
    CTRL --> DATA
    DATA --> ASYNC
    ASYNC --> SHARE

Trois Lightning Web Components :

ComposantObjectif
objectTeamMemberAffiche les membres d’équipe sur les pages d’enregistrement. Prend en charge l’ajout/modification/suppression, la liste réductible et la limite d’affichage configurable.
objectTeamMemberWizardInterface administrateur pour configurer les objets, gérer les paramètres et planifier les tâches.
ftsLabelsComposant utilitaire fournissant des Custom Labels pour la prise en charge i18n (35 langues).
ContrôleurMéthodes
ObjectTeamMemberControllergetTeamMembers(), addTeamMember(), updateTeamMember(), removeTeamMember(), isCurrentUserManager(), isSharingConfigured(), getAccessLevelOptions()
TeamMemberWizardControllergetExistingConfigs(), getAvailableObjects(), createConfig(), toggleConfigStatus(), deleteConfig(), getScheduledJobInfo(), scheduleCleanupJob()
SyncOwnerInvocablesyncOwners() — Invocable Action pour synchroniser le membre d’équipe Owner lorsque le propriétaire parent change. Appelable depuis Flow ou Apex, entièrement bulkifié.

Objets personnalisés et un déclencheur qui se déclenche lors des changements de membre d’équipe :

  • ObjectTeamMember__c — stocke les affectations de membres d’équipe
  • Team_Sharing_Config__c — configuration de partage par objet
  • FlexiTeamShare_Config__mdt — configuration au niveau de l’application (Custom Metadata)
  • ObjectTeamMemberTriggerObjectTeamMemberTriggerHandler — gère Before Insert, Before Update, Before Delete
ComposantTypeObjectif
ShareRecordQueueableQueueableCrée, met à jour et supprime des enregistrements de partage pour les objets parents et les membres d’équipe
SharingRecalculationBatchBatchableRecalcule en masse tous les partages lorsque la configuration change
ExpiredTeamMemberCleanupBatchBatchableSupprime les membres d’équipe expirés (tâche planifiée quotidienne)
ExpiredTeamMemberCleanupSchedulerSchedulablePlanifie le batch de nettoyage (s’exécute à 2h00 du matin quotidiennement)

Flux de données : Ajout d’un membre d’équipe

Section intitulée « Flux de données : Ajout d’un membre d’équipe »
sequenceDiagram
    actor User
    participant LWC as objectTeamMember LWC
    participant Ctrl as ObjectTeamMemberController
    participant DB as Database
    participant Queue as ShareRecordQueueable

    User->>LWC: Click "Add Team Member"
    LWC->>LWC: Collect input (User, Access Level, Role, End Date)
    LWC->>Ctrl: addTeamMember(recordId, userId, accessLevel, role, endDate)

    Ctrl->>Ctrl: Check for duplicates
    Ctrl->>Ctrl: Verify CRUD permissions

    Ctrl->>DB: INSERT ObjectTeamMember__c
    DB-->>Ctrl: Success

    Note over Ctrl,Queue: Trigger fires after insert
    Ctrl->>Queue: System.enqueueJob()

    Ctrl-->>LWC: Return success
    LWC-->>User: Refresh team member list

    Note over Queue: Async processing
    Queue->>DB: INSERT [Object]Share
    Queue->>DB: INSERT ObjectTeamMember__Share

Flux de données : Synchronisation du changement de propriétaire

Section intitulée « Flux de données : Synchronisation du changement de propriétaire »
sequenceDiagram
    actor Admin
    participant Flow as Record-Triggered Flow
    participant Inv as SyncOwnerInvocable
    participant DB as Database
    participant Queue as ShareRecordQueueable

    Note over Admin: Changes record owner

    Admin->>DB: UPDATE Account SET OwnerId = :newOwner
    DB-->>Flow: Trigger: OwnerId changed

    Flow->>Inv: syncOwners([recordId])

    Inv->>DB: SELECT FROM ObjectTeamMember__c WHERE Role__c = 'Owner'
    DB-->>Inv: Owner team member

    Inv->>DB: SELECT OwnerId FROM Account
    DB-->>Inv: New owner ID

    alt Owner changed
        Inv->>DB: UPDATE ObjectTeamMember__c SET User_Id__c = :newOwner
        DB-->>Inv: Success

        Inv->>Queue: System.enqueueJob()

        Note over Queue: Async processing
        Queue->>DB: DELETE old AccountShare (if not member)
        Queue->>DB: INSERT new AccountShare
    else Owner unchanged
        Inv-->>Flow: success=true, "Owner unchanged"
    end

    Inv-->>Flow: SyncOwnerResult
flowchart TB
    A["Salesforce Scheduler<br/>(2:00 AM daily)"] --> B["ExpiredTeamMemberCleanupScheduler"]
    B --> C["ExpiredTeamMemberCleanupBatch"]
    C --> D["Query:<br/>SELECT FROM ObjectTeamMember__c<br/>WHERE End_Date__c < TODAY()"]
    D --> E["DELETE expired records<br/>(triggers remove shares)"]
  • Toutes les méthodes publiques enveloppées dans try-catch
  • Messages d’erreur conviviaux via Custom Labels
  • AuraHandledException pour l’affichage des erreurs LWC
  • Database.insert/update/delete(records, false) — succès partiel
  • Les erreurs individuelles sont enregistrées, n’échouent pas tout le batch
  • Statistiques d’erreur suivies dans les tâches batch
  • Le modèle de gestionnaire de déclencheur prévient la récursion
  • Les erreurs remontent à l’appelant de l’opération DML
  • Les opérations d’enregistrement de partage utilisent Queueable (non bloquant)
  • Les opérations en masse utilisent Batchable avec une taille de batch configurable
  • Aucun DML synchrone sur les enregistrements de partage dans les déclencheurs
  • Champs indexés utilisés dans les clauses WHERE
  • Le format Record_Id__c permet des requêtes LIKE efficaces
  • Ensembles de résultats limités avec des clauses LIMIT
  • @AuraEnabled(cacheable=true) pour les opérations de lecture
  • Configuration de l’application mise en cache dans la transaction

Aucune intégration externe — ce package fonctionne entièrement dans Salesforce :

  • Aucun HTTP callout
  • Aucune API externe
  • Aucun Named Credentials
  • Aucun External Objects
  • Aucune Connected Apps
ComposantUtilisation
Apex SharingCrée/gère les enregistrements de partage
Queueable ApexOpérations asynchrones d’enregistrement de partage
Batchable ApexRecalcul en masse du partage, nettoyage
Schedulable ApexTâche de nettoyage quotidienne
Custom MetadataConfiguration de l’application
Lightning Web ComponentsInterface utilisateur
Custom LabelsInternationalisation