- Salesforce Composite Batch API per describe SObject: le describe sono ora
raggruppate in chunk da 25 e inviate come singole POST a /composite/batch,
riducendo le chiamate API da N a ceil(N/25); per 200 SObject: da 201 a 9 chiamate.
- Discovery entita' REST in parallelo: DiscoverEntitySummariesAsync e
DiscoverEntitiesAsync avviate simultaneamente; la lista entita' diventa
interattiva subito dopo le summaries, i dettagli completano in background
con StateHasChanged() per aggiornare l'UI istantaneamente.
- Fix scheduler - preservazione ExternalIdRelationshipsJson e DefaultValuesJson:
in DataCoupler.razor.cs entrambi i blocchi di update profilo esistente
(riattivazione profilo inattivo e sovrascrittura profilo attivo) omettevano
questi campi nella copia, causandone l'azzeramento silenzioso ad ogni
re-salvataggio. Ora entrambi i percorsi propagano correttamente i campi JSON.
- Fix scheduler - esclusione campi sorgente External ID dal mapping normale:
in ScheduledProfileExecutionService.TransformRecordForRest i campi sorgente
usati nelle External ID Relationships venivano inclusi anche nel loop di
field mapping standard, generando dati duplicati nell'entita' destinazione.
Ora il comportamento e' allineato alla UI manuale (TransformRecordToRestEntity).
- Aggiornata documentazione: README.md, AGENTS.md, copilot-instructions.md
- Disabilitato target MSBuild GenerateVersionJson durante build CI/CD
- Aggiunta condizione: non esegue se ContinuousIntegrationBuild=true
- Aggiornato Dockerfile per usare /p:ContinuousIntegrationBuild=true
- Previene sovrascrittura del version.json generato dal workflow Gitea
- Risolve problema: container mostra v1.0.0-dev invece della versione da git tag
- Aggiunto MSBuild target che genera version.json automaticamente prima di ogni build
- Versione estratta dal tag git più recente (git describe --tags)
- Rimosso version.json dal tracking git (file generato automaticamente)
- Aggiornato .gitignore per escludere version.json
- Il file viene ora rigenerato ad ogni build con versione, commit SHA, branch e timestamp corretti
- Creato modello FieldMappingEntry per gestione unificata di field mapping e default values
- Aggiunta colonna DefaultValuesJson alla tabella DataCouplerProfile (max 4000 caratteri)
- Implementata UI con toggle per selezionare modalità Mapping o Default
- Supporto per 9 tipi di dati: string, int, long, decimal, double, float, boolean, datetime, datetimeoffset
- Aggiornata logica TransformRecordToRestEntity per applicare valori default dopo field mapping
- Implementata serializzazione/deserializzazione DefaultValues in DataCouplerProfileService
- Sistema completo di salvataggio/caricamento valori default nei profili
- Migrazione database AddDefaultValuesJsonToProfile creata e applicata
- Implementata funzionalità completa External ID Relationships nell'interfaccia di mapping
- Corretto bug double-mapping: i campi sorgente usati per External ID non vengono più inclusi nei mapping normali
- Risolto errore MALFORMED_ID causato dall'invio duplicato di campi come proprietà dirette e nested objects
- Implementata logica corretta per relationship names: oggetti standard usano il nome diretto, custom objects usano suffisso __r
- Aggiunta UI a 3 colonne (Object, External ID Field, Source Field) per configurazione External ID Relationships
- Migrazione database per supporto External ID Relationships nei profili
- Aggiornato ProfileSaver.razor.cs per salvare/caricare External ID Relationships
- Aggiornato ScheduledProfileExecutionService.cs per gestire External ID nelle esecuzioni schedulate
- Formato JSON output corretto: { 'Account': { 'CardCode__c': 'V50000' } }
Documentazione: EXTERNAL_ID_RELATIONSHIPS_IMPLEMENTATION.md
- Disabilitato trimming per compatibilità con Blazor Server (risolve crash TypeLoadException)
- Configurati PublishSingleFile e ReadyToRun per deployment ottimizzato
- Rimosso controllo eccessivamente restrittivo sui commenti SQL in validazione query
- Ora permessi commenti -- e /* */ nelle query SELECT ODBC
- Mostra stato di tutte le variabili che controllano la visibilità del mapping
- Indica quale condizione non è soddisfatta (isSourceReady, isRestConnected, selectedRestEntity)
- Pannello visibile solo per connessioni ODBC
- Aiuta a identificare rapidamente il problema
- Modificata condizione isSourceReady in DataCoupler.razor
- Per ODBC: richiede solo useCustomQuery && isQueryValid (non isDatabaseConnected)
- Per altri DB: comportamento invariato (richiede isDatabaseConnected)
- Risolto: mapping non appariva dopo validazione query ODBC
- Modificato OnDatabaseCredentialChanged per rilevare connessioni ODBC e forzare useCustomQuery = true
- Aggiunto metodo helper IsOdbcConnection() per verificare tipo credenziale
- Modificata UI DataCoupler.razor:
* Nascosto pulsante 'Connetti e Scopri Schema' per ODBC
* Mostrato messaggio esplicativo per ODBC
* Resa sezione Query Custom sempre visibile per ODBC (senza discovery)
* Nascosta sezione Lista Tabelle per ODBC
- Modificato ValidateCustomQuery per creare temporaneamente DatabaseManager per ODBC
- ODBC ora bypassa completamente il discovery e va diretto a query custom
- Aggiunta persistenza campi ODBC (OdbcDsnName, OdbcMode) in CredentialEntity
- Creata migration EF Core per nuovi campi database
- Aggiornato mapping credenziali per caricare/salvare dati ODBC
- Creato OdbcDatabaseManager dedicato (bypass EF Core che non supporta ODBC)
- Aggiornato DataConnectionFactory per usare OdbcDatabaseManager con connessioni ODBC
- Fix auto-load DSN: sostituito @onchange con @bind-Value:after in dropdown tipo database
- Fix test connessione SAP HANA: rimossa query SELECT 1 che causava errori sintassi
- Implementati tutti i metodi IDatabaseManager in OdbcDatabaseManager
- Supporto completo per discovery schema, tabelle e query ODBC
Risolve problema DbContext non configurato per ODBC e abilita connessioni ODBC complete.
- Aggiunto MinVer per calcolo automatico versione da git tags
- Creato modello VersionInfo e servizio VersionService
- Integrato display versione nel NavMenu (Data_Coupler v2.1.0)
- Aggiornato workflow Gitea Actions (Linux e Windows) per generare version.json
- Risolto problema inconsistenza versioning tra container Linux e Windows
- Documentazione completa: VERSIONING_SYSTEM.md e MINVER_SETUP.md
- Versione ora calcolata automaticamente da git tags (Semantic Versioning)
- Aggiunta validazione percorsi file prima del salvataggio profili
- Implementati metodi di lettura file CSV e Excel per schedulazioni
- Supporto doppia modalità: caricamento browser (preview) e percorso manuale (schedulazione)
- Gestione completa deletion sync anche per file CSV/Excel
- Rilevamento automatico separatori CSV (virgola, punto e virgola, tab, pipe)
- Supporto formati Excel legacy (.xls) e moderni (.xlsx)
- Abilitati profili file nella UI di schedulazione
- Logging dettagliato per troubleshooting
- Documentazione completa in CSV_SCHEDULING_IMPLEMENTATION.md
- Aggiornati README.md e copilot-instructions.md con nuove feature
- Rimosso testo 'TEST' dalla pagina di login
- Disabilitata completamente la sincronizzazione eliminazioni nei trasferimenti manuali (DataCoupler.razor.cs)
- Aggiunto campo EnableDeletionSync al modello ProfileSchedule (default: false)
- Implementata logica condizionale in ScheduledProfileExecutionService per deletion sync
- Aggiunta sezione 'Opzioni Avanzate' nell'interfaccia schedulazione con warning
- Creata migration Entity Framework AddEnableDeletionSyncToProfileSchedule
- Aggiornato BackupModels per supporto backup/restore del nuovo campo
- Aggiornata documentazione README.md e copilot-instructions.md
- La deletion sync è ora disponibile solo per schedulazioni con configurazione esplicita per massima sicurezza
Creato AssociationService per eliminare duplicazione codice e migliorare manutenibilità
Nuovo servizio:
- Data_Coupler/Services/AssociationService.cs (276 righe)
* Interfaccia IAssociationService con metodi pubblici
* PreDiscoveryRequest DTO per parametri configurabili
* FindOrCreateAssociationAsync(): ricerca locale + Pre-Discovery REST
* IsPreDiscoveryAssociation(): verifica marker associazioni Pre-Discovery
Refactoring DataCoupler.razor.cs:
- Injected IAssociationService nel componente
- StartDataTransferOriginal(): ridotto da 98 a 20 righe (-78)
- StartDataTransferWithComposite(): ridotto da 93 a 20 righe (-73)
- Verifica Pre-Discovery: ridotto da 20 a 2 righe (-18)
- Sostituito logica inline con chiamate al servizio centralizzato
Refactoring ScheduledProfileExecutionService.cs:
- Injected IAssociationService nel costruttore
- ExecuteDataTransferWithCompositeAsync(): ridotto da 99 a 20 righe (-79)
- Verifica Pre-Discovery: ridotto da 20 a 2 righe (-18)
- Parametro IsScheduledTransfer=true per tracciabilità
Dependency Injection:
- Registrato IAssociationService in Program.cs come Scoped
- Disponibile per dependency injection in tutti i componenti
Vantaggi:
- Eliminata duplicazione: 3 implementazioni → 1 servizio centralizzato
- Codice ridotto di 266 righe (330 → 64 nelle chiamate)
- Manutenibilità: modifiche future in un solo file
- Testabilità: interfaccia facilmente mockabile per unit test
- Riusabilità: servizio disponibile per futuri componenti
- Separazione responsabilità: logica associazioni isolata
Comportamento invariato:
- Nessuna modifica alla logica Pre-Discovery esistente
- Compatibilità completa con database e API
- Stessi marker e metadata nelle associazioni create
Docs: PRE_DISCOVERY_REFACTORING.md
Build: ✅ Successo (0 errori, 25 warning pre-esistenti)
- Fix FindEntitiesByKeysAsync: SOQL query universale al posto di External ID GET
* Disabilitato External ID GET (funziona solo per campi marcati External ID)
* Query SOQL come metodo primario funzionante per tutti i campi
* Logging dettagliato per diagnostica ricerche Salesforce
- Pre-Discovery nei trasferimenti manuali (DataCoupler.razor.cs)
* Ricerca automatica nella destinazione quando KeyAssociation non esiste
* Creazione associazione con marker CreatedBy="PreDiscovery"
* Aggiornamento forzato senza controllo hash per associazioni Pre-Discovery
* Supporto parallel processing thread-safe
- Pre-Discovery nei trasferimenti schedulati (ScheduledProfileExecutionService.cs)
* Logica identica a trasferimenti manuali
* Marker aggiuntivo ScheduledTransfer=true per tracciabilità
* Aggiornamento forzato per prima sincronizzazione
- Sistema aggiornamento forzato
* Verifica AdditionalInfo per identificare associazioni Pre-Discovery
* Skip controllo hash per associazioni appena scoperte
* Garantisce sincronizzazione dati al primo trasferimento
Vantaggi:
- Prevenzione automatica duplicati in Salesforce
- Recupero record esistenti senza associazioni
- Parità funzionale tra esecuzioni manuali e schedulate
- Performance ottimizzate con controllo hash per esecuzioni successive
Docs: PRE_DISCOVERY_SYSTEM.md, PRE_DISCOVERY_FORCED_UPDATE.md, SALESFORCE_FIND_ENTITIES_FIX.md
- Aggiunto campo MappedDestinationField al modello KeyAssociation per tracciare il campo destinazione mappato alla chiave sorgente
- Creata migration AddMappedDestinationFieldToKeyAssociation per aggiungere la colonna al database
- Implementata logica di popolamento in CreateAssociationAsync e StartDataTransferOriginal per salvare il campo destinazione mappato
- Aggiornato SaveAssociationParallelAsync per includere MappedDestinationField nelle query SQL UPDATE e INSERT
- Corretti indici parametri nella query UPDATE (da {7-9} a {8-10}) per includere il nuovo campo
- Aggiunta visualizzazione campo nell'interfaccia KeyAssociations (tabella, dettagli, export CSV)
- Implementato controllo validazione per impedire trasferimenti se il campo chiave non è mappato
- Aggiunto logging diagnostico dettagliato per debug del mapping dei campi
- Aggiornato ScheduledProfileExecutionService per popolare MappedDestinationField nelle esecuzioni schedulate
- Rimosso file BackgroundServices.cs obsoleto
- Documentazione completa creata (4 markdown files)
Fixes: Campo MappedDestinationField rimaneva NULL perché le query SQL raw non includevano il nuovo campo
BREAKING CHANGE: Tutte le pagine ora richiedono autenticazione
Nuove funzionalità:
- Sistema di login con password hardcoded (admin123)
- Form di login full-screen con gradiente viola
- Protezione automatica di tutte le route
- Pulsante logout visibile in tutte le pagine
- Gestione thread-safe eventi autenticazione con InvokeAsync()
Componenti:
- AuthenticationService: servizio Singleton per gestione stato
- Login.razor: pagina login con validazione e messaggi errore
- App.razor: routing condizionale basato su autenticazione
- MainLayout.razor: pulsante logout integrato
Fix tecnici:
- Risolto errore "Dispatcher not associated" usando InvokeAsync()
- Implementato pattern corretto per eventi cross-thread in Blazor Server
- Aggiunto Dispose per prevenire memory leak
Aggiunta funzionalità completa per l'eliminazione sicura delle credenziali
con rimozione automatica di tutti i dati associati.
Modifiche principali:
Backend:
- Aggiunta interfaccia ICredentialService.DeleteCredentialCascadeAsync()
- Implementato CredentialService.DeleteCredentialCascadeAsync() con gestione transazionale
- Aggiornata IDataConnectionCredentialService con metodi cascade delete
- Implementati wrapper in DataConnectionCredentialService
Eliminazione cascata gestisce:
- Execution histories delle schedulazioni
- Profile schedules associate ai profili
- Data Coupler profiles che usano le credenziali
- Key associations per credenziali REST
- Credenziale stessa
Frontend (CredentialManagement.razor):
- Aggiunto modale Bootstrap di conferma eliminazione con design danger
- Messaggio di attenzione chiaro che elenca cosa verrà eliminato
- Refactoring metodo DeleteCredential() per usare modale invece di confirm JS
- Aggiunti metodi CloseDeleteConfirmModal() e ConfirmDeleteCredential()
Sicurezza:
- Eliminazione fisica (hard delete) con transazione database
- Rollback automatico in caso di errore
- Logging dettagliato di ogni operazione
- Conferma esplicita dell'utente richiesta
- Aggiunge classe CachedRestClient per tracciare client con hash delle credenziali
- Implementa verifica automatica delle credenziali dal database tramite hash SHA256
- Mantiene cache dei client REST autenticati preservando lo stato di autenticazione
- Invalida automaticamente la cache quando le credenziali cambiano nel database
- Aggiunge logging dettagliato per debug dell'autenticazione Salesforce
- Migliora mappatura credenziali Salesforce con validazione Password e ClientSecret
BREAKING CHANGE: Le credenziali REST vengono sempre verificate dal database
mantenendo performance attraverso cache intelligente basata su hash crittografico
Fixes: risolve problemi di "invalid_client_id" intermittenti e _accessToken null
- Aggiunge configurazione JsonSerializerOptions per garantire compatibilità con Salesforce
- Implementa normalizzazione automatica di valori numerici con virgola decimale (es. "0,00" → 0.00)
- Sostituisce PostAsJsonAsync con StringContent personalizzato per controllo completo della serializzazione
- Aggiunge metodi NormalizeNumericValues e IsNumericWithComma per conversione formato decimale
- Aggiorna TransformValue per utilizzare InvariantCulture nelle conversioni numeriche
- Applica normalizzazione in CreateEntityAsync e metodi Composite (BatchCreate/BatchUpdate)
- Aggiunge logging dettagliato per tracciare le normalizzazioni numeriche
Risolve: "Impossibile deserializzare l'istanza di double da VALUE_STRING valore 0,00"
- Il problema era causato dall'invio di valori decimali nel formato italiano (virgola)
invece del formato americano (punto) richiesto da Salesforce API
- La soluzione garantisce che tutti i valori numerici vengano sempre serializzati
nel formato corretto per Salesforce indipendentemente dalla cultura locale
- Aggiunge colonna "Hash Dati" nella tabella delle associazioni con visualizzazione troncata
- Implementa generazione hash SHA256 che include signature dei mapping per rilevare modifiche configurazione
- Modifica logica trasferimento per saltare record con hash identico (ottimizzazione prestazioni)
- Corregge UpdateAssociationAsync per persistere correttamente Data_Hash e LastVerifiedAt nel database
- Aggiorna hash solo in caso di trasferimento riuscito, mantenendo coerenza tra Salesforce e database locale
- Migliora logging per debug del sistema di hash e associazioni
Risolve il problema dei trasferimenti continui quando i mapping cambiano e ottimizza le prestazioni saltando record non modificati.
- Parallelizzazione analisi record con Task.WhenAll e ConcurrentBag
- Aggiunta metodi thread-safe per operazioni database (SaveAssociationParallelAsync, FindAssociationByKeyValueParallelAsync, DeleteAssociationParallelAsync)
- Implementazione DbContext separati per evitare race conditions Entity Framework
- Ottimizzazione performance: riduzione tempo esecuzione da sequenziale a parallelo
- Logging dettagliato con tracking tempi esecuzione e distinzione operazioni parallele
- Aggiornamento interfacce IKeyAssociationService e IDataConnectionCredentialService
- Miglioramento gestione errori con thread-safety completa
Performance: 5-10x più veloce per grandi dataset con parallelizzazione end-to-end
- 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.
- Estrazione logica database in DatabaseMethod.cs con tutte le proprietà e metodi protected
- Estrazione logica REST API in RESTMethod.cs con gestione completa delle connessioni
- Creazione DataCouplerModels.cs per modelli condivisi (TransferResult)
- Pulizia file principale DataCoupler.razor.cs mantenendo solo orchestrazione generale
- Rimozione codice duplicato e miglioramento separazione delle responsabilità
- Compilazione verificata senza errori per l'intera soluzione
Struttura finale:
- DataCoupler.razor.cs: gestione file, profili, UI e coordinamento
- DatabaseMethod.cs: connessioni DB, query custom, discovery tabelle/schemi
- RESTMethod.cs: autenticazione REST, discovery entità, metadata
- DataCouplerModels.cs: modelli comuni per
- Implementato supporto per percorsi database specifici per OS (Windows, Linux, macOS)
- Rimossi file temporanei e di test non necessari dal CredentialManager
- Aggiunto supporto per directory di sistema standard per il database delle credenziali
- Mantenuto il codice legacy commentato per retrocompatibilità
- Aggiunte cartelle di test per future implementazioni
- Aggiunto campo SourceCustomQuery al modello DataCouplerProfile e DTO
- Creata migrazione database per la nuova colonna SourceCustomQuery
- Aggiornato DataCouplerProfileService per gestire il mapping della query custom
- Modificato ProfileSaver per includere la query custom nel salvataggio
- Implementata logica di caricamento profili con supporto query custom:
* Popolamento automatico della textbox con query salvata
* Validazione ed esecuzione automatica della query al caricamento
* Caricamento anteprima dati e mapping dopo validazione query
* Gestione priorità: query custom ha precedenza sulla selezione tabella
- Aggiornato DataCoupler.razor per passare la query custom al ProfileSaver
- Corretto salvataggio profili esistenti per includere SourceCustomQuery
Il sistema ora permette di salvare e ripristinare completamente le configurazioni
con query SQL personalizzate, mantenendo il comportamento esistente per le
✨ Nuove funzionalità:
- Aggiunto campo SourceDatabaseName nella tabella DataCouplerProfiles
- Implementato recupero automatico del nome database dalle credenziali
- Migliorata applicazione profili con supporto database specifico
- Aggiornata logica di connessione database con selezione database
🔧 Modifiche tecniche:
- Aggiunta migration per colonna SourceDatabaseName
- Estesi modelli DataCouplerProfile e DataCouplerProfileDto
- Aggiornato DataCouplerProfileService per gestire nuovo campo
- Modificato ProfileSaver per recupero automatico database name
- Implementato metodo ConnectToDatabaseWithSpecificDatabase
🐛 Correzioni:
- Migliorata gestione connessioni database multi-database
- Corretta formattazione codice e spaziature
- Rimosse linee vuote eccessive nel codice sorgente
🧪
- Aggiunto metodo GetCredentialIdByNameAsync in CredentialService per recuperare ID credenziali per nome
- Implementata gestione robusta dei profili duplicati con riattivazione, sovrascrittura e auto-rinomina
- Migliorata logica di caricamento profili con simulazione workflow utente e logging dettagliato
- Fixata gestione errori UNIQUE constraint nel salvataggio profili
- Aggiunto supporto per salvataggio ID credenziali reali invece di placeholder
- Implementato metodo GetProfileByNameIncludingInactiveAsync per gestire profili inattivi
- Aggiunto logging esteso per debug e troubleshooting
- Integrato componente ProfileSaver nella UI principale
- Risolti errori di compilazione e validazione build completa
- Migliorata gestione errori con feedback utente per credenziali/entità mancanti
- Sostituito EnsureCreatedAsync con MigrateAsync nel DatabaseInitializer
- Aggiunta gestione automatica delle migrazioni pendenti al startup
- Migliorata verifica delle tabelle includendo DataCouplerProfiles
- Rimossa logica obsoleta di ApplyMigrationsAsync
- Risolto errore "no such table: DataCouplerProfiles" nel salvataggio profili
Questo fix garantisce che tutte le migrazioni vengano applicate correttamente,
permettendo il corretto funzionamento del sistema di salvataggio
- Refactoring logica connessione database per gestire database specificato/non specificato
- Implementazione selezione database tramite modale quando necessario
- Aggiunta discovery robusta di tabelle, colonne e preview dati
- Implementazione validazione completa query custom (solo SELECT, blocco SQL injection)
- Aggiunta preview paginata dati per query custom
- Implementazione mapping automatico dei campi
- Implementazione auto-selezione chiave primaria:
* Per tabelle database: rilevamento automatico PK
* Per query custom: ricerca pattern comuni (id, key, etc.)
* Per file Excel/CSV: ricerca pattern italiani (codice, numero, etc.)
- Aggiunta logging dettagliato per debugging e tracciamento flusso
- Implementazione sistema associazioni con fallback robusto
- Miglioramento gestione errori e validazioni input utente
- Test funzionali completi e validazione end-to-end
Il sistema ora supporta completamente il flusso di estrazione dati da database/file
verso API REST con gestione automatica delle chiavi e mapping intelligente.
- Modifica IsDatabaseSpecifiedInConnectionString per verificare prima il campo DatabaseName della credenziale
- Aggiunge logging dettagliato per debugging del processo di connessione database
- Corregge il flusso di connessione per evitare il modale quando il database è già specificato
- Migliora la gestione degli errori nel caricamento tabelle dal database specificato
- Rimuove codice non raggiungibile nella logica di connessione database
Il bug precedente mostrava sempre il modale di selezione database anche quando
il database era specificato nel campo DatabaseName della credenziale, ora la
verifica segue la logica corretta:
1. Controlla se DatabaseName è valorizzato nella credenziale
2. Solo se vuoto, verifica i parametri Database=/Initial Catalog= nella connection string
- Corretto metodo ValidateCustomQuery per utilizzare CreateLimitedQuery con sintassi specifica per ogni tipo di database
- Rimosso uso diretto di "LIMIT 1" che causava errori su SQL Server e Oracle
- Implementato supporto per sintassi corretta: TOP (SQL Server), ROWNUM (Oracle), LIMIT (MySQL/PostgreSQL/SQLite), FETCH FIRST (DB2)
- Aggiunto messaggio di successo verde nella UI per query valide
- Migliorata gestione degli errori nella validazione con logging dettagliato
- La validazione ora funziona correttamente su tutti i database supportati (SQL Server, Oracle, MySQL, PostgreSQL, SQLite, DB2, SAP HANA)
- Aggiunge nuova pagina ProfilesManagement (/profiles) con dashboard completo
- Implementa statistiche profili (totali, attivi, recenti, non utilizzati)
- Aggiunge filtri avanzati per ricerca e ordinamento profili
- Implementa visualizzazione dettagli profili con mappature campi
- Aggiunge funzionalità di eliminazione profili con conferma
- Implementa esportazione profili in formato JSON
- Aggiunge sistema di notifiche toast per feedback utente
- Integra navigazione nel menu principale
- Risolve errori di compilazione e duplicazione file
- Migliora UX con design responsive e interfaccia moderna
- Implementato discovery intelligente database vs schemi per ogni DBMS
- Aggiornate query SQL per mostrare solo database effettivi (non ruoli/schemi di sistema)
- Aggiunta UI modal per selezione database con riconnessione automatica
- Aggiunta UI modal fallback per selezione schema quando necessario
- Migliorate query discovery per SQL Server, PostgreSQL, MySQL e Oracle
- Implementata logica di riconnessione automatica al database selezionato
- Aggiornati testi e descrizioni dell'interfaccia per maggiore chiarezza
- Gestione prioritaria: database disponibili fallback su schemi se necessario
Fixes: Menu selezione mostrava ruoli invece dei database reali
- Creata nuova libreria Components con componenti Blazor riutilizzabili
* ProfileSelector: dropdown per selezione profili salvati
* ProfileSaver: componente per salvare configurazioni correnti come profili
* ProfileManagement: modale per gestione profili salvati
* ProfileQuickActions: bottoni azioni rapide per operazioni sui profili
- Esteso CredentialManager con entità e servizi per DataCouplerProfile
* Aggiunto modello DataCouplerProfile con configurazioni mapping e metadati
* Implementata migrazione Entity Framework per memorizzazione profili
* Creato DataCouplerProfileService per operazioni CRUD
* Aggiunto CredentialDbContextFactory per operazioni database design-time
- Migliorato componente principale DataCoupler con integrazione profili
* Integrata funzionalità caricamento/salvataggio profili
* Aggiunto selettore profili nella parte superiore dell'interfaccia
* Mantenuta retrocompatibilità con funzionalità esistenti
* Migliorata esperienza utente con gestione configurazioni salvate
- Aggiornata struttura progetto e dipendenze
* Aggiunto progetto Components alla soluzione
* Aggiornati riferimenti progetti e import
* Rimosso progetto obsoleto TestDatabaseFix
Questo aggiornamento migliora significativamente il flusso di lavoro permettendo agli utenti di salvare, caricare e gestire configurazioni complete di accoppiamento dati come
**Refactoring: Separazione logica C# da markup Razor nel componente DataCoupler**
**Modifiche principali:**
- Spostamento di tutta la logica C# dal file DataCoupler.razor al file DataCoupler.razor.cs come partial class
- Rimozione completa del blocco @code dal file .razor mantenendo solo il markup HTML/Razor
- Aggiunta delle using directive mancanti (System.Data, System.Text, ExcelDataReader, ecc.)
- Correzione delle firme dei metodi e degli handler di eventi per la compatibilità Blazor
- Sistemazione delle proprietà di iniezione dei servizi [Inject] nel code-behind
- Risoluzione di tutti gli errori di compilazione relativi alla separazione dei file
**Miglioramenti strutturali:**
- Migliore separazione delle responsabilità tra presentazione e logica business
- Struttura del codice più pulita e manutenibile seguendo le best practice Blazor
- Codice più facilmente testabile con la logica isolata nel file .cs
- Rimozione di codice duplicato e ottimizzazione delle funzioni di utilità
**File modificati:**
- Data_Coupler/Pages/DataCoupler.razor: Pulizia markup, rimozione blocco @code
- Data_Coupler/Pages/DataCoupler.razor.cs: Implementazione completa della logica C# come partial class
Questo refactoring migliora significativamente la struttura del codice seguendo le convenzioni standard di Blazor per la separazione tra markup e logica applicativa.
- Implementato controllo di sicurezza per bloccare query non SELECT
- Aggiunta funzione IsSelectQuery() con validazione robusta
- Bloccate operazioni pericolose: INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, TRUNCATE, EXEC, etc.
- Implementata pulizia query per prevenire bypass tramite commenti SQL
- Aggiunto controllo per multiple statements separati da ;
- Aggiunto avviso di sicurezza nell'interfaccia utente
- Implementato logging di sicurezza per audit e debug
- Controllo applicato sia in validazione che in esecuzione per doppia protezione
Il sistema ora garantisce che solo query SELECT possano essere eseguite,
mantenendo la sicurezza del database e prevenendo operazioni di modifica non autorizzate.