Skip to content

Commit

Permalink
Adding AutoSaveDetectedEventArgs callback
Browse files Browse the repository at this point in the history
  • Loading branch information
YassinLokhat committed Jan 7, 2025
1 parent 8b7d13f commit a59b093
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 41 deletions.
9 changes: 9 additions & 0 deletions Core/Events/AutoSaveDetectedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Upsilon.Apps.PassKey.Core.Events
{
public class AutoSaveDetectedEventArgs : EventArgs
{
public bool MergeAutoSave { get; set; } = true;

public AutoSaveDetectedEventArgs() : base() { }
}
}
6 changes: 3 additions & 3 deletions Core/Interfaces/IDatabase.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Upsilon.Apps.Passkey.Core.Models;
using Upsilon.Apps.PassKey.Core.Events;

namespace Upsilon.Apps.Passkey.Core.Interfaces
{
Expand All @@ -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<AutoSaveDetectedEventArgs>? autoSaveHandler = null)
=> Database.Open(databaseFile, autoSaveFile, logFile, username, autoSaveHandler);
}
}
55 changes: 32 additions & 23 deletions Core/Models/Database.cs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -97,8 +79,11 @@ public void Save()
AutoSaveFileLocker = new(AutoSaveFile, FileMode.Open);

AutoSave = AutoSaveFileLocker.ReadAllText(Passkeys).Deserialize<AutoSave>();

AutoSave.Database = this;

AutoSaveDetectedEventArgs eventArg = new();
_onAutoSaveDetected?.Invoke(this, eventArg);
_handleAutoSave(eventArg.MergeAutoSave);
}
}

Expand All @@ -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<AutoSaveDetectedEventArgs>? _onAutoSaveDetected = null;

private Database(string databaseFile, string autoSaveFile, string logFile, FileMode fileMode, EventHandler<AutoSaveDetectedEventArgs>? autoSaveHandler, string username, string[]? passkeys = null)
{
DatabaseFile = databaseFile;
AutoSaveFile = autoSaveFile;
Expand All @@ -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)
Expand All @@ -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()
{
Expand All @@ -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<AutoSaveDetectedEventArgs>? 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();
}
}
}
}
4 changes: 2 additions & 2 deletions UnitTests/UnitTestsHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
15 changes: 2 additions & 13 deletions UnitTests/UserUnitTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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));
Expand Down

0 comments on commit a59b093

Please sign in to comment.