namespace CredentialManager.Models; /// /// Tipi di credenziali supportate /// public enum CredentialType { Database, RestApi, OAuth, ApiKey, BasicAuth } /// /// Tipi di servizi REST specifici /// public enum RestServiceType { Generic, SapB1ServiceLayer, Salesforce } /// /// Tipi di database supportati (allineato con DataConnection.Enums.DatabaseType) /// public enum DatabaseType { SqlServer, MySql, PostgreSql, Oracle, Sqlite, DB2, SapHana } /// /// DTO per le credenziali database - completo per tutti i tipi di DB supportati /// public class DatabaseCredential { public string Name { get; set; } = string.Empty; public DatabaseType DatabaseType { get; set; } public string Host { get; set; } = string.Empty; public int Port { get; set; } public string? DatabaseName { get; set; } = string.Empty; // Ora opzionale public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public string? ConnectionString { get; set; } public int CommandTimeout { get; set; } = 30; public bool IgnoreSslErrors { get; set; } = false; public Dictionary? AdditionalParameters { get; set; } } /// /// DTO per le credenziali REST API - allineato con RestServiceOptions e esteso per servizi specifici /// public class RestApiCredential { public string Name { get; set; } = string.Empty; public RestServiceType ServiceType { get; set; } = RestServiceType.Generic; public string BaseUrl { get; set; } = string.Empty; public string? ApiKey { get; set; } public string? Username { get; set; } public string? Password { get; set; } public string? AuthToken { get; set; } public string? BearerToken { get; set; } public int TimeoutSeconds { get; set; } = 100; public bool IgnoreSslErrors { get; set; } = false; public Dictionary? Headers { get; set; } public Dictionary? AdditionalParameters { get; set; } // Campi specifici per SAP B1 Service Layer public string? CompanyDatabase { get; set; } public string? Language { get; set; } = "en-US"; public string? Version { get; set; } = "v1"; public bool UseTrustedConnection { get; set; } = false; // Campi specifici per Salesforce public string? SecurityToken { get; set; } public string? ClientId { get; set; } public string? ClientSecret { get; set; } public string? ApiVersion { get; set; } = "59.0"; public bool IsSandbox { get; set; } = false; public bool UseSoapApi { get; set; } = false; public string? RefreshToken { get; set; } public string? AccessToken { get; set; } public DateTime? TokenExpiry { get; set; } } /// /// Credenziali specifiche per SAP Business One Service Layer /// public class SapB1ServiceLayerCredential { public string Name { get; set; } = string.Empty; public string ServerUrl { get; set; } = string.Empty; // es: https://server:50000/b1s/v1/ public string CompanyDatabase { get; set; } = string.Empty; // Database dell'azienda SAP public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public string? Language { get; set; } = "en-US"; // Lingua per la sessione public int TimeoutSeconds { get; set; } = 300; // Timeout per le chiamate API public bool IgnoreSslErrors { get; set; } = false; public string? Version { get; set; } = "v1"; // Versione del Service Layer (v1, v2, etc.) public bool UseTrustedConnection { get; set; } = false; // Per autenticazione Windows public Dictionary? AdditionalHeaders { get; set; } } /// /// Credenziali specifiche per Salesforce /// public class SalesforceCredential { public string Name { get; set; } = string.Empty; public string LoginUrl { get; set; } = "https://login.salesforce.com"; // o https://test.salesforce.com per sandbox public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public string SecurityToken { get; set; } = string.Empty; // Token di sicurezza Salesforce public string? ClientId { get; set; } = string.Empty; // Consumer Key per Connected App public string? ClientSecret { get; set; } = string.Empty; // Consumer Secret per Connected App public string ApiVersion { get; set; } = "59.0"; // Versione API Salesforce public bool IsSandbox { get; set; } = false; // Se è un ambiente sandbox public int TimeoutSeconds { get; set; } = 120; public bool UseSoapApi { get; set; } = false; // Se usare SOAP invece di REST public string? RefreshToken { get; set; } public string? AccessToken { get; set; } public DateTime? TokenExpiry { get; set; } } /// /// Factory per creare connection string per i diversi tipi di database /// public static class ConnectionStringBuilder { public static string BuildConnectionString(DatabaseCredential credential) { if (!string.IsNullOrEmpty(credential.ConnectionString)) return credential.ConnectionString; return credential.DatabaseType switch { DatabaseType.SqlServer => BuildSqlServerConnectionString(credential), DatabaseType.MySql => BuildMySqlConnectionString(credential), DatabaseType.PostgreSql => BuildPostgreSqlConnectionString(credential), DatabaseType.Oracle => BuildOracleConnectionString(credential), DatabaseType.Sqlite => BuildSqliteConnectionString(credential), DatabaseType.DB2 => BuildDb2ConnectionString(credential), DatabaseType.SapHana => BuildSapHanaConnectionString(credential), _ => throw new NotSupportedException($"Database type {credential.DatabaseType} not supported") }; } private static string BuildSqlServerConnectionString(DatabaseCredential credential) { var builder = new List { $"Server={credential.Host},{credential.Port}", $"User Id={credential.Username}", $"Password={credential.Password}", $"Connection Timeout={credential.CommandTimeout}" }; // Aggiungi Database solo se specificato if (!string.IsNullOrEmpty(credential.DatabaseName)) builder.Add($"Database={credential.DatabaseName}"); if (credential.IgnoreSslErrors) builder.Add("TrustServerCertificate=True"); AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildMySqlConnectionString(DatabaseCredential credential) { var builder = new List { $"Server={credential.Host}", $"Port={credential.Port}", $"Uid={credential.Username}", $"Pwd={credential.Password}", $"Connection Timeout={credential.CommandTimeout}" }; // Aggiungi Database solo se specificato if (!string.IsNullOrEmpty(credential.DatabaseName)) builder.Add($"Database={credential.DatabaseName}"); if (credential.IgnoreSslErrors) builder.Add("SslMode=None"); AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildPostgreSqlConnectionString(DatabaseCredential credential) { var builder = new List { $"Host={credential.Host}", $"Port={credential.Port}", $"Username={credential.Username}", $"Password={credential.Password}", $"Timeout={credential.CommandTimeout}" }; // Aggiungi Database solo se specificato if (!string.IsNullOrEmpty(credential.DatabaseName)) builder.Add($"Database={credential.DatabaseName}"); if (credential.IgnoreSslErrors) builder.Add("SSL Mode=Disable"); AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildOracleConnectionString(DatabaseCredential credential) { var builder = new List(); // Per Oracle, il formato cambia se c'è o meno un database specificato if (!string.IsNullOrEmpty(credential.DatabaseName)) { builder.Add($"Data Source={credential.Host}:{credential.Port}/{credential.DatabaseName}"); } else { builder.Add($"Data Source={credential.Host}:{credential.Port}"); } builder.AddRange(new[] { $"User Id={credential.Username}", $"Password={credential.Password}", $"Connection Timeout={credential.CommandTimeout}" }); AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildSqliteConnectionString(DatabaseCredential credential) { var builder = new List { $"Data Source={credential.DatabaseName}" }; AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildDb2ConnectionString(DatabaseCredential credential) { var builder = new List { $"Server={credential.Host}:{credential.Port}", $"Database={credential.DatabaseName}", $"UID={credential.Username}", $"PWD={credential.Password}", $"Connection Timeout={credential.CommandTimeout}" }; AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static string BuildSapHanaConnectionString(DatabaseCredential credential) { var builder = new List { $"Server={credential.Host}:{credential.Port}", $"DatabaseName={credential.DatabaseName}", $"UserID={credential.Username}", $"Password={credential.Password}", $"Connection Timeout={credential.CommandTimeout}" }; AddAdditionalParameters(builder, credential.AdditionalParameters); return string.Join(";", builder); } private static void AddAdditionalParameters(List builder, Dictionary? additionalParams) { if (additionalParams != null) { foreach (var param in additionalParams) { builder.Add($"{param.Key}={param.Value}"); } } } }