Alessio e70abcdcb1 [Feature] Supporto Visual FoxPro / dBase come sorgente dati (managed, sola lettura)
Aggiunge un connettore completamente managed per database Visual FoxPro e dBase,
utilizzabile come sorgente dati in tutti i flussi dell'applicazione (discovery manuale,
esecuzione schedulata, hash/change-detection, backup/restore).

## Motivazione

Il provider OLE DB ufficiale (VFPOLEDB.1) è solo a 32-bit, deprecato e richiede
installazione separata. Il connettore managed usa DbfDataReader 1.0.0 (MIT), legge
direttamente i file .dbf/.fpt/.dbc a 64-bit senza dipendenze esterne e con streaming
efficiente (tabelle da centinaia di MB con uso di memoria contenuto).

## Nuovi file

- DataConnection/DB/FoxPro/FoxProConnectionInfo.cs
  Classe sealed con le informazioni di connessione risolte (cartella, percorso .dbc,
  encoding, flag IncludeDeleted). Proprietà di convenienza IsContainer e DisplayName.

- DataConnection/DB/FoxPro/FoxProReader.cs
  Helper statico che registra CodePagesEncodingProvider, risolve la connection string
  (path diretto, stile OLE DB con Provider=vfpoledb, chiave=valore), verifica l'accesso
  al filesystem, legge il catalogo .dbc (il file .dbc è esso stesso un DBF; filtro su
  OBJECTTYPE='Table' + cross-check esistenza fisica .dbf), enumera le tabelle free,
  mappa i tipi VFP (Character, Memo, Numeric, Float, Double, Integer, Currency, Date,
  DateTime, Logical, General) in descrizioni leggibili, esegue streaming dei record via
  DbfDataReader, auto-rileva l'encoding dall'header DBF (language driver byte) con
  fallback a code page 1252, e analizza query SELECT [TOP n] * FROM tabella.

- DataConnection/DB/FoxProDatabaseManager.cs
  Implementa IDatabaseManager. Lettura: TestConnectionAsync, GetTableNamesAsync,
  GetTableSchemaAsync, GetDatabaseSchemaAsync, GetAllRecordsAsync, ExecuteRawQueryAsync,
  GetPrimaryKeyFieldAsync (ritorna null, selezione manuale chiave), GetAvailableDatabasesAsync,
  ChangeDatabaseAsync (no-op per sorgenti file-based).
  Scrittura: tutti i metodi di modifica (Insert/Update/Delete/Upsert/BulkInsert/
  ExecuteCommand/ExecuteNonQuery) lanciano NotSupportedException con messaggio esplicito.

- DataConnection/DB/EF/SchemaProviders/FoxProSchemaProvider.cs
  Implementa IDatabaseSchemaProvider delegando a FoxProReader. Gestione errori per tabella
  in GetDatabaseSchemaAsync (una tabella non apribile non blocca la discovery).

- FOXPRO_CONNECTION.md
  Guida utente: passo-passo per creare la credenziale, formato connection string,
  tabella tipi VFP supportati, note su sola lettura e limitazioni query, tabella
  risoluzione problemi (caratteri accentati, tabelle mancanti, ecc.).

## File modificati

- DataConnection/DataConnection.csproj
  Aggiunto DbfDataReader 1.0.0 (porta transitivamente System.Text.Encoding.CodePages
  >= 10.0.3; rimossa dipendenza esplicita alla versione 9.0.3 che causava NU1605).

- DataConnection/DB/Enums/DatabaseType.cs
  Aggiunto valore Foxpro in fondo all'enum (preserva valori già persistiti).

- CredentialManager/Models/CredentialModels.cs
  Aggiunto DatabaseType.Foxpro all'enum e metodo BuildFoxproConnectionString che genera
  "Data Source=percorso[;CodePage=n][;IncludeDeleted=true]".

- DataConnection/CredentialManagement/Models/CredentialExtensions.cs
  Mappatura bidirezionale Foxpro tra enum CredentialManager e DataConnection.

- DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs
  Aggiunto TestFoxproConnection: verifica percorso accessibile, legge nomi tabelle,
  restituisce messaggio con conteggio tabelle, encoding rilevato e nota sola lettura.

- DataConnection/DB/EF/DatabaseSchemaProviderFactory.cs
  Caso Foxpro => new FoxProSchemaProvider().

- Data_Coupler/Services/DataConnectionFactory.cs
  Branch Foxpro => new FoxProDatabaseManager(connectionString).

- Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs
  Aggiunto IsFoxproConnection() e caso Foxpro in CreateLimitedQuery
  (SELECT TOP n * FROM (query) AS subquery).

- CredentialManager/Integration/DataConnectionHelper.cs
  ValidateDatabaseCredential: introdotto flag isFileBased (Sqlite || Foxpro) per
  esonerare host/utente/password/porta; messaggio di errore specifico per il campo
  percorso FoxPro.

- Data_Coupler/Pages/CredentialManagement.razor
  Aggiunta opzione "Visual FoxPro (.dbc / .dbf)" nel selettore tipo database.
  Sezione di configurazione dedicata: banner sola lettura, campo percorso con esempi
  (.dbc e cartella), dropdown code page (Auto/1252/1250/1251/850/437/65001), checkbox
  record cancellati, pannello tipi supportati, anteprima connection string.
  Fix validazione form test-connessione: branch Foxpro che verifica solo DatabaseName
  (non Host/Username/Password), eliminando il falso errore "Il campo Host è obbligatorio".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 19:34:21 +02:00

Data-Coupler

Panoramica

Data-Coupler è una soluzione integrata per la gestione di connessioni dati e credenziali, composta da tre progetti principali:

  • CredentialManager: Libreria per la gestione sicura delle credenziali
  • DataConnection: Libreria per connessioni a database e API REST
  • Data_Coupler: Applicazione Blazor Server per l'interfaccia utente

🆕 Novità Recenti (Febbraio 2026)

  • Salesforce Batch Describe via Composite API: I metadati degli SObject vengono ora recuperati in batch (25 per chiamata) invece di N chiamate singole, riducendo drasticamente il consumo di API durante la discovery
  • Discovery REST Parallela: DiscoverEntitySummariesAsync e DiscoverEntitiesAsync vengono eseguite in parallelo; la lista entità diventa interattiva quasi subito, i dettagli arrivano in background
  • Fix Scheduler External ID Relationships: Corretti due bug nello schedulatore — ExternalIdRelationshipsJson e DefaultValuesJson venivano azzerati al re-salvataggio del profilo; i campi sorgente usati nelle relazioni External ID non venivano esclusi dal mapping normale

🆕 Novità Recenti (Gennaio 2026)

  • Schedulazione File CSV/Excel: Supporto completo per schedulare trasferimenti da file
  • Validazione Percorsi: Validazione file prima del salvataggio profili
  • Deletion Sync Configurabile: Controllo granulare sincronizzazione eliminazioni
  • Doppia Modalità File: Caricamento browser (preview) + percorso manuale (schedulazione)

Architettura

CredentialManager

Libreria responsabile per:

  • Gestione sicura delle credenziali (Database, REST API)
  • Crittografia dei dati sensibili
  • Persistenza su database SQLite
  • Validazione delle credenziali

DataConnection

Libreria per connessioni dati che include:

  • Supporto per database: SQL Server, MySQL, PostgreSQL, Oracle, SQLite, DB2, SAP HANA
  • Gestione connessioni REST API
  • Integrazione con CredentialManager per l'autenticazione
  • Factory pattern per la gestione di diversi provider

Data_Coupler

Applicazione Blazor Server che fornisce:

  • Interfaccia web per la gestione delle credenziali
  • CRUD completo per credenziali database e REST API
  • Test delle connessioni
  • Validazione form integrata

Configurazione

