Files
Data-Coupler/CredentialManager/CredentialManagerConfiguration.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

130 lines
4.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using CredentialManager.Data;
using CredentialManager.Services;
namespace CredentialManager;
/// <summary>
/// Classe per la configurazione del CredentialManager
/// </summary>
public static class CredentialManagerConfiguration
{
/// <summary>
/// Registra i servizi del CredentialManager
/// </summary>
/// <param name="services">La collezione di servizi</param>
/// <param name="databasePath">Il percorso del database SQLite (opzionale, default: credentials.db)</param>
/// <returns>La collezione di servizi</returns>
public static IServiceCollection AddCredentialManager(
this IServiceCollection services,
string? databasePath = null)
{
// Imposta il percorso predefinito se non specificato
databasePath ??= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"CredentialManager", "credentials.db");
// Assicurati che la directory esista
var directory = Path.GetDirectoryName(databasePath);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// Registra il DbContext
services.AddDbContext<CredentialDbContext>(options =>
options.UseSqlite($"Data Source={databasePath}"));
// Registra i servizi
services.AddScoped<IEncryptionService, EncryptionService>();
services.AddScoped<ICredentialService, CredentialService>();
services.AddScoped<IDatabaseInitializer, DatabaseInitializer>();
return services;
}
/// <summary>
/// Inizializza il database del CredentialManager
/// </summary>
/// <param name="serviceProvider">Il provider di servizi</param>
/// <returns>Task completato</returns>
public static async Task InitializeCredentialManagerAsync(this IServiceProvider serviceProvider)
{
using var scope = serviceProvider.CreateScope();
var initializer = scope.ServiceProvider.GetRequiredService<IDatabaseInitializer>();
await initializer.InitializeAsync();
}
}
/// <summary>
/// Factory per creare un'istanza standalone del CredentialManager
/// </summary>
public static class CredentialManagerFactory
{
/// <summary>
/// Crea un'istanza standalone del CredentialManager
/// </summary>
/// <param name="databasePath">Il percorso del database SQLite (opzionale)</param>
/// <param name="loggerFactory">Factory per il logging (opzionale)</param>
/// <returns>Un'istanza di ICredentialService</returns>
public static async Task<ICredentialService> CreateAsync(
string? databasePath = null,
ILoggerFactory? loggerFactory = null)
{
// Configurazione dei servizi
var services = new ServiceCollection();
// Aggiungi logging se fornito
if (loggerFactory != null)
{
services.AddSingleton(loggerFactory);
services.AddLogging();
}
else
{
services.AddLogging(builder => builder.AddConsole());
}
// Aggiungi CredentialManager
services.AddCredentialManager(databasePath);
// Costruisci il provider di servizi
var serviceProvider = services.BuildServiceProvider();
// Inizializza il database
await serviceProvider.InitializeCredentialManagerAsync();
// Restituisci il servizio
return serviceProvider.GetRequiredService<ICredentialService>();
}
/// <summary>
/// Crea un'istanza standalone del CredentialManager con configurazione personalizzata
/// </summary>
/// <param name="configureServices">Azione per configurare servizi aggiuntivi</param>
/// <param name="databasePath">Il percorso del database SQLite (opzionale)</param>
/// <returns>Il provider di servizi configurato</returns>
public static async Task<IServiceProvider> CreateServiceProviderAsync(
Action<IServiceCollection>? configureServices = null,
string? databasePath = null)
{
var services = new ServiceCollection();
// Configurazione di base
services.AddLogging(builder => builder.AddConsole());
services.AddCredentialManager(databasePath);
// Configurazione personalizzata
configureServices?.Invoke(services);
// Costruisci il provider
var serviceProvider = services.BuildServiceProvider();
// Inizializza il database
await serviceProvider.InitializeCredentialManagerAsync();
return serviceProvider;
}
}