Skip to content

Commit cb4fcd9

Browse files
authored
Merge pull request #34 from YassinLokhat/31-improve-logs-and-user-files-managements-in-core
31 improve logs and user files managements in core
2 parents 84a8cf3 + dbbe150 commit cb4fcd9

39 files changed

Lines changed: 733 additions & 1317 deletions

Core/Models/Account.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System.ComponentModel;
22
using Upsilon.Apps.Passkey.Core.Utils;
3-
using Upsilon.Apps.Passkey.Interfaces;
43
using Upsilon.Apps.Passkey.Interfaces.Enums;
4+
using Upsilon.Apps.Passkey.Interfaces.Models;
55

66
namespace Upsilon.Apps.Passkey.Core.Models
77
{
@@ -19,7 +19,6 @@ string IAccount.Label
1919
{
2020
get => Database.Get(Label);
2121
set => Label = Database.AutoSave.UpdateValue(ItemId,
22-
itemName: ToString(),
2322
fieldName: nameof(Label),
2423
needsReview: false,
2524
oldValue: Label,
@@ -31,7 +30,6 @@ string[] IAccount.Identifiers
3130
{
3231
get => Database.Get(Identifiers);
3332
set => Identifiers = Database.AutoSave.UpdateValue(ItemId,
34-
itemName: ToString(),
3533
fieldName: nameof(Identifiers),
3634
needsReview: true,
3735
oldValue: Identifiers,
@@ -50,7 +48,7 @@ string IAccount.Password
5048
Dictionary<DateTime, string> oldPasswords = Passwords.CloneWith(Database.SerializationCenter);
5149
Passwords[DateTime.Now] = Password = value;
5250

53-
if (_service != null)
51+
if (_service is not null)
5452
{
5553
if (Service.User.NumberOfOldPasswordToKeep != 0)
5654
{
@@ -67,7 +65,6 @@ string IAccount.Password
6765
}
6866

6967
_ = Database.AutoSave.UpdateValue(ItemId,
70-
itemName: ToString(),
7168
fieldName: nameof(Password),
7269
needsReview: true,
7370
oldValue: oldPasswords,
@@ -84,7 +81,6 @@ string IAccount.Notes
8481
{
8582
get => Database.Get(Notes);
8683
set => Notes = Database.AutoSave.UpdateValue(ItemId,
87-
itemName: ToString(),
8884
fieldName: nameof(Notes),
8985
needsReview: false,
9086
oldValue: Notes,
@@ -96,7 +92,6 @@ int IAccount.PasswordUpdateReminderDelay
9692
{
9793
get => Database.Get(PasswordUpdateReminderDelay);
9894
set => PasswordUpdateReminderDelay = Database.AutoSave.UpdateValue(ItemId,
99-
itemName: ToString(),
10095
fieldName: nameof(PasswordUpdateReminderDelay),
10196
needsReview: false,
10297
oldValue: PasswordUpdateReminderDelay,
@@ -108,7 +103,6 @@ AccountOption IAccount.Options
108103
{
109104
get => Database.Get(Options);
110105
set => Options = Database.AutoSave.UpdateValue(ItemId,
111-
itemName: ToString(),
112106
fieldName: nameof(Options),
113107
needsReview: false,
114108
oldValue: Options,
@@ -157,7 +151,7 @@ public void Apply(Change change)
157151
{
158152
switch (change.ActionType)
159153
{
160-
case Change.Type.Update:
154+
case LogEventType.ItemUpdated:
161155
switch (change.FieldName)
162156
{
163157
case nameof(Label):
@@ -184,7 +178,7 @@ public void Apply(Change change)
184178
}
185179
break;
186180
default:
187-
throw new InvalidEnumArgumentException(nameof(change.ActionType), (int)change.ActionType, typeof(Change.Type));
181+
throw new InvalidEnumArgumentException(nameof(change.ActionType), (int)change.ActionType, typeof(LogEventType));
188182
}
189183
}
190184

Core/Models/AutoSave.cs

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Upsilon.Apps.Passkey.Core.Utils;
2+
using Upsilon.Apps.Passkey.Interfaces.Enums;
23

34
namespace Upsilon.Apps.Passkey.Core.Models
45
{
@@ -13,7 +14,6 @@ internal Database Database
1314
public Dictionary<string, List<Change>> Changes { get; set; } = [];
1415

1516
internal T UpdateValue<T>(string itemId,
16-
string itemName,
1717
string fieldName,
1818
bool needsReview,
1919
T oldValue,
@@ -23,53 +23,45 @@ internal T UpdateValue<T>(string itemId,
2323
if (Database.SerializationCenter.AreDifferent(oldValue, newValue))
2424
{
2525
_addChange(itemId,
26-
itemName,
27-
string.Empty,
2826
fieldName,
2927
oldValue.SerializeWith(Database.SerializationCenter),
3028
newValue.SerializeWith(Database.SerializationCenter),
3129
readableValue,
3230
needsReview,
33-
Change.Type.Update);
31+
LogEventType.ItemUpdated);
3432
}
3533

3634
return newValue;
3735
}
3836

3937
internal T AddValue<T>(string itemId,
40-
string itemName,
41-
string containerName,
38+
string readableValue,
4239
bool needsReview,
4340
T value) where T : notnull
4441
{
45-
_addChange(itemId, itemName, containerName, string.Empty, value.SerializeWith(Database.SerializationCenter), string.Empty, needsReview, Change.Type.Add);
42+
_addChange(itemId, string.Empty, value.SerializeWith(Database.SerializationCenter), readableValue, needsReview, LogEventType.ItemAdded);
4643

4744
return value;
4845
}
4946

5047
internal T DeleteValue<T>(string itemId,
51-
string itemName,
52-
string containerName,
48+
string readableValue,
5349
bool needsReview,
5450
T value) where T : notnull
5551
{
56-
_addChange(itemId, itemName, containerName, string.Empty, value.SerializeWith(Database.SerializationCenter), string.Empty, needsReview, Change.Type.Delete);
52+
_addChange(itemId, string.Empty, value.SerializeWith(Database.SerializationCenter), readableValue, needsReview, LogEventType.ItemDeleted);
5753

5854
return value;
5955
}
6056

6157
private void _addChange(string itemId,
62-
string itemName,
63-
string containerName,
6458
string fieldName,
6559
string newValue,
6660
string readableValue,
6761
bool needsReview,
68-
Change.Type action)
62+
LogEventType action)
6963
{
7064
_addChange(itemId,
71-
itemName,
72-
containerName,
7365
fieldName,
7466
null,
7567
newValue,
@@ -79,14 +71,12 @@ private void _addChange(string itemId,
7971
}
8072

8173
private void _addChange(string itemId,
82-
string itemName,
83-
string containerName,
8474
string fieldName,
8575
string? oldValue,
8676
string newValue,
8777
string readableValue,
8878
bool needsReview,
89-
Change.Type action)
79+
LogEventType action)
9080
{
9181
string changeKey = $"{itemId}\t{fieldName}";
9282
if (!Changes.ContainsKey(changeKey))
@@ -106,26 +96,44 @@ private void _addChange(string itemId,
10696

10797
_mergeChanges(changeKey, currentChange);
10898

109-
if (Database.AutoSaveFileLocker == null)
99+
Database.FileLocker.Save(this, Database.AutoSaveFileEntry, Database.Passkeys);
100+
101+
if (itemId == Database.User?.ItemId)
110102
{
111-
Database.AutoSaveFileLocker = new(Database.CryptographyCenter, Database.SerializationCenter, Database.AutoSaveFile, FileMode.OpenOrCreate);
103+
if (Database.User is not null)
104+
{
105+
itemId = Database.User.ToString();
106+
}
112107
}
108+
else if (itemId.StartsWith('S'))
109+
{
110+
Service? s = Database.User?.Services.FirstOrDefault(x => x.ItemId == itemId);
113111

114-
Database.AutoSaveFileLocker.Save(this, Database.Passkeys);
115-
string logMessage = action switch
112+
if (s is not null)
113+
{
114+
itemId = s.ToString();
115+
}
116+
}
117+
else if (itemId.StartsWith('A'))
116118
{
117-
Change.Type.Add => $"{itemName} has been added to {containerName}",
118-
Change.Type.Delete => $"{itemName} has been removed from {containerName}",
119-
_ => $"{itemName}'s {fieldName.ToSentenceCase().ToLower()} has been {(string.IsNullOrWhiteSpace(readableValue) ? $"updated" : $"set to {readableValue}")}",
120-
};
121-
Database.Logs.AddLog(logMessage, needsReview);
119+
Account? a = Database.User?.Services.SelectMany(x => x.Accounts).FirstOrDefault(x => x.ItemId == itemId);
120+
121+
if (a is not null)
122+
{
123+
itemId = a.ToString();
124+
}
125+
}
126+
127+
Database.Logs.AddLog(data: [itemId, fieldName, readableValue],
128+
eventType: action,
129+
needsReview);
122130
}
123131

124132
private void _mergeChanges(string changeKey, Change currentChange)
125133
{
126-
Change? lastUpdate = Changes[changeKey].LastOrDefault(x => x.ActionType == Change.Type.Update);
134+
Change? lastUpdate = Changes[changeKey].LastOrDefault(x => x.ActionType == LogEventType.ItemUpdated);
127135

128-
if (currentChange.ActionType != Change.Type.Update
136+
if (currentChange.ActionType != LogEventType.ItemUpdated
129137
|| lastUpdate is null)
130138
{
131139
Changes[changeKey].Add(currentChange);
@@ -147,7 +155,7 @@ private void _mergeChanges(string changeKey, Change currentChange)
147155

148156
internal void ApplyChanges(bool deleteFile)
149157
{
150-
List<Change> changes = Changes.Values.SelectMany(x => x).OrderBy(x => x.Index).ToList();
158+
List<Change> changes = [.. Changes.Values.SelectMany(x => x).OrderBy(x => x.Index)];
151159

152160
foreach (Change change in changes)
153161
{
@@ -170,13 +178,10 @@ internal void Clear(bool deleteFile)
170178
{
171179
Changes.Clear();
172180

173-
Database.AutoSaveFileLocker?.Dispose();
174-
Database.AutoSaveFileLocker = null;
175-
176181
if (deleteFile
177-
&& File.Exists(Database.AutoSaveFile))
182+
&& Database.FileLocker.Exists(Database.AutoSaveFileEntry))
178183
{
179-
File.Delete(Database.AutoSaveFile);
184+
Database.FileLocker.Delete(Database.AutoSaveFileEntry);
180185
}
181186
}
182187
}

Core/Models/Change.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1-
namespace Upsilon.Apps.Passkey.Core.Models
1+
using Upsilon.Apps.Passkey.Interfaces.Enums;
2+
3+
namespace Upsilon.Apps.Passkey.Core.Models
24
{
35
internal sealed class Change
46
{
5-
public enum Type
6-
{
7-
None = 0,
8-
Update = 1,
9-
Add = 2,
10-
Delete = 3,
11-
}
12-
137
public long Index { get; set; } = long.MaxValue;
14-
public Type ActionType { get; set; } = Type.None;
8+
public LogEventType ActionType { get; set; } = LogEventType.None;
159
public string ItemId { get; set; } = string.Empty;
1610
public string FieldName { get; set; } = string.Empty;
1711
public string? OldValue { get; set; } = null;

0 commit comments

Comments
 (0)