1. Database delle Credenziali

L'applicazione utilizza SQLite per memorizzare le credenziali. Il database viene automaticamente creato in:

Data_Coupler/wwwroot/data/credentials.db

2. Registrazione Servizi

Nel Program.cs di Data_Coupler:

// Add CredentialManager services
builder.Services.AddDataConnectionCredentialManagement("Data Source=wwwroot/data/credentials.db");

Utilizzo

Gestione Credenziali via Web Interface

  1. Avviare l'applicazione Data_Coupler
  2. Navigare su /credentials
  3. Utilizzare l'interfaccia per:
    • Aggiungere nuove credenziali (Database/REST API)
    • Modificare credenziali esistenti
    • Testare le connessioni
    • Eliminare credenziali

Utilizzo Programmatico

// Iniettare il servizio
@inject IDataConnectionCredentialService CredentialService

// Ottenere opzioni per connessione database
var dbOptions = await CredentialService.GetDbManagerOptionsAsync("MyDatabase");

// Ottenere opzioni per API REST
var apiOptions = await CredentialService.GetRestServiceOptionsAsync("MyApi");

// Gestire credenziali
var credential = new DatabaseCredential
{
    Name = "Test",
    DatabaseType = DatabaseType.SqlServer,
    Host = "localhost",
    Port = 1433,
    DatabaseName = "TestDB",
    Username = "user",
    Password = "password"
};

await CredentialService.SaveDatabaseCredentialAsync(credential);

Struttura dei Progetti

Data-Coupler/
├── CredentialManager/              # Gestione credenziali
│   ├── Data/                       # DbContext e configurazioni
│   ├── Models/                     # Modelli per credenziali
│   └── Services/                   # Servizi core
├── DataConnection/                 # Connessioni dati
│   ├── CredentialManagement/       # Integrazione con CredentialManager
│   │   ├── Interfaces/             # Interfacce servizi
│   │   ├── Models/                 # Extension methods e conversioni
│   │   └── Services/               # Implementazione servizi
│   ├── DB/                         # Gestione database
│   └── REST/                       # Gestione API REST
└── Data_Coupler/                   # Applicazione Blazor
    ├── Pages/                      # Pagine Blazor
    │   └── CredentialManagement.razor
    ├── Shared/                     # Componenti condivisi
    └── wwwroot/data/               # Database SQLite

Build e Deployment

Prerequisiti

  • .NET 9.0 SDK
  • Visual Studio 2022 o VS Code
  • Docker (opzionale, per deployment containerizzato)

Build Locale

dotnet build Data_Coupler.sln

Esecuzione Locale

dotnet run --project Data_Coupler/Data_Coupler.csproj

L'applicazione sarà disponibile su:

Formati File Supportati

CSV

  • Separatori: , (virgola), ; (punto e virgola), \t (tab), | (pipe)
  • Rilevamento automatico: Sì
  • Gestione quote: Supporto completo per campi tra virgolette
  • Escape caratteri: Supporto per "" (double quote escape)
  • Dimensione massima: 50 MB (configurabile)
  • Schedulazione: Supportato con percorso file manuale

Excel

  • Formati: .xlsx (Office Open XML), .xls (Binary Format)
  • Fogli multipli: Legge il primo foglio per default
  • Header: Prima riga utilizzata come intestazione
  • Dimensione massima: 50 MB (configurabile)
  • Schedulazione: Supportato con percorso file manuale

Modalità Caricamento File

1. Caricamento Browser (Preview)

  • Carica file tramite browser per configurare mapping
  • Processato in memoria, non salvato sul server
  • Ideale per setup iniziale profilo

2. Percorso Manuale (Schedulazione)

  • Specifica percorso completo file sul server
  • Obbligatorio per profili schedulati
  • Sistema valida esistenza e leggibilità
  • Esempi: C:\Data\products.csv, /data/customers.xlsx

🐳 Deployment Docker

Quick Start con Docker:

