From a59b093183162a242cc9dc91c9d449bee7ba54e0 Mon Sep 17 00:00:00 2001 From: Yassin Lokhat Date: Tue, 7 Jan 2025 17:10:22 +0300 Subject: [PATCH] Adding AutoSaveDetectedEventArgs callback --- Core/Events/AutoSaveDetectedEventArgs.cs | 9 ++++ Core/Interfaces/IDatabase.cs | 6 +-- Core/Models/Database.cs | 55 ++++++++++++++---------- UnitTests/UnitTestsHelper.cs | 4 +- UnitTests/UserUnitTests.cs | 15 +------ 5 files changed, 48 insertions(+), 41 deletions(-) create mode 100644 Core/Events/AutoSaveDetectedEventArgs.cs diff --git a/Core/Events/AutoSaveDetectedEventArgs.cs b/Core/Events/AutoSaveDetectedEventArgs.cs new file mode 100644 index 0000000..84513d2 --- /dev/null +++ b/Core/Events/AutoSaveDetectedEventArgs.cs @@ -0,0 +1,9 @@ +namespace Upsilon.Apps.PassKey.Core.Events +{ + public class AutoSaveDetectedEventArgs : EventArgs + { + public bool MergeAutoSave { get; set; } = true; + + public AutoSaveDetectedEventArgs() : base() { } + } +} diff --git a/Core/Interfaces/IDatabase.cs b/Core/Interfaces/IDatabase.cs index 0e4db4b..a52ffc8 100644 --- a/Core/Interfaces/IDatabase.cs +++ b/Core/Interfaces/IDatabase.cs @@ -1,4 +1,5 @@ using Upsilon.Apps.Passkey.Core.Models; +using Upsilon.Apps.PassKey.Core.Events; namespace Upsilon.Apps.Passkey.Core.Interfaces { @@ -11,14 +12,13 @@ public interface IDatabase : IDisposable void Delete(); void Save(); - void HandleAutoSave(bool mergeAutoSave); IUser? Login(string passkey); void Close(); static IDatabase Create(string databaseFile, string autoSaveFile, string logFile, string username, string[] passkeys) => Database.Create(databaseFile, autoSaveFile, logFile, username, passkeys); - static IDatabase Open(string databaseFile, string autoSaveFile, string logFile, string username) - => Database.Open(databaseFile, autoSaveFile, logFile, username); + static IDatabase Open(string databaseFile, string autoSaveFile, string logFile, string username, EventHandler? autoSaveHandler = null) + => Database.Open(databaseFile, autoSaveFile, logFile, username, autoSaveHandler); } } \ No newline at end of file diff --git a/Core/Models/Database.cs b/Core/Models/Database.cs index 2aab6a0..764824f 100644 --- a/Core/Models/Database.cs +++ b/Core/Models/Database.cs @@ -1,5 +1,6 @@ using Upsilon.Apps.Passkey.Core.Interfaces; using Upsilon.Apps.Passkey.Core.Utils; +using Upsilon.Apps.PassKey.Core.Events; using Upsilon.Apps.PassKey.Core.Utils; namespace Upsilon.Apps.Passkey.Core.Models @@ -45,25 +46,6 @@ public void Dispose() LogFile = string.Empty; } - public void HandleAutoSave(bool mergeAutoSave) - { - if (User == null) throw new NullReferenceException(nameof(User)); - - if (!File.Exists(AutoSaveFile)) - { - return; - } - - if (mergeAutoSave) - { - AutoSave.MergeChange(); - } - else - { - AutoSave.Clear(); - } - } - public void Save() { if (User == null) throw new NullReferenceException(nameof(User)); @@ -97,8 +79,11 @@ public void Save() AutoSaveFileLocker = new(AutoSaveFile, FileMode.Open); AutoSave = AutoSaveFileLocker.ReadAllText(Passkeys).Deserialize(); - AutoSave.Database = this; + + AutoSaveDetectedEventArgs eventArg = new(); + _onAutoSaveDetected?.Invoke(this, eventArg); + _handleAutoSave(eventArg.MergeAutoSave); } } @@ -120,7 +105,9 @@ public void Close() internal FileLocker? DatabaseFileLocker; internal FileLocker? AutoSaveFileLocker; - private Database(string databaseFile, string autoSaveFile, string logFile, FileMode fileMode, string username, string[]? passkeys = null) + private EventHandler? _onAutoSaveDetected = null; + + private Database(string databaseFile, string autoSaveFile, string logFile, FileMode fileMode, EventHandler? autoSaveHandler, string username, string[]? passkeys = null) { DatabaseFile = databaseFile; AutoSaveFile = autoSaveFile; @@ -139,6 +126,8 @@ private Database(string databaseFile, string autoSaveFile, string logFile, FileM }; DatabaseFileLocker = new(databaseFile, fileMode); + + _onAutoSaveDetected = autoSaveHandler; } internal static IDatabase Create(string databaseFile, string autoSaveFile, string logFile, string username, string[] passkeys) @@ -155,7 +144,7 @@ internal static IDatabase Create(string databaseFile, string autoSaveFile, strin _ = Directory.CreateDirectory(databaseFileDirectory); } - Database database = new(databaseFile, autoSaveFile, logFile, FileMode.Create, username, passkeys); + Database database = new(databaseFile, autoSaveFile, logFile, FileMode.Create, autoSaveHandler: null, username, passkeys); database.User = new() { @@ -172,6 +161,26 @@ internal static IDatabase Create(string databaseFile, string autoSaveFile, strin return Open(databaseFile, autoSaveFile, logFile, username); } - internal static IDatabase Open(string databaseFile, string autoSaveFile, string logFile, string username) => new Database(databaseFile, autoSaveFile, logFile, FileMode.Open, username); + internal static IDatabase Open(string databaseFile, string autoSaveFile, string logFile, string username, EventHandler? autoSaveHandler = null) + => new Database(databaseFile, autoSaveFile, logFile, FileMode.Open, autoSaveHandler, username); + + private void _handleAutoSave(bool mergeAutoSave) + { + if (User == null) throw new NullReferenceException(nameof(User)); + + if (!File.Exists(AutoSaveFile)) + { + return; + } + + if (mergeAutoSave) + { + AutoSave.MergeChange(); + } + else + { + AutoSave.Clear(); + } + } } } \ No newline at end of file diff --git a/UnitTests/UnitTestsHelper.cs b/UnitTests/UnitTestsHelper.cs index 84bb726..6f71091 100644 --- a/UnitTests/UnitTestsHelper.cs +++ b/UnitTests/UnitTestsHelper.cs @@ -32,13 +32,13 @@ public static IDatabase CreateTestDatabase(string[]? passkeys = null, [CallerMem return database; } - public static IDatabase OpenTestDatabase(string[] passkeys, [CallerMemberName] string username = "") + public static IDatabase OpenTestDatabase(string[] passkeys, bool mergeAutoSave = false, [CallerMemberName] string username = "") { string databaseFile = ComputeDatabaseFilePath(username); string autoSaveFile = ComputeAutoSaveFilePath(username); string logFile = ComputeLogFilePath(username); - IDatabase database = IDatabase.Open(databaseFile, autoSaveFile, logFile, username); + IDatabase database = IDatabase.Open(databaseFile, autoSaveFile, logFile, username, (s, e) => { e.MergeAutoSave = mergeAutoSave; }); foreach (string passkey in passkeys) { diff --git a/UnitTests/UserUnitTests.cs b/UnitTests/UserUnitTests.cs index d995151..f72a8c0 100644 --- a/UnitTests/UserUnitTests.cs +++ b/UnitTests/UserUnitTests.cs @@ -353,18 +353,7 @@ public void Case07_UserUpdateButNotSaved() _ = File.Exists(autoSaveFile).Should().BeTrue(); // When - IDatabase databaseLoaded = UnitTestsHelper.OpenTestDatabase(oldPasskeys); - - // Then - _ = databaseLoaded.User.Should().NotBeNull(); - _ = (databaseLoaded.User?.Username.Should().Be(oldUsername)); - _ = (databaseLoaded.User?.Passkeys.Should().BeEquivalentTo(oldPasskeys)); - _ = (databaseLoaded.User?.PasswordTimeout.Should().Be(0)); - _ = (databaseLoaded.User?.LogoutTimeout.Should().Be(0)); - _ = (databaseLoaded.User?.CleaningClipboardTimeout.Should().Be(0)); - - // When - databaseLoaded.HandleAutoSave(mergeAutoSave: true); + IDatabase databaseLoaded = UnitTestsHelper.OpenTestDatabase(oldPasskeys, mergeAutoSave: true); // Then _ = File.Exists(autoSaveFile).Should().BeFalse(); @@ -382,7 +371,7 @@ public void Case07_UserUpdateButNotSaved() _ = databaseLoaded.Login(passkey); } - // // Then + // Then _ = File.Exists(autoSaveFile).Should().BeFalse(); _ = (databaseLoaded.User?.Username.Should().Be(newUsername)); _ = (databaseLoaded.User?.Passkeys.Should().BeEquivalentTo(newPasskeys));