From 65ed2bb93acce7b453a53a831919c4203e28b193 Mon Sep 17 00:00:00 2001 From: Alessio Dal Santo Date: Thu, 3 Jul 2025 16:30:57 +0200 Subject: [PATCH] Implementato sistema robusto di salvataggio/caricamento profili Data Coupler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- Components/ProfileSaver.razor | 44 +- Components/ProfileSaver.razor.cs | 10 +- ...rofileKeyFieldsAndAssociations.Designer.cs | 333 +++++++++++ ...5823_AddProfileKeyFieldsAndAssociations.cs | 40 ++ .../CredentialDbContextModelSnapshot.cs | 7 + .../Models/DataCouplerProfile.cs | 6 + .../Models/DataCouplerProfileDto.cs | 6 + .../Services/CredentialService.cs | 25 + .../Services/DataCouplerProfileService.cs | 30 +- .../Services/IDataCouplerProfileService.cs | 5 + CredentialManager/design_time_temp.db | Bin 118784 -> 118784 bytes .../IDataConnectionCredentialService.cs | 3 + .../DataConnectionCredentialService.cs | 9 + Data_Coupler/Pages/DataCoupler.razor | 36 +- Data_Coupler/Pages/DataCoupler.razor.cs | 528 +++++++++++++++--- Data_Coupler/Pages/DataCoupler_temp.cs | 0 Data_Coupler/wwwroot/data/credentials.db | Bin 126976 -> 126976 bytes Data_Coupler/wwwroot/data/credentials.db-shm | Bin 32768 -> 32768 bytes Data_Coupler/wwwroot/data/credentials.db-wal | Bin 49472 -> 988832 bytes 19 files changed, 967 insertions(+), 115 deletions(-) create mode 100644 CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.Designer.cs create mode 100644 CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.cs create mode 100644 Data_Coupler/Pages/DataCoupler_temp.cs diff --git a/Components/ProfileSaver.razor b/Components/ProfileSaver.razor index 52142ad..2699635 100644 --- a/Components/ProfileSaver.razor +++ b/Components/ProfileSaver.razor @@ -1,4 +1,6 @@ @* Componente per salvare la configurazione corrente come profilo *@ +@using System.IO +
@@ -57,6 +59,10 @@
Fonte: @GetSourceSummary()
+ @if (!string.IsNullOrEmpty(SourceCredentialName)) + { + Credenziali: @SourceCredentialName
+ } @if (!string.IsNullOrEmpty(SourceSchema)) { Schema: @SourceSchema
@@ -65,9 +71,17 @@ { Tabella: @SourceTable } + @if (!string.IsNullOrEmpty(SourceFilePath)) + { + File: @Path.GetFileName(SourceFilePath) + }
Destinazione: @GetDestinationSummary()
+ @if (!string.IsNullOrEmpty(DestinationCredentialName)) + { + Credenziali: @DestinationCredentialName
+ } @if (!string.IsNullOrEmpty(DestinationSchema)) { Schema: @DestinationSchema
@@ -85,10 +99,32 @@ @if (FieldMappings != null && FieldMappings.Any()) {
- - - @FieldMappings.Count mapping dei campi configurati - +
+
+ + + @FieldMappings.Count mapping dei campi configurati + +
+
+ @if (UseRecordAssociations) + { + + Smart Update attivo + @if (!string.IsNullOrEmpty(SourceKeyField)) + { + (Chiave: @SourceKeyField) + } + + } + else + { + + Solo inserimenti + + } +
+
}
diff --git a/Components/ProfileSaver.razor.cs b/Components/ProfileSaver.razor.cs index a776486..2077d4a 100644 --- a/Components/ProfileSaver.razor.cs +++ b/Components/ProfileSaver.razor.cs @@ -9,15 +9,19 @@ public partial class ProfileSaver [Parameter] public bool CanSave { get; set; } [Parameter] public string SourceType { get; set; } = ""; [Parameter] public int? SourceCredentialId { get; set; } + [Parameter] public string? SourceCredentialName { get; set; } [Parameter] public string? SourceSchema { get; set; } [Parameter] public string? SourceTable { get; set; } [Parameter] public string? SourceFilePath { get; set; } [Parameter] public string DestinationType { get; set; } = ""; [Parameter] public int? DestinationCredentialId { get; set; } + [Parameter] public string? DestinationCredentialName { get; set; } [Parameter] public string? DestinationSchema { get; set; } [Parameter] public string? DestinationTable { get; set; } [Parameter] public string? DestinationEndpoint { get; set; } [Parameter] public List? FieldMappings { get; set; } + [Parameter] public string? SourceKeyField { get; set; } + [Parameter] public bool UseRecordAssociations { get; set; } [Parameter] public EventCallback OnProfileSaved { get; set; } private bool ShowSaveForm { get; set; } = false; @@ -53,15 +57,19 @@ public partial class ProfileSaver Description = ProfileData.Description, SourceType = SourceType, SourceCredentialId = SourceCredentialId, + SourceCredentialName = SourceCredentialName, SourceSchema = SourceSchema, SourceTable = SourceTable, SourceFilePath = SourceFilePath, DestinationType = DestinationType, DestinationCredentialId = DestinationCredentialId, + DestinationCredentialName = DestinationCredentialName, DestinationSchema = DestinationSchema, DestinationTable = DestinationTable, DestinationEndpoint = DestinationEndpoint, - FieldMappings = FieldMappings + FieldMappings = FieldMappings, + SourceKeyField = SourceKeyField, + UseRecordAssociations = UseRecordAssociations }; await OnProfileSaved.InvokeAsync(profileDto); diff --git a/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.Designer.cs b/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.Designer.cs new file mode 100644 index 0000000..52ef9f7 --- /dev/null +++ b/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.Designer.cs @@ -0,0 +1,333 @@ +// +using System; +using CredentialManager.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace CredentialManager.Migrations +{ + [DbContext(typeof(CredentialDbContext))] + [Migration("20250703085823_AddProfileKeyFieldsAndAssociations")] + partial class AddProfileKeyFieldsAndAssociations + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.0"); + + modelBuilder.Entity("CredentialManager.Models.CredentialEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AdditionalParameters") + .HasMaxLength(2000) + .HasColumnType("TEXT"); + + b.Property("CommandTimeout") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(30); + + b.Property("ConnectionString") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("DatabaseName") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("DatabaseType") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("EncryptedApiKey") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("EncryptedAuthToken") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("EncryptedPassword") + .HasColumnType("TEXT"); + + b.Property("Headers") + .HasMaxLength(2000) + .HasColumnType("TEXT"); + + b.Property("Host") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("IgnoreSslErrors") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(false); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(true); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("RestServiceType") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("TimeoutSeconds") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(100); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdatedAt") + .HasColumnType("TEXT"); + + b.Property("Username") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("DatabaseType"); + + b.HasIndex("IsActive"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("Type"); + + b.ToTable("Credentials", (string)null); + }); + + modelBuilder.Entity("CredentialManager.Models.DataCouplerProfile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("CURRENT_TIMESTAMP"); + + b.Property("CreatedBy") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("DestinationCredentialId") + .HasColumnType("INTEGER"); + + b.Property("DestinationEndpoint") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("DestinationSchema") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("DestinationTable") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("DestinationType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("TEXT"); + + b.Property("FieldMappingJson") + .HasMaxLength(4000) + .HasColumnType("TEXT"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(true); + + b.Property("LastUsedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("SourceCredentialId") + .HasColumnType("INTEGER"); + + b.Property("SourceFilePath") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("SourceKeyField") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("SourceSchema") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("SourceTable") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("SourceType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("TEXT"); + + b.Property("UseRecordAssociations") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt"); + + b.HasIndex("DestinationCredentialId"); + + b.HasIndex("DestinationType"); + + b.HasIndex("IsActive"); + + b.HasIndex("LastUsedAt"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("SourceCredentialId"); + + b.HasIndex("SourceType"); + + b.ToTable("DataCouplerProfiles", (string)null); + }); + + modelBuilder.Entity("CredentialManager.Models.KeyAssociation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AdditionalInfo") + .HasMaxLength(2000) + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("DestinationEntity") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("DestinationId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("DestinationKeyField") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(true); + + b.Property("KeyValue") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("LastVerifiedAt") + .HasColumnType("TEXT"); + + b.Property("RestCredentialName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("SourceKeyField") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("SourcesInfo") + .HasMaxLength(2000) + .HasColumnType("TEXT"); + + b.Property("UpdatedAt") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt"); + + b.HasIndex("DestinationEntity"); + + b.HasIndex("IsActive"); + + b.HasIndex("KeyValue") + .HasDatabaseName("IX_KeyAssociations_KeyValue"); + + b.HasIndex("LastVerifiedAt"); + + b.HasIndex("RestCredentialName"); + + b.HasIndex("KeyValue", "DestinationEntity", "RestCredentialName") + .IsUnique() + .HasDatabaseName("IX_KeyAssociations_Unique"); + + b.ToTable("KeyAssociations", (string)null); + }); + + modelBuilder.Entity("CredentialManager.Models.DataCouplerProfile", b => + { + b.HasOne("CredentialManager.Models.CredentialEntity", "DestinationCredential") + .WithMany() + .HasForeignKey("DestinationCredentialId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("CredentialManager.Models.CredentialEntity", "SourceCredential") + .WithMany() + .HasForeignKey("SourceCredentialId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("DestinationCredential"); + + b.Navigation("SourceCredential"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.cs b/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.cs new file mode 100644 index 0000000..232d32c --- /dev/null +++ b/CredentialManager/Migrations/20250703085823_AddProfileKeyFieldsAndAssociations.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CredentialManager.Migrations +{ + /// + public partial class AddProfileKeyFieldsAndAssociations : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "SourceKeyField", + table: "DataCouplerProfiles", + type: "TEXT", + maxLength: 200, + nullable: true); + + migrationBuilder.AddColumn( + name: "UseRecordAssociations", + table: "DataCouplerProfiles", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "SourceKeyField", + table: "DataCouplerProfiles"); + + migrationBuilder.DropColumn( + name: "UseRecordAssociations", + table: "DataCouplerProfiles"); + } + } +} diff --git a/CredentialManager/Migrations/CredentialDbContextModelSnapshot.cs b/CredentialManager/Migrations/CredentialDbContextModelSnapshot.cs index 739f22a..80c149e 100644 --- a/CredentialManager/Migrations/CredentialDbContextModelSnapshot.cs +++ b/CredentialManager/Migrations/CredentialDbContextModelSnapshot.cs @@ -186,6 +186,10 @@ namespace CredentialManager.Migrations .HasMaxLength(500) .HasColumnType("TEXT"); + b.Property("SourceKeyField") + .HasMaxLength(200) + .HasColumnType("TEXT"); + b.Property("SourceSchema") .HasMaxLength(200) .HasColumnType("TEXT"); @@ -199,6 +203,9 @@ namespace CredentialManager.Migrations .HasMaxLength(20) .HasColumnType("TEXT"); + b.Property("UseRecordAssociations") + .HasColumnType("INTEGER"); + b.HasKey("Id"); b.HasIndex("CreatedAt"); diff --git a/CredentialManager/Models/DataCouplerProfile.cs b/CredentialManager/Models/DataCouplerProfile.cs index 047032a..a188225 100644 --- a/CredentialManager/Models/DataCouplerProfile.cs +++ b/CredentialManager/Models/DataCouplerProfile.cs @@ -54,6 +54,12 @@ public class DataCouplerProfile [MaxLength(4000)] public string? FieldMappingJson { get; set; } + // Configurazione chiave sorgente e associazioni + [MaxLength(200)] + public string? SourceKeyField { get; set; } + + public bool UseRecordAssociations { get; set; } = false; + // Metadati [MaxLength(100)] public string? CreatedBy { get; set; } diff --git a/CredentialManager/Models/DataCouplerProfileDto.cs b/CredentialManager/Models/DataCouplerProfileDto.cs index 86f7b2d..e458c57 100644 --- a/CredentialManager/Models/DataCouplerProfileDto.cs +++ b/CredentialManager/Models/DataCouplerProfileDto.cs @@ -12,6 +12,7 @@ public class DataCouplerProfileDto // Informazioni sorgente public string SourceType { get; set; } = string.Empty; public int? SourceCredentialId { get; set; } + public string? SourceCredentialName { get; set; } public string? SourceSchema { get; set; } public string? SourceTable { get; set; } public string? SourceFilePath { get; set; } @@ -19,12 +20,17 @@ public class DataCouplerProfileDto // Informazioni destinazione public string DestinationType { get; set; } = string.Empty; public int? DestinationCredentialId { get; set; } + public string? DestinationCredentialName { get; set; } public string? DestinationSchema { get; set; } public string? DestinationTable { get; set; } public string? DestinationEndpoint { get; set; } // Mapping dei campi public List? FieldMappings { get; set; } + + // Configurazione chiave sorgente e associazioni + public string? SourceKeyField { get; set; } + public bool UseRecordAssociations { get; set; } } /// diff --git a/CredentialManager/Services/CredentialService.cs b/CredentialManager/Services/CredentialService.cs index c449b24..98aa569 100644 --- a/CredentialManager/Services/CredentialService.cs +++ b/CredentialManager/Services/CredentialService.cs @@ -39,6 +39,9 @@ public interface ICredentialService Task DeleteCredentialAsync(int id); Task DeleteCredentialAsync(string name); Task> GetCredentialNamesAsync(CredentialType? type = null); + + // Helper methods to get credential ID by name + Task GetCredentialIdByNameAsync(string name, CredentialType type); } /// @@ -960,5 +963,27 @@ public class CredentialService : ICredentialService credentialValue.Contains("*** ERRORE DECRITTOGRAFIA ***"); } + /// + /// Ottiene l'ID di una credenziale per nome e tipo + /// + /// Nome della credenziale + /// Tipo della credenziale + /// ID della credenziale se trovata, null altrimenti + public async Task GetCredentialIdByNameAsync(string name, CredentialType type) + { + try + { + var entity = await _context.Credentials + .FirstOrDefaultAsync(c => c.Name == name && c.Type == type.ToString() && c.IsActive); + + return entity?.Id; + } + catch (Exception ex) + { + _logger.LogError(ex, "Errore nel recuperare l'ID della credenziale: {Name}, Tipo: {Type}", name, type); + return null; + } + } + #endregion } diff --git a/CredentialManager/Services/DataCouplerProfileService.cs b/CredentialManager/Services/DataCouplerProfileService.cs index 1dbc0d6..98c5053 100644 --- a/CredentialManager/Services/DataCouplerProfileService.cs +++ b/CredentialManager/Services/DataCouplerProfileService.cs @@ -31,6 +31,17 @@ public class DataCouplerProfileService : IDataCouplerProfileService .ToListAsync(); } + /// + /// Ottiene tutti i profili per nome (inclusi quelli inattivi) + /// + public async Task GetProfileByNameIncludingInactiveAsync(string name) + { + return await _context.DataCouplerProfiles + .Include(p => p.SourceCredential) + .Include(p => p.DestinationCredential) + .FirstOrDefaultAsync(p => p.Name.ToLower() == name.ToLower()); + } + /// /// Ottiene un profilo per ID /// @@ -80,8 +91,12 @@ public class DataCouplerProfileService : IDataCouplerProfileService throw new InvalidOperationException($"Profilo con ID {profile.Id} non trovato"); } - // Aggiorna le proprietà - existingProfile.Name = profile.Name; + // Aggiorna le proprietà (evita di aggiornare il nome se è uguale per evitare unique constraint) + if (!string.Equals(existingProfile.Name, profile.Name, StringComparison.OrdinalIgnoreCase)) + { + existingProfile.Name = profile.Name; + } + existingProfile.Description = profile.Description; existingProfile.SourceType = profile.SourceType; existingProfile.SourceCredentialId = profile.SourceCredentialId; @@ -94,6 +109,9 @@ public class DataCouplerProfileService : IDataCouplerProfileService existingProfile.DestinationTable = profile.DestinationTable; existingProfile.DestinationEndpoint = profile.DestinationEndpoint; existingProfile.FieldMappingJson = profile.FieldMappingJson; + existingProfile.SourceKeyField = profile.SourceKeyField; + existingProfile.UseRecordAssociations = profile.UseRecordAssociations; + existingProfile.IsActive = profile.IsActive; await _context.SaveChangesAsync(); return existingProfile; @@ -195,15 +213,19 @@ public class DataCouplerProfileService : IDataCouplerProfileService Description = profile.Description, SourceType = profile.SourceType, SourceCredentialId = profile.SourceCredentialId, + SourceCredentialName = profile.SourceCredential?.Name, SourceSchema = profile.SourceSchema, SourceTable = profile.SourceTable, SourceFilePath = profile.SourceFilePath, DestinationType = profile.DestinationType, DestinationCredentialId = profile.DestinationCredentialId, + DestinationCredentialName = profile.DestinationCredential?.Name, DestinationSchema = profile.DestinationSchema, DestinationTable = profile.DestinationTable, DestinationEndpoint = profile.DestinationEndpoint, - FieldMappings = DeserializeFieldMappings(profile.FieldMappingJson) + FieldMappings = DeserializeFieldMappings(profile.FieldMappingJson), + SourceKeyField = profile.SourceKeyField, + UseRecordAssociations = profile.UseRecordAssociations }; } @@ -228,6 +250,8 @@ public class DataCouplerProfileService : IDataCouplerProfileService DestinationTable = dto.DestinationTable, DestinationEndpoint = dto.DestinationEndpoint, FieldMappingJson = SerializeFieldMappings(dto.FieldMappings), + SourceKeyField = dto.SourceKeyField, + UseRecordAssociations = dto.UseRecordAssociations, CreatedBy = createdBy }; } diff --git a/CredentialManager/Services/IDataCouplerProfileService.cs b/CredentialManager/Services/IDataCouplerProfileService.cs index 1a11cd2..4917182 100644 --- a/CredentialManager/Services/IDataCouplerProfileService.cs +++ b/CredentialManager/Services/IDataCouplerProfileService.cs @@ -12,6 +12,11 @@ public interface IDataCouplerProfileService /// Task> GetAllProfilesAsync(); + /// + /// Ottiene tutti i profili per nome (inclusi quelli inattivi) + /// + Task GetProfileByNameIncludingInactiveAsync(string name); + /// /// Ottiene un profilo per ID /// diff --git a/CredentialManager/design_time_temp.db b/CredentialManager/design_time_temp.db index a1e3ded84137fc39b56c9b11a8e4b19e3f0f4ae1..88eb0a9f590f42cca4f13270f826361c638587ac 100644 GIT binary patch delta 372 zcmZozz}~QceS)+gGXn#IED*zh)I=R)M&^wP9r9|%3I-Ndra)w>XK89~XlY`hZD3$! zV89Dh%gi6Zz`u*Xn?GQ)pnwy(=rh4X<#zy9rhS~-O zRt5&VK($Q#-3$8c?K*pGA{7oN@95ebwgu_S5&< zGrFsMW#FIA&&QX``>&ocOxV^}mv9ARH3*Iti diff --git a/DataConnection/CredentialManagement/Interfaces/IDataConnectionCredentialService.cs b/DataConnection/CredentialManagement/Interfaces/IDataConnectionCredentialService.cs index 92f0fad..b2aea11 100644 --- a/DataConnection/CredentialManagement/Interfaces/IDataConnectionCredentialService.cs +++ b/DataConnection/CredentialManagement/Interfaces/IDataConnectionCredentialService.cs @@ -48,6 +48,9 @@ public interface IDataConnectionCredentialService Task GetRestServiceOptionsAsync(string credentialName); Task GetRestServiceOptionsAsync(int credentialId); + // Helper methods + Task GetCredentialIdByNameAsync(string name, CredentialManager.Models.CredentialType type); + // Connection testing Task<(bool Success, string Message)> TestDatabaseConnectionAsync(string credentialName); Task<(bool Success, string Message)> TestDatabaseConnectionAsync(DatabaseCredential credential); diff --git a/DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs b/DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs index 03eafcd..beb787b 100644 --- a/DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs +++ b/DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs @@ -936,5 +936,14 @@ public class DataConnectionCredentialService : IDataConnectionCredentialService return await _keyAssociationService.GetStatisticsAsync(); } + #region Helper Methods + + public async Task GetCredentialIdByNameAsync(string name, CredentialManager.Models.CredentialType type) + { + return await _credentialService.GetCredentialIdByNameAsync(name, type); + } + + #endregion + #endregion } diff --git a/Data_Coupler/Pages/DataCoupler.razor b/Data_Coupler/Pages/DataCoupler.razor index bee4946..1712ee9 100644 --- a/Data_Coupler/Pages/DataCoupler.razor +++ b/Data_Coupler/Pages/DataCoupler.razor @@ -997,6 +997,25 @@ Riepilogo Mapping } +
+ + +
+
@if (fieldMappings.Any()) { @@ -1124,23 +1143,6 @@ }
- -@if (isDatabaseConnected && isRestConnected && fieldMappings.Any()) -{ -
-
- -
-
-} - e.Name == profile.DestinationEndpoint); - if (entity != null) + var sourceCredential = await CredentialService.GetDatabaseCredentialAsync(profile.SourceCredentialId.Value); + if (sourceCredential != null) { - await SelectRestEntity(entity); + selectedDatabaseCredential = sourceCredential.Name; + Logger.LogInformation("Credenziale database selezionata: {Credential}", selectedDatabaseCredential); + + // Force UI update for credential selection + StateHasChanged(); + await Task.Delay(200); + + // Connetti al database + Logger.LogInformation("Iniziando connessione database..."); + if (!string.IsNullOrEmpty(profile.SourceSchema)) + { + Logger.LogInformation("Connessione con schema specifico: {Schema}", profile.SourceSchema); + await ConnectToDatabaseWithSchema(profile.SourceSchema); + } + else + { + Logger.LogInformation("Connessione senza schema specifico"); + await ConnectToDatabase(); + } + + Logger.LogInformation("Stato dopo connessione database - Connected: {Connected}, Tables: {TableCount}", + isDatabaseConnected, availableTableNames.Count); + + // Seleziona la tabella se specificata e se la connessione è riuscita + if (!string.IsNullOrEmpty(profile.SourceTable) && isDatabaseConnected) + { + Logger.LogInformation("Selezione tabella: {Table}", profile.SourceTable); + await SelectTable(profile.SourceTable); + Logger.LogInformation("Tabella selezionata: {SelectedTable}, Schema caricato: {SchemaLoaded}", + selectedTable, databaseTables.ContainsKey(profile.SourceTable)); + } + else + { + Logger.LogWarning("Impossibile selezionare tabella - Table: {Table}, Connected: {Connected}", + profile.SourceTable, isDatabaseConnected); + } } else { - Logger.LogWarning("Entità REST con endpoint {Endpoint} non trovata", profile.DestinationEndpoint); + Logger.LogWarning("Credenziale database con ID {CredentialId} non trovata", profile.SourceCredentialId); } } - } - } - - // Applica mapping dei campi se disponibile - if (!string.IsNullOrEmpty(profile.FieldMappingJson)) - { - try - { - var service = new DataCouplerProfileService(null!); // Temporaneo per deserializzazione - var mappings = service.DeserializeFieldMappings(profile.FieldMappingJson); - - // Applica i mapping - fieldMappings.Clear(); - keyFields.Clear(); - - foreach (var mapping in mappings) + else if (profile.SourceType == "file") { - fieldMappings[mapping.SourceField] = mapping.DestinationField; - if (mapping.IsKey) + // Per i file, non possiamo ricreare il file caricato, ma possiamo impostare le informazioni + if (!string.IsNullOrEmpty(profile.SourceFilePath)) { - keyFields.Add(mapping.DestinationField); + selectedFileName = Path.GetFileName(profile.SourceFilePath); + Logger.LogInformation("Informazioni file impostate: {FileName}", selectedFileName); } } - - Logger.LogInformation("Applicati {MappingCount} mapping dei campi dal profilo", mappings.Count); } - catch (Exception ex) + else { - Logger.LogWarning(ex, "Errore nel caricamento dei mapping dei campi dal profilo"); + Logger.LogInformation("Nessuna credenziale sorgente da configurare"); + } + + // Small delay to let source configuration settle + await Task.Delay(300); + + // Step 3: Configura e connetti la destinazione + if (profile.DestinationCredentialId.HasValue) + { + Logger.LogInformation("Step 3 - Configurazione destinazione con ID credenziale: {CredentialId}", profile.DestinationCredentialId); + + var destinationCredential = await CredentialService.GetRestApiCredentialAsync(profile.DestinationCredentialId.Value); + if (destinationCredential != null) + { + selectedRestCredential = destinationCredential.Name; + Logger.LogInformation("Credenziale REST selezionata: {Credential}", selectedRestCredential); + + // Force UI update for REST credential selection + StateHasChanged(); + await Task.Delay(200); + + // Connetti al servizio REST + Logger.LogInformation("Iniziando connessione REST..."); + await ConnectToRestApi(); + + Logger.LogInformation("Stato dopo connessione REST - Connected: {Connected}, Entities: {EntityCount}", + isRestConnected, restEntities.Count); + + // Seleziona l'entità REST se la connessione è riuscita + if (!string.IsNullOrEmpty(profile.DestinationEndpoint) && isRestConnected) + { + var entity = restEntities.FirstOrDefault(e => e.Name == profile.DestinationEndpoint); + if (entity != null) + { + Logger.LogInformation("Selezione entità REST: {Entity}", entity.Name); + await SelectRestEntity(entity); + Logger.LogInformation("Entità REST selezionata: {SelectedEntity}, Dettagli caricati: {DetailsLoaded}", + selectedRestEntity?.Name, restEntityDetails != null); + } + else + { + Logger.LogWarning("Entità REST non trovata: {Endpoint} - Entities disponibili: {Entities}", + profile.DestinationEndpoint, string.Join(", ", restEntities.Select(e => e.Name))); + } + } + else + { + Logger.LogWarning("Impossibile selezionare entità REST - Endpoint: {Endpoint}, Connected: {Connected}", + profile.DestinationEndpoint, isRestConnected); + } + } + else + { + Logger.LogWarning("Credenziale REST con ID {CredentialId} non trovata", profile.DestinationCredentialId); + } + } + else + { + Logger.LogInformation("Nessuna credenziale destinazione da configurare"); } - } - StateHasChanged(); + // Small delay to let destination configuration settle + await Task.Delay(300); + + // Step 4: Applica mapping dei campi se disponibile + if (!string.IsNullOrEmpty(profile.FieldMappingJson)) + { + Logger.LogInformation("Step 4 - Applicazione mapping campi..."); + try + { + var service = new DataCouplerProfileService(null!); + var mappings = service.DeserializeFieldMappings(profile.FieldMappingJson); + + Logger.LogInformation("Mappings deserializzati: {Count}", mappings.Count); + + // Applica i mapping + fieldMappings.Clear(); + keyFields.Clear(); + + foreach (var mapping in mappings) + { + fieldMappings[mapping.SourceField] = mapping.DestinationField; + if (mapping.IsKey) + { + keyFields.Add(mapping.DestinationField); + } + Logger.LogInformation("Mapping applicato: {Source} -> {Destination} (IsKey: {IsKey})", + mapping.SourceField, mapping.DestinationField, mapping.IsKey); + } + + Logger.LogInformation("Mappings applicati - Totale: {MappingCount}, Chiavi: {KeyCount}", + fieldMappings.Count, keyFields.Count); + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Errore nel caricamento dei mapping dei campi dal profilo"); + } + } + else + { + Logger.LogInformation("Nessun mapping campi da applicare"); + } + + // Step 5: Applica configurazione chiave sorgente + if (!string.IsNullOrEmpty(profile.SourceKeyField)) + { + sourceKeyField = profile.SourceKeyField; + Logger.LogInformation("Step 5 - Chiave sorgente applicata: {SourceKey}", sourceKeyField); + } + else + { + Logger.LogInformation("Nessuna chiave sorgente da applicare"); + } + + // Step 6: Applica configurazione associazioni record + useRecordAssociations = profile.UseRecordAssociations; + Logger.LogInformation("Step 6 - Associazioni record configurate: {UseAssociations}", useRecordAssociations); + + Logger.LogInformation("=== FINE APPLICAZIONE PROFILO ==="); + Logger.LogInformation("Stato finale - Source: {SourceType}, DatabaseConnected: {DatabaseConnected}, RestConnected: {RestConnected}, Mappings: {MappingCount}", + selectedSourceType, isDatabaseConnected, isRestConnected, fieldMappings.Count); + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nell'applicazione della configurazione del profilo {ProfileName}", profile.Name); + await JSRuntime.InvokeVoidAsync("alert", $"Errore nel caricamento del profilo: {ex.Message}"); + } + finally + { + // Force final UI update + StateHasChanged(); + Logger.LogInformation("Aggiornamento finale UI completato"); + } } private async Task OnProfileSaved(DataCouplerProfileDto profileDto) { try { + Logger.LogInformation("Tentativo di salvataggio profilo: {ProfileName}", profileDto.Name); + var profileService = new DataCouplerProfileService(null!); // Usa il service di conversione var profile = profileService.FromDto(profileDto, "System"); // TODO: Usa utente corrente - await ProfileService.SaveProfileAsync(profile); - await LoadProfiles(); // Ricarica la lista + // Controlla se esiste già un profilo con lo stesso nome (inclusi quelli inattivi) + Logger.LogInformation("Controllo esistenza profilo con nome: {ProfileName}", profileDto.Name); + var existingProfile = await ProfileService.GetProfileByNameIncludingInactiveAsync(profileDto.Name); - await JSRuntime.InvokeVoidAsync("alert", $"Profilo '{profileDto.Name}' salvato con successo!"); + if (existingProfile != null) + { + Logger.LogInformation("Trovato profilo esistente con ID: {ProfileId}, IsActive: {IsActive}", + existingProfile.Id, existingProfile.IsActive); + + if (!existingProfile.IsActive) + { + // Il profilo esiste ma è inattivo - riattivalo e aggiornalo + Logger.LogInformation("Riattivazione del profilo inattivo: {ProfileName}", profileDto.Name); + profile.Id = existingProfile.Id; + profile.IsActive = true; + + // Aggiorna direttamente il profilo esistente invece di creare un nuovo oggetto + existingProfile.Description = profile.Description; + existingProfile.SourceType = profile.SourceType; + existingProfile.SourceCredentialId = profile.SourceCredentialId; + existingProfile.SourceSchema = profile.SourceSchema; + existingProfile.SourceTable = profile.SourceTable; + existingProfile.SourceFilePath = profile.SourceFilePath; + existingProfile.DestinationType = profile.DestinationType; + existingProfile.DestinationCredentialId = profile.DestinationCredentialId; + existingProfile.DestinationSchema = profile.DestinationSchema; + existingProfile.DestinationTable = profile.DestinationTable; + existingProfile.DestinationEndpoint = profile.DestinationEndpoint; + existingProfile.FieldMappingJson = profile.FieldMappingJson; + existingProfile.SourceKeyField = profile.SourceKeyField; + existingProfile.UseRecordAssociations = profile.UseRecordAssociations; + existingProfile.IsActive = true; + + await ProfileService.UpdateProfileAsync(existingProfile); + await LoadProfiles(); + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo '{profileDto.Name}' riattivato e aggiornato con successo!"); + return; + } + + // Il profilo esiste ed è attivo - chiedi conferma per sovrascrittura + var confirmOverwrite = await JSRuntime.InvokeAsync("confirm", + $"Esiste già un profilo attivo con il nome '{profileDto.Name}'. Vuoi sovrascriverlo?"); + + if (confirmOverwrite) + { + Logger.LogInformation("Utente ha confermato la sovrascrittura del profilo: {ProfileName}", profileDto.Name); + + // Aggiorna il profilo esistente direttamente + existingProfile.Description = profile.Description; + existingProfile.SourceType = profile.SourceType; + existingProfile.SourceCredentialId = profile.SourceCredentialId; + existingProfile.SourceSchema = profile.SourceSchema; + existingProfile.SourceTable = profile.SourceTable; + existingProfile.SourceFilePath = profile.SourceFilePath; + existingProfile.DestinationType = profile.DestinationType; + existingProfile.DestinationCredentialId = profile.DestinationCredentialId; + existingProfile.DestinationSchema = profile.DestinationSchema; + existingProfile.DestinationTable = profile.DestinationTable; + existingProfile.DestinationEndpoint = profile.DestinationEndpoint; + existingProfile.FieldMappingJson = profile.FieldMappingJson; + existingProfile.SourceKeyField = profile.SourceKeyField; + existingProfile.UseRecordAssociations = profile.UseRecordAssociations; + + await ProfileService.UpdateProfileAsync(existingProfile); + await LoadProfiles(); // Ricarica la lista + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo '{profileDto.Name}' aggiornato con successo!"); + } + else + { + Logger.LogInformation("Utente ha annullato la sovrascrittura del profilo: {ProfileName}", profileDto.Name); + + // Proponi di creare con un nome unico + var useUniqueName = await JSRuntime.InvokeAsync("confirm", + "Vuoi salvare il profilo con un nome unico automatico (es. 'Nome Profilo (1)')?"); + + if (useUniqueName) + { + var uniqueName = await GenerateUniqueProfileName(profileDto.Name); + profile.Name = uniqueName; + + try + { + await ProfileService.SaveProfileAsync(profile); + await LoadProfiles(); + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo salvato con nome '{uniqueName}'!"); + } + catch (Exception uniqueEx) + { + Logger.LogError(uniqueEx, "Errore durante il salvataggio del profilo con nome unico: {UniqueName}", uniqueName); + + // Gestisci l'errore di unique constraint anche per il nome unico + if (uniqueEx.Message.Contains("UNIQUE constraint failed")) + { + await JSRuntime.InvokeVoidAsync("alert", + $"Errore: Non è stato possibile generare un nome unico per il profilo. " + + "Prova a ricaricare la pagina e riprova."); + } + else + { + await JSRuntime.InvokeVoidAsync("alert", $"Errore nel salvataggio del profilo: {uniqueEx.Message}"); + } + } + } + // Altrimenti, non salvare nulla + return; + } + } + else + { + Logger.LogInformation("Nessun profilo esistente trovato, creazione nuovo profilo: {ProfileName}", profileDto.Name); + + // Crea un nuovo profilo + try + { + await ProfileService.SaveProfileAsync(profile); + await LoadProfiles(); // Ricarica la lista + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo '{profileDto.Name}' salvato con successo!"); + } + catch (Exception saveEx) + { + Logger.LogError(saveEx, "Errore durante il salvataggio del nuovo profilo: {ProfileName}", profileDto.Name); + + // Possibile race condition - riprova con controllo duplicato + if (saveEx.Message.Contains("UNIQUE constraint failed")) + { + Logger.LogWarning("Race condition rilevata durante il salvataggio, gestione del duplicato..."); + + // Chiedi se vuole sovrascrivere o creare nome unico + var handleDuplicate = await JSRuntime.InvokeAsync("confirm", + $"Un profilo con il nome '{profileDto.Name}' è stato creato nel frattempo. " + + "Vuoi sovrascriverlo? (Clicca 'Annulla' per salvare con un nome unico)"); + + if (handleDuplicate) + { + // Trova il profilo e aggiornalo + var duplicateProfile = await ProfileService.GetProfileByNameIncludingInactiveAsync(profileDto.Name); + if (duplicateProfile != null) + { + profile.Id = duplicateProfile.Id; + await ProfileService.UpdateProfileAsync(profile); + await LoadProfiles(); + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo '{profileDto.Name}' aggiornato con successo!"); + } + else + { + await JSRuntime.InvokeVoidAsync("alert", "Errore: Il profilo duplicato non è stato trovato."); + } + } + else + { + // Crea con nome unico + var uniqueName = await GenerateUniqueProfileName(profileDto.Name); + profile.Name = uniqueName; + + await ProfileService.SaveProfileAsync(profile); + await LoadProfiles(); + + await JSRuntime.InvokeVoidAsync("alert", $"Profilo salvato con nome '{uniqueName}'!"); + } + } + else + { + throw; // Rilancia eccezioni non gestite + } + } + } } catch (Exception ex) { - Logger.LogError(ex, "Errore nel salvataggio del profilo"); - await JSRuntime.InvokeVoidAsync("alert", $"Errore nel salvataggio del profilo: {ex.Message}"); + Logger.LogError(ex, "Errore generale nel salvataggio del profilo: {ProfileName}", profileDto.Name); + + // Gestione generica degli errori + if (ex.Message.Contains("UNIQUE constraint failed")) + { + await JSRuntime.InvokeVoidAsync("alert", + $"Errore: Esiste già un profilo con il nome '{profileDto.Name}'. " + + "Questo può accadere se ci sono stati problemi di sincronizzazione. " + + "Prova a ricaricare la pagina e riprova."); + } + else + { + await JSRuntime.InvokeVoidAsync("alert", $"Errore nel salvataggio del profilo: {ex.Message}"); + } } } @@ -930,7 +1237,7 @@ public partial class DataCoupler : ComponentBase { isConnectingRest = false; } - } private async void SelectTable(string tableName) + } private async Task SelectTable(string tableName) { selectedTable = tableName; @@ -1005,7 +1312,9 @@ public partial class DataCoupler : ComponentBase } StateHasChanged(); - } private async Task SelectRestEntity(RestEntitySummary entity) + } + + private async Task SelectRestEntity(RestEntitySummary entity) { selectedRestEntity = entity; @@ -2015,6 +2324,7 @@ public partial class DataCoupler : ComponentBase /// /// Verifica se una query è una SELECT query sicura + /// private bool IsSelectQuery(string query) { @@ -2262,20 +2572,44 @@ public partial class DataCoupler : ComponentBase /// /// Ottiene l'ID della credenziale sorgente corrente /// - private int? GetCurrentSourceCredentialId() + private async Task GetCurrentSourceCredentialIdAsync() { - // TODO: Implementare logica per ottenere l'ID dalla credenziale selezionata - // Per ora ritorniamo null dato che i DTO non hanno ID + if (selectedSourceType == "database" && !string.IsNullOrEmpty(selectedDatabaseCredential)) + { + try + { + // Usa il nuovo metodo per ottenere direttamente l'ID della credenziale + return await CredentialService.GetCredentialIdByNameAsync(selectedDatabaseCredential, CredentialManager.Models.CredentialType.Database); + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nell'ottenere l'ID della credenziale database: {CredentialName}", selectedDatabaseCredential); + return null; + } + } + return null; } /// /// Ottiene l'ID della credenziale destinazione corrente /// - private int? GetCurrentDestinationCredentialId() + private async Task GetCurrentDestinationCredentialIdAsync() { - // TODO: Implementare logica per ottenere l'ID dalla credenziale selezionata - // Per ora ritorniamo null dato che i DTO non hanno ID + if (!string.IsNullOrEmpty(selectedRestCredential)) + { + try + { + // Usa il nuovo metodo per ottenere direttamente l'ID della credenziale + return await CredentialService.GetCredentialIdByNameAsync(selectedRestCredential, CredentialManager.Models.CredentialType.RestApi); + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nell'ottenere l'ID della credenziale REST: {CredentialName}", selectedRestCredential); + return null; + } + } + return null; } @@ -2400,7 +2734,7 @@ public partial class DataCoupler : ComponentBase catch (Exception ex) { Logger.LogError(ex, "Errore nella connessione con lo schema selezionato"); - databaseErrorMessage = $"Errore nella connessione con schema {selectedSchema}: {ex.Message}"; + databaseErrorMessage = $"Errore nella connessione al database {selectedSchema}: {ex.Message}"; } StateHasChanged(); @@ -2778,8 +3112,9 @@ public partial class DataCoupler : ComponentBase "id", "ID", "Id", "_id", "_ID", "_Id", "key", "KEY", "Key", - "code", "CODE", "Code", - "number", "NUMBER", "Number" + "code", "CODE", "Code", "codice", "CODICE", "Codice", + "number", "NUMBER", "Number", "numero", "NUMERO", "Numero", + "index", "INDEX", "Index", "indice", "INDICE", "Indice" }; // Cerca colonne che potrebbero essere chiavi primarie @@ -2912,5 +3247,18 @@ public partial class DataCoupler : ComponentBase } } + private async Task GenerateUniqueProfileName(string baseName) + { + var uniqueName = baseName; + var counter = 1; + + while (await ProfileService.GetProfileByNameIncludingInactiveAsync(uniqueName) != null) + { + uniqueName = $"{baseName} ({counter})"; + counter++; + } + + return uniqueName; + } } diff --git a/Data_Coupler/Pages/DataCoupler_temp.cs b/Data_Coupler/Pages/DataCoupler_temp.cs new file mode 100644 index 0000000..e69de29 diff --git a/Data_Coupler/wwwroot/data/credentials.db b/Data_Coupler/wwwroot/data/credentials.db index 98fd88895d447ef56488391f1c6e88df53180f5f..cbd53c86412a20c68f938cea91aab609f83fe84e 100644 GIT binary patch delta 1795 zcmbtUO>7%Q6rS-oiEV7ZgeVEFF$snsO5DxU7smgD~3tW(aI|ZHFY~%)U&p2 zZvx6+>HiF+^ z2ew(xFQ9LX5DC|XOL!Q2w{|X0H3K-jh{B7ZJHeZc@XPpmu(}x|qbPy|G#o=CjAnFm zDw50jPWtE1&dpDVHZ^J9q57OvF6HTb-dvB{El7)X zT#e_nlK!ezpz%apXE3AK;@^pOB3jka+@$OQ1~hCYTU=eyOq;s@X6ahlC{g`jOQ$PZ z*>qml%rbkVST@Z>+$m{Ad&MdhS})k&efO=oitW&XtLG_RImJs8f~X3D$}3z(5Cl<4 zwnNo+OiHP;z$N)qT1v_LOgbgpjCw|yG)E}JcpX=t>VFAzNT2tf_PWQ3;o(?l1hay@ zzYxh~{W1SMJC3e7+OlR-Z%>uT!^%{B#5x^1#z9SvQ>Mgv^@z4)JYo52qg=7?ULYQ6DRyNn119 zV1xUIr*_BpM0DZ&`NTwg!KSk`Zb&WY_b=-e`|R-T-qG z4EGV-hu`6^#?WQ_6Fli92orYeBbcrGkb4O3G1vNeYiQ#xJnthT*fkc?`O#V1=m!WM zbS3n;34Pd0{J0I-MX(E>!Y*T3gF^2)MYU_#53yuM!KS$IM|`!WHTvNp|#+% z_8W)<47k`;#8v24C&5J&I=K0Wh<*YOZn(SO|Icw(YzoDuP>zKKLP#&mpXjcP8X#P4 z9QO|Bam`HWcFLGcTDE0brZ%FgDOHsi>%$Vk8!WkDU5F9_E0f^|-iALiDe zS{_fhw{vNQ%^Cz>vEhb`59l`5N17s02*EBnDWyGm9%><~_Cb)IsSu^7Dg?o#&Jgs| zR~0ho&9V6fazaC#=*We(~!g|5twkOMHZ# diff --git a/Data_Coupler/wwwroot/data/credentials.db-shm b/Data_Coupler/wwwroot/data/credentials.db-shm index 47db41f7bfc74147710cf6b6e20eaeb7c962d07a..a814b927ca7e74c917c7890b83ce02fcf9474b7b 100644 GIT binary patch literal 32768 zcmeI*RcsVd6vpv?arc(u?(XjH?pEC0-QC^Y-Cc{jyIXO4<^ecMpy3I&2_Zw~yUCZC z?B1N*^V^+$+~fZ=6P}gS;sY^0*)@q}a;Y!AEuW2CSg&osslL7ug93v-`{mnFA+&!8 z_gks&%TxF3FYCw4!53eviEfEuiD`*tiEYvQ|F2J+KYV_A|M%bTf8i6( zJ|oYw=x>Q(8sbq$L3fNI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?CT3k11dKmhI)c;VjG)w$~hUbtb z3xwh|AMpIkrj`WUCh*2>4Xa-X1PioaZ|Co!gL3CIPPn!rDY7Uz^^NicI995T&R@ zEgI31j`U<8Bbmrd7P69!?BpOPxWEk_cwJu`CE#3va5hWK&*m1TCNsGyOlc}po5r-F z6TKM3C?+wBMXX{IyEw#2E^?EH&TU91lYrL(;cbduT$|XHhAiZv2xX{39h%UZ&h%z5 zqnXTX7PFeo?B+11xWp|Ud0k%{CE#3v2sS^`-)38;B`bL;N?EE>mjK$(g+2^n3{#lH z64tPVJsjaQm$}Vj=QgC1Nx*A?h&DMj9?3{YHu6!7a#W)pO=(M4`ZAQUOl2-hS<6=T z637{@aEB*e*Vje~I9DK&%?yrDa?+EX{1m4=)u~T2+R@Fqht|m?@K*%-F^q9cV;;*` h$2RtHl(SsrE>HhTeHD>_a|L{O&U-#O_kfN$**9BKsUZLW delta 225 zcmZo@U}|V!s+V}A%K!pQK+MR%Aix8p<$*ZpvB0vWGdI?j?%c%B`aSvBO2v8cB1#=| zNmUOt3JgHz{zn2(;feK}lLc4|HhZviIB!m1nZV4*yg88NFB2mRgkptIY(Pqrk&zKd hU1nrvXW#)celsz0Kx8=~6c>;ZR$^vi;07|(837g7Kg$3B diff --git a/Data_Coupler/wwwroot/data/credentials.db-wal b/Data_Coupler/wwwroot/data/credentials.db-wal index 8e955bda66c739439a5f59c6cd94cd1c39da3588..7c12581ae5e0f8bc61ddb85de3cb91057c991eb6 100644 GIT binary patch literal 988832 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�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

Tlikr5nC?u8tR2KE3fsW4Zic;|a(#@GxW|_?R4& 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