# Pull e run (immagine pubblica)
docker run -d -p 7550:7550 -v data-coupler-data:/var/lib/Data_Coupler ghcr.io/alessiodalsi/data-coupler:latest

# Con Docker Compose
docker-compose up -d

Build Locale:

# Linux
docker build -t data-coupler:local -f Dockerfile .

# Windows
docker build -t data-coupler:local-windows -f Dockerfile.windows .

# Script automatico (PowerShell)
.\build-docker.ps1 -Target all -Test

# Script automatico (Bash)
./build-docker.sh all

Immagini Disponibili:

  • Linux/Multi-platform: ghcr.io/alessiodalsi/data-coupler:latest
  • Windows: ghcr.io/alessiodalsi/data-coupler:latest-windows
  • Development: ghcr.io/alessiodalsi/data-coupler:development-latest
  • Dev: ghcr.io/alessiodalsi/data-coupler:dev-latest
  • Staging: ghcr.io/alessiodalsi/data-coupler:staging-latest

Note: Il tag latest viene automaticamente aggiornato sia dal branch main che dal branch development per garantire che le ultime funzionalità siano sempre disponibili. Il tag development-latest è specifico per il branch development.

📚 Documentazione Docker Completa: Vedi DOCKER_DEPLOYMENT.md e GITHUB_ACTIONS_SETUP.md

🔄 CI/CD Pipeline

Il progetto supporta pipeline CI/CD automatiche su:

GitHub Actions (.github/workflows/docker-build.yml):

  • Build automatica su push ai branch main, development, staging
  • Pubblicazione su GitHub Container Registry (ghcr.io)
  • Multi-platform manifest (Linux + Windows)

Gitea Actions (.gitea/workflows/docker-build.yml):

  • Stessa configurazione di GitHub Actions
  • Pubblicazione su Gitea Container Registry (gitea.home-nas-ds.org)
  • Istanza Gitea self-hosted con registry abilitato
  • Configurazione: .gitea/workflows/README.md

Immagini su Gitea (self-hosted):

# Pull da Gitea Container Registry
docker pull gitea.home-nas-ds.org/alessio/data-coupler:latest

# Versioni disponibili
docker pull gitea.home-nas-ds.org/alessio/data-coupler:development-latest
docker pull gitea.home-nas-ds.org/alessio/data-coupler:staging-latest

📚 Setup Gitea: Vedi .gitea/workflows/README.md

Caratteristiche di Sicurezza

  • Crittografia: Le password vengono crittografate prima del salvataggio
  • Validazione: Validazione completa dei dati in input
  • Isolamento: Ogni progetto ha responsabilità specifiche
  • Type Safety: Uso di tipi forti per evitare errori
  • Validazione File: Verifica esistenza e leggibilità file prima del salvataggio
  • Deletion Sync Sicuro:
    • Disabilitato di default per prevenire eliminazioni accidentali
    • Disponibile solo nelle schedulazioni con configurazione esplicita
    • Warning chiaro nell'interfaccia utente per operazioni critiche
  • Percorsi File Validati: Controllo permessi e accessibilità per schedulazioni

Testing

L'applicazione include funzionalità di test per:

  • Connessioni database
  • Chiamate API REST
  • Validazione credenziali

Il testing può essere eseguito direttamente dall'interfaccia web.

Log e Monitoring

I servizi utilizzano ILogger per tracciare:

  • Operazioni CRUD sulle credenziali
  • Test di connessione
  • Errori e eccezioni

Contributi

Per contribuire al progetto:

  1. Fork del repository
  2. Creare un branch per la feature
  3. Implementare i cambiamenti
  4. Testare thoroughly
  5. Creare una Pull Request

Licenza

[Specificare la licenza del progetto]

S
Description
No description provided
Readme 2.9 MiB
Languages
C# 70%
HTML 28.1%
PowerShell 1.1%
CSS 0.3%
Shell 0.3%
Other 0.2%