Files
Data-Coupler/COMPOSITE_API_IMPLEMENTATION.md
Alessio 75a9bbb0c8 Rimozione limiti di estrazione dati per supporto dataset completi
- 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.
2025-07-13 21:37:16 +02:00

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