75a9bbb0c8
- Rimosso limite TOP 1000 in EFCoreDatabaseManager.GetAllRecordsAsync - Eliminati controlli di sicurezza con limiti automatici in DataCoupler - Aggiornata documentazione per riflettere estrazione senza limiti - Supporto completo per dataset di grandi dimensioni - Mantenuto batching automatico Salesforce (25 record/batch) in parallelo Ora il sistema supporta l'estrazione completa di tabelle e query custom senza restrizioni artificiali, ideale per migrazioni e use cases enterprise.
164 lines
6.6 KiB
Markdown
164 lines
6.6 KiB
Markdown
# Implementazione Chiamate Composite per Salesforce
|
|
|
|
## Panoramica delle Modifiche
|
|
|
|
Questa implementazione modifica il DataCoupler per utilizzare le **Salesforce Composite API** al posto delle singole chiamate REST create/update, migliorando significativamente le performance e l'efficienza del trasferimento dati.
|
|
|
|
## Modifiche Implementate
|
|
|
|
### 1. SalesforceServiceClient (DataConnection/REST/Implementations/SalesforceServiceClient.cs)
|
|
|
|
Aggiunte le seguenti classi e metodi:
|
|
|
|
#### Nuove Classi di Supporto:
|
|
- `CompositeOperationResult`: Classe pubblica per rappresentare il risultato di un'operazione composite
|
|
- `SalesforceCompositeRequest`: Richiesta composite per Salesforce API
|
|
- `SalesforceCompositeSubRequest`: Sotto-richiesta nell'ambito di una chiamata composite
|
|
- `SalesforceCompositeResponse`: Risposta dell'API Composite di Salesforce
|
|
- `SalesforceCompositeSubResponse`: Sotto-risposta di un'operazione composite
|
|
|
|
#### Nuovi Metodi:
|
|
|
|
**`BatchCreateEntitiesAsync`**
|
|
- Esegue multiple operazioni di creazione usando l'API Composite di Salesforce
|
|
- Parametri: `entityName`, `entityDataList`, `cancellationToken`
|
|
- Ritorna: `List<CompositeOperationResult>` con i risultati di ogni operazione
|
|
|
|
**`BatchUpdateEntitiesAsync`**
|
|
- Esegue multiple operazioni di aggiornamento usando l'API Composite di Salesforce
|
|
- Parametri: `entityName`, `updateData` (Dictionary<entityId, entityData>), `cancellationToken`
|
|
- Ritorna: `List<CompositeOperationResult>` con i risultati di ogni operazione
|
|
|
|
### 2. DataCoupler (Data_Coupler/Pages/DataCoupler.razor.cs)
|
|
|
|
#### Metodi Aggiunti:
|
|
|
|
**`StartDataTransferWithComposite`**
|
|
- Nuova implementazione del trasferimento dati che utilizza le chiamate composite
|
|
- Analizza prima tutti i record per determinare quali creare vs aggiornare
|
|
- Esegue le operazioni in batch paralleli per massime performance
|
|
|
|
**`CreateAssociationAsync`**
|
|
- Helper per creare associazioni per record creati tramite composite
|
|
- Gestisce la persistenza delle associazioni chiave-valore
|
|
|
|
**`UpdateAssociationVerificationAsync`**
|
|
- Helper per aggiornare la verifica delle associazioni esistenti
|
|
|
|
**`HandleFailedUpdateAsync`**
|
|
- Gestisce gli aggiornamenti falliti eliminando associazioni non valide
|
|
|
|
**`ShowTransferResults`**
|
|
- Helper per formattare e mostrare i risultati del trasferimento
|
|
|
|
#### Modifiche ai Metodi Esistenti:
|
|
|
|
**`StartDataTransfer`** (modificato)
|
|
- Ora è un wrapper che:
|
|
- Detecta automaticamente se il client è Salesforce
|
|
- Se sì, usa `StartDataTransferWithComposite`
|
|
- Altrimenti usa il metodo originale (`StartDataTransferOriginal`)
|
|
|
|
## Flusso di Elaborazione Composite
|
|
|
|
### 1. Recupero Dati Sorgente
|
|
- Come il metodo originale, recupera tutti i record dalla sorgente (DB o file)
|
|
|
|
### 2. Analisi e Trasformazione
|
|
- Per ogni record:
|
|
- Trasforma secondo i mapping configurati
|
|
- Analizza le associazioni esistenti per determinare se è CREATE vs UPDATE
|
|
- Raggruppa i record in due batch separati:
|
|
- `recordsForCreate`: nuovi record da creare
|
|
- `recordsForUpdate`: record esistenti da aggiornare
|
|
|
|
### 3. Esecuzione Parallela
|
|
- Esegue **in parallelo**:
|
|
- `BatchCreateEntitiesAsync` per tutti i nuovi record
|
|
- `BatchUpdateEntitiesAsync` per tutti gli aggiornamenti
|
|
- Attende entrambe le operazioni con `Task.WhenAll`
|
|
|
|
### 4. Elaborazione Risultati
|
|
- Processa i risultati di entrambi i batch
|
|
- Per ogni operazione riuscita:
|
|
- Crea/aggiorna associazioni chiave-valore
|
|
- Registra il successo nei risultati di trasferimento
|
|
- Per operazioni fallite:
|
|
- Registra l'errore
|
|
- Gestisce la pulizia delle associazioni non valide
|
|
|
|
### 5. Gestione Associazioni
|
|
- **CREATE**: Crea nuove associazioni chiave-valore se configurate
|
|
- **UPDATE**: Aggiorna timestamp di verifica delle associazioni esistenti
|
|
- **FAILED UPDATE**: Elimina associazioni non valide per mantenere coerenza
|
|
|
|
## Vantaggi dell'Implementazione
|
|
|
|
### 1. Performance Migliorate
|
|
- **Riduzione chiamate API**: Da N chiamate singole a 2 chiamate batch (max)
|
|
- **Esecuzione parallela**: CREATE e UPDATE eseguiti contemporaneamente
|
|
- **Riduzione latenza**: Meno round-trip verso Salesforce
|
|
|
|
### 2. Efficienza di Rete
|
|
- **Batch processing**: Salesforce API Composite supporta fino a 25 operazioni per richiesta
|
|
- **Ottimizzazione bandwidth**: Meno overhead HTTP
|
|
|
|
### 3. Gestione Migliorata degli Errori
|
|
- **Isolamento errori**: Un errore in un'operazione non blocca le altre
|
|
- **Reporting dettagliato**: Risultati granulari per ogni record
|
|
- **Rollback selettivo**: Solo le operazioni fallite vengono gestite
|
|
|
|
### 4. Backward Compatibility
|
|
- **Auto-detection**: Usa composite solo per Salesforce
|
|
- **Fallback**: Altri provider REST continuano a usare il metodo originale
|
|
- **Zero breaking changes**: L'interfaccia utente rimane identica
|
|
|
|
## Limitazioni e Considerazioni
|
|
|
|
### 1. Limitazioni API Salesforce
|
|
- Massimo 25 operazioni per chiamata Composite
|
|
- Se ci sono più di 25 record, sarà necessario implementare chunking
|
|
- Al momento l'implementazione non gestisce questo caso limite
|
|
|
|
### 2. Gestione Associazioni
|
|
- Il metodo `FindKeyAssociationByDestinationIdAsync` non esisteva, quindi è stata implementata una gestione semplificata
|
|
- Potrebbe essere necessario estendere l'interfaccia `IDataConnectionCredentialService` in futuro
|
|
|
|
### 3. Logging e Debug
|
|
- Aggiunto logging specifico con prefix "COMPOSITE:" per facilitare debugging
|
|
- Mantiene compatibilità con logging esistente
|
|
|
|
## Testing e Validazione
|
|
|
|
La build del progetto è stata verificata con successo. I test effettivi con Salesforce richiederanno:
|
|
|
|
1. **Configurazione credenziali Salesforce** con API Composite abilitata
|
|
2. **Test con dataset piccolo** (< 25 record) per validare funzionalità base
|
|
3. **Test con dataset grande** per verificare la necessità di chunking
|
|
4. **Test fallimenti selettivi** per validare gestione errori
|
|
5. **Test associazioni** per verificare creazione/aggiornamento corretto
|
|
|
|
## File Modificati
|
|
|
|
1. `DataConnection/REST/Implementations/SalesforceServiceClient.cs`
|
|
- Aggiunte classi e metodi per Composite API
|
|
|
|
2. `Data_Coupler/Pages/DataCoupler.razor.cs`
|
|
- Aggiunto metodo composite
|
|
- Modificato routing del trasferimento dati
|
|
|
|
## Prossimi Passi Consigliati
|
|
|
|
1. **Implementare chunking** per gestire > 25 record per batch
|
|
2. **Estendere interfaccia IDataConnectionCredentialService** con metodi mancanti
|
|
3. **Aggiungere metriche performance** per comparare metodo originale vs composite
|
|
4. **Aggiungere configurazione** per abilitare/disabilitare composite per debugging
|
|
5. **Test di carico** con dataset reali di grandi dimensioni
|
|
|
|
## Note di Implementazione
|
|
|
|
- L'implementazione è thread-safe
|
|
- Gestisce correttamente timeout e cancellation tokens
|
|
- Mantiene tutti i meccanismi di sicurezza esistenti
|
|
- Compatibile con il sistema di profili e credenziali esistente
|