Files
Data-Coupler/DataConnection/DB/EF/DbManagerOptions.cs
T
Alessio c22b4a2613 feat: Integrazione completa gestione credenziali per database e REST API con supporto SAP B1 e Salesforce
NUOVE FUNZIONALITÀ:
- Aggiunto modulo CredentialManager per gestione centralizzata credenziali
- Implementata UI Blazor per gestione credenziali (CredentialManagement.razor)
- Supporto completo per credenziali database (SQL Server, MySQL, PostgreSQL, Oracle, SQLite, DB2, SAP HANA)
- Gestione unificata REST API con supporto specifico per SAP B1 Service Layer e Salesforce
- Test reali di connessione per database, SAP B1 e Salesforce OAuth2
- Selezione dinamica tipo servizio REST (Generico, SAP B1, Salesforce) con campi specifici
- Persistenza sicura di credenziali con crittografia password e campi sensibili

COMPONENTI AGGIUNTI:
- CredentialManager/Models/: CredentialEntity, CredentialModels (DatabaseCredential, RestApiCredential, SapB1ServiceLayerCredential, SalesforceCredential)
- CredentialManager/Services/: CredentialService, EncryptionService, DatabaseInitializer
- CredentialManager/Data/: CredentialDbContext con Entity Framework
- DataConnection/CredentialManagement/: Interfacce e servizi di integrazione
- Data_Coupler/Pages/CredentialManagement.razor: UI completa per gestione credenziali

MIGLIORAMENTI UI:
- Form dinamica per REST API con campi specifici per tipo servizio
- Validazione campi obbligatori per Salesforce (ClientId, ClientSecret, SecurityToken)
- Test connessione in tempo reale dalla modale di inserimento/modifica
- Rimozione sezioni separate per SAP B1 e Salesforce (ora unificate in REST API)
- Gestione stato loading durante operazioni async

PERSISTENZA AVANZATA:
- Campo RestServiceType aggiunto a CredentialEntity con migrazione automatica
- Serializzazione campi specifici Salesforce/SAP B1 in AdditionalParameters JSON
- Mapping bidirezionale tra entità database e modelli business
- Gestione nullability e conversioni tipo sicure

SICUREZZA:
- Crittografia AES-256 per password e token sensibili
- Gestione sicura ConnectionString database
- Validazione input e sanitizzazione dati

TESTING E CONNETTIVITÀ:
- Test autenticazione reale SAP B1 Service Layer
- Test OAuth2 Salesforce con supporto Connected App
- Test connettività database multi-provider
- Logging dettagliato per debugging e monitoraggio

CONFIGURAZIONE:
- Dependency injection per tutti i servizi
- Configurazione Entity Framework con SQLite
- Tasks VS Code per build e run
- Gestione connection string centralizzata

CORREZIONI:
- Risolti errori nullability in CredentialService
- Aggiunto using Microsoft.JSInterop per IJSRuntime
- Fix compilazione e warning

Files modificati: 35+ file tra nuovi e aggiornati
2025-06-17 01:43:17 +02:00

123 lines
4.1 KiB
C#

using System;
using Microsoft.EntityFrameworkCore;
using DataConnection.Interfaces;
using DataConnection.EF.DatabaseDiscovery;
using DataConnection.Enums;
namespace DataConnection.EF;
/// <summary>
/// Opzioni per la configurazione del manager di database esistenti
/// </summary>
public class DbManagerOptions
{
/// <summary>
/// Configuratore del DbContext
/// </summary>
public Action<DbContextOptionsBuilder> DbContextConfigurator { get; set; }
/// <summary>
/// Configuratore del modello del database
/// </summary>
public Action<ModelBuilder> ModelConfigurator { get; set; }
/// <summary>
/// Flag che indica se la scoperta automatica delle entità è abilitata
/// </summary>
public bool EnableAutoDiscovery { get; set; }
/// <summary>
/// Assembly da cui caricare automaticamente le entità (se EnableAutoDiscovery = true)
/// </summary>
public System.Reflection.Assembly EntityAssembly { get; set; }
/// <summary>
/// Namespace in cui cercare le entità (se EnableAutoDiscovery = true)
/// </summary>
public string EntityNamespace { get; set; }
/// <summary>
/// Timeout per le operazioni del database (in secondi)
/// </summary>
public int CommandTimeout { get; set; } = 30;
/// <summary>
/// Strategia di mappatura dei nomi (CamelCase, PascalCase, SnakeCase)
/// </summary>
public NamingStrategy NamingStrategy { get; set; } = NamingStrategy.Default;
/// <summary>
/// Servizio per la scoperta dei database disponibili sul server
/// </summary>
public IDatabaseDiscovery DatabaseDiscoveryService { get; set; }
/// <summary>
/// Stringa di connessione a livello di server (senza specificare il database)
/// </summary>
public string ServerConnectionString { get; set; }
/// <summary>
/// Nome del database a cui connettersi
/// </summary>
public string DatabaseName { get; set; }
/// <summary>
/// Tipo di database (SqlServer, MySql, ecc.)
/// </summary>
public DatabaseType DatabaseType { get; set; } = DatabaseType.SqlServer; /// <summary>
/// Configura automaticamente il servizio di scoperta database in base al tipo di database
/// </summary>
/// <param name="databaseType">Tipo di database</param>
public void ConfigureDatabaseDiscovery(DatabaseType databaseType)
{
DatabaseType = databaseType;
switch (databaseType)
{
case DatabaseType.SqlServer:
DatabaseDiscoveryService = new SqlServerDatabaseDiscovery();
DbContextConfigurator = options => options.UseSqlServer(BuildFullConnectionString(),
sqlOptions => sqlOptions.CommandTimeout(CommandTimeout));
break;
default:
// Per altri database, configuriamo un configuratore di base che non fa nulla
// Il test di connessione userà un approccio diverso
DbContextConfigurator = options => { };
break;
}
}
/// <summary>
/// Costruisce una stringa di connessione completa includendo il database selezionato
/// </summary>
public string BuildFullConnectionString()
{
if (string.IsNullOrEmpty(ServerConnectionString))
{
throw new InvalidOperationException("La stringa di connessione al server non è stata specificata");
}
if (string.IsNullOrEmpty(DatabaseName))
{
return ServerConnectionString;
}
// Per SQL Server
if (ServerConnectionString.Contains("Initial Catalog=") || ServerConnectionString.Contains("Database="))
{
// Sostituisci il database esistente
var modifiedString = System.Text.RegularExpressions.Regex.Replace(
ServerConnectionString,
@"(Initial Catalog|Database)=([^;]*)",
$"$1={DatabaseName}");
return modifiedString;
}
else
{
// Aggiungi il database
return ServerConnectionString + $";Database={DatabaseName}";
}
}
}