diff --git a/Bitvault.Avalonia/AllNavigationView.axaml b/Bitvault.Avalonia/AllNavigationView.axaml
index 37cd350..03e5e46 100644
--- a/Bitvault.Avalonia/AllNavigationView.axaml
+++ b/Bitvault.Avalonia/AllNavigationView.axaml
@@ -2,4 +2,13 @@
x:Class="Bitvault.Avalonia.AllNavigationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Content="All" />
+ xmlns:vm="using:Bitvault"
+ x:DataType="vm:AllNavigationViewModel"
+ Content="All"
+ IsSelected="{Binding Selected, Mode=TwoWay}">
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs
index 10c3763..6b70724 100644
--- a/Bitvault.Avalonia/App.axaml.cs
+++ b/Bitvault.Avalonia/App.axaml.cs
@@ -12,23 +12,10 @@ namespace Bitvault.Avalonia;
public partial class App : Application
{
- public override void Initialize()
- {
- AvaloniaXamlLoader.Load(this);
- }
+ public override void Initialize() => AvaloniaXamlLoader.Load(this);
public override async void OnFrameworkInitializationCompleted()
{
- //var command = connection.CreateCommand();
- //command.CommandText = "SELECT quote($newPassword);";
- //command.Parameters.AddWithValue("$newPassword", "Test123");
- //var quotedNewPassword = (string)command.ExecuteScalar();
-
- //command.CommandText = "PRAGMA rekey = " + quotedNewPassword;
- //command.Parameters.Clear();
- //command.ExecuteNonQuery();
-
-
IHost? host = DefaultHostBuilder.Create()
.AddConfiguration(args => args.Name = "Personal",
"Vault:*")
@@ -75,8 +62,14 @@ public partial class App : Application
services.AddTemplate();
services.AddTemplate();
+ services.AddTemplate("OpenVault");
+
services.AddTemplate("Vault");
- services.AddTemplate("Open");
+ services.AddHandler();
+
+ services.AddTemplate();
+
+ services.AddTemplate("VaultCommands");
});
})!);
@@ -87,7 +80,8 @@ public partial class App : Application
services.AddInitializer();
services.AddTemplate("Main");
- services.AddHandler();
+ services.AddHandler();
+
services.AddTransient();
services.AddTemplate();
diff --git a/Bitvault.Avalonia/ArchiveNavigationView.axaml b/Bitvault.Avalonia/ArchiveNavigationView.axaml
index 62ffa09..8ce53f7 100644
--- a/Bitvault.Avalonia/ArchiveNavigationView.axaml
+++ b/Bitvault.Avalonia/ArchiveNavigationView.axaml
@@ -2,4 +2,13 @@
x:Class="Bitvault.Avalonia.ArchiveNavigationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Content="Archive" />
\ No newline at end of file
+ xmlns:vm="using:Bitvault"
+ x:DataType="vm:ArchiveNavigationViewModel"
+ Content="Archive"
+ IsSelected="{Binding Selected, Mode=TwoWay}">
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/Bitvault.Avalonia.csproj b/Bitvault.Avalonia/Bitvault.Avalonia.csproj
index 3baccb9..6e283f7 100644
--- a/Bitvault.Avalonia/Bitvault.Avalonia.csproj
+++ b/Bitvault.Avalonia/Bitvault.Avalonia.csproj
@@ -32,11 +32,14 @@
-
- OpenVaultView.axaml
+
+ OpenView.axaml
ManageNavigationView.axaml
+
+ VaultNavigationView.axaml
+
\ No newline at end of file
diff --git a/Bitvault.Avalonia/LockerNavigationView.axaml b/Bitvault.Avalonia/LockerNavigationView.axaml
new file mode 100644
index 0000000..047aec4
--- /dev/null
+++ b/Bitvault.Avalonia/LockerNavigationView.axaml
@@ -0,0 +1,11 @@
+
+ Welcome to Avalonia!
+
diff --git a/Bitvault.Avalonia/LockerNavigationView.axaml.cs b/Bitvault.Avalonia/LockerNavigationView.axaml.cs
new file mode 100644
index 0000000..6fb7ef7
--- /dev/null
+++ b/Bitvault.Avalonia/LockerNavigationView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Bitvault.Avalonia
+{
+ public partial class LockerNavigationView : UserControl
+ {
+ public LockerNavigationView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Bitvault.Avalonia/OpenVaultView.axaml.cs b/Bitvault.Avalonia/OpenVaultView.axaml.cs
deleted file mode 100644
index 224eecd..0000000
--- a/Bitvault.Avalonia/OpenVaultView.axaml.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using Avalonia.Controls;
-
-namespace Bitvault.Avalonia;
-
-public partial class OpenVaultView : UserControl
-{
- public OpenVaultView() => InitializeComponent();
-}
\ No newline at end of file
diff --git a/Bitvault.Avalonia/OpenVaultView.axaml b/Bitvault.Avalonia/OpenView.axaml
similarity index 94%
rename from Bitvault.Avalonia/OpenVaultView.axaml
rename to Bitvault.Avalonia/OpenView.axaml
index eeaecaa..8d79f23 100644
--- a/Bitvault.Avalonia/OpenVaultView.axaml
+++ b/Bitvault.Avalonia/OpenView.axaml
@@ -1,5 +1,5 @@
InitializeComponent();
+}
\ No newline at end of file
diff --git a/Bitvault.Avalonia/StarredNavigationView.axaml b/Bitvault.Avalonia/StarredNavigationView.axaml
index f53bc1a..7be3a08 100644
--- a/Bitvault.Avalonia/StarredNavigationView.axaml
+++ b/Bitvault.Avalonia/StarredNavigationView.axaml
@@ -2,4 +2,14 @@
x:Class="Bitvault.Avalonia.StarredNavigationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Content="Starred" />
+ xmlns:vm="using:Bitvault"
+ x:DataType="vm:StarredNavigationViewModel"
+ Content="Starred"
+ IsSelected="{Binding Selected, Mode=TwoWay}">
+
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/VaultCommandView.axaml b/Bitvault.Avalonia/VaultCommandView.axaml
new file mode 100644
index 0000000..f21e82c
--- /dev/null
+++ b/Bitvault.Avalonia/VaultCommandView.axaml
@@ -0,0 +1,11 @@
+
+ Welcome to Avalonia!
+
diff --git a/Bitvault.Avalonia/VaultCommandView.axaml.cs b/Bitvault.Avalonia/VaultCommandView.axaml.cs
new file mode 100644
index 0000000..4ded30e
--- /dev/null
+++ b/Bitvault.Avalonia/VaultCommandView.axaml.cs
@@ -0,0 +1,8 @@
+using Avalonia.Controls;
+
+namespace Bitvault.Avalonia;
+
+public partial class VaultCommandView : UserControl
+{
+ public VaultCommandView() => InitializeComponent();
+}
diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml b/Bitvault.Avalonia/VaultNavigationView.axaml
index 873237e..adfde50 100644
--- a/Bitvault.Avalonia/VaultNavigationView.axaml
+++ b/Bitvault.Avalonia/VaultNavigationView.axaml
@@ -17,7 +17,7 @@
-
+
@@ -30,7 +30,7 @@
-
+
@@ -39,7 +39,7 @@
-
+
@@ -51,6 +51,6 @@
-
+
diff --git a/Bitvault.Avalonia/VaultView.axaml b/Bitvault.Avalonia/VaultView.axaml
index 597ea94..91fc341 100644
--- a/Bitvault.Avalonia/VaultView.axaml
+++ b/Bitvault.Avalonia/VaultView.axaml
@@ -2,10 +2,45 @@
x:Class="Bitvault.Avalonia.VaultView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
-
-
-
+ xmlns:vm="using:Bitvault"
+ x:DataType="vm:VaultViewModel">
+
+ 40
+ 36
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/VaultView.axaml.cs b/Bitvault.Avalonia/VaultView.axaml.cs
index 6411dbd..7839863 100644
--- a/Bitvault.Avalonia/VaultView.axaml.cs
+++ b/Bitvault.Avalonia/VaultView.axaml.cs
@@ -1,7 +1,9 @@
using Avalonia.Controls;
+using Toolkit.Foundation;
namespace Bitvault.Avalonia;
+[NavigationTarget("Header")]
public partial class VaultView : UserControl
{
public VaultView() => InitializeComponent();
diff --git a/Bitvault/AllNavigationViewModel.cs b/Bitvault/AllNavigationViewModel.cs
index 6acebdc..5121637 100644
--- a/Bitvault/AllNavigationViewModel.cs
+++ b/Bitvault/AllNavigationViewModel.cs
@@ -1,12 +1,21 @@
-using Toolkit.Foundation;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+using Toolkit.Foundation;
namespace Bitvault;
-public class AllNavigationViewModel(IServiceProvider provider,
- IServiceFactory factory,
- IMediator mediator,
- IPublisher publisher,
- ISubscriber subscriber,
- IDisposer disposer) :
- ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
- IVaultNavigationViewModel;
\ No newline at end of file
+public partial class AllNavigationViewModel(IServiceProvider provider,
+ IServiceFactory factory,
+ IMediator mediator,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
+ IVaultNavigationViewModel
+{
+ [ObservableProperty]
+ private bool selected;
+
+ [RelayCommand]
+ public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("All")));
+}
\ No newline at end of file
diff --git a/Bitvault/ArchiveNavigationViewModel.cs b/Bitvault/ArchiveNavigationViewModel.cs
index 77126fe..2e10997 100644
--- a/Bitvault/ArchiveNavigationViewModel.cs
+++ b/Bitvault/ArchiveNavigationViewModel.cs
@@ -1,12 +1,21 @@
-using Toolkit.Foundation;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+using Toolkit.Foundation;
namespace Bitvault;
-public class ArchiveNavigationViewModel(IServiceProvider provider,
+public partial class ArchiveNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
- IVaultNavigationViewModel;
\ No newline at end of file
+ IVaultNavigationViewModel
+{
+ [ObservableProperty]
+ private bool selected;
+
+ [RelayCommand]
+ public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Archive")));
+}
\ No newline at end of file
diff --git a/Bitvault/Category.cs b/Bitvault/Category.cs
new file mode 100644
index 0000000..4b77f4f
--- /dev/null
+++ b/Bitvault/Category.cs
@@ -0,0 +1,11 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Bitvault;
+
+public record Category
+{
+ [Key]
+ public int Id { get; set; }
+
+ public string? Name { get; set; }
+}
\ No newline at end of file
diff --git a/Bitvault/CreateVaultStorageHandler.cs b/Bitvault/CreateVaultStorageHandler.cs
deleted file mode 100644
index 1f2567b..0000000
--- a/Bitvault/CreateVaultStorageHandler.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-//using Microsoft.EntityFrameworkCore;
-//using Microsoft.Extensions.Hosting;
-//using Toolkit.Foundation;
-
-//namespace Bitvault;
-
-//public class CreateVaultStorageHandler(IHostEnvironment environment,
-// IKeyGenerator generator,
-// IKeyDeriver deriver,
-// IEncryptor encryptor,
-// IDecryptor decryptor,
-// IDbContextFactory dbContextFactory,
-// IWritableConfiguration writer) : IHandler, bool>
-//{
-// public async Task Handle(Create args, CancellationToken cancellationToken)
-// {
-// if (args.Value is VaultStorage vault)
-// {
-// if (vault.Name is { Length: > 0 } name && vault.Password is { Length: > 0 } password)
-// {
-// byte[] salt = generator.Generate(16);
-// byte[] key = generator.Generate(32);
-
-// byte[] derivedKey = deriver.DeriveKey(password, salt);
-
-// byte[] encryptedKey = encryptor.Encrypt(key, derivedKey);
-// byte[] decryptedKey = decryptor.Decrypt(encryptedKey, derivedKey);
-
-// Array.Clear(encryptedKey, 0, encryptedKey.Length);
-
-// using VaultDbContext context = dbContextFactory.CreateDbContext();
-// context.Database.SetConnectionString($"Data Source={Path.Combine(environment.ContentRootPath, name)}.vault;Mode=ReadWriteCreate;Password={Convert.ToBase64String(decryptedKey)}");
-
-// try
-// {
-// await context.Database.EnsureCreatedAsync(cancellationToken);
-// writer.Write(args =>
-// {
-// var f = args.Name;
-// });
-// }
-// catch
-// {
-
-// }
-
-// Array.Clear(decryptedKey, 0, decryptedKey.Length);
-
-// // Derive the key for encryption
-
-// //byte[] encryptionKey = deriver.DeriveKey(password, salt);
-
-// //// Derive the key for decryption
-// //byte[] decryptionKey = deriver.DeriveKey(password, salt);
-
-// //// Compare keys to ensure they're the same
-// //bool areKeysEqual = encryptionKey.SequenceEqual(decryptionKey);
-
-// ////byte[] derivedKey = deriver.DeriveKey(password, salt);
-// //string? encrypted = encryptor.Encrypt(password, derivedKey);
-
-// //var storedSalt = Convert.ToBase64String(salt);
-
-
-// //byte[] derivedKey2 = deriver.DeriveKey(password, salt);
-
-// //var d = decryptor.Decrypt(encrypted, derivedKey2);
-
-// // Generate a hash
-// //string hash = hasher.HashPassword(password);
-
-// //string[] parts = hash.Split(':');
-
-// //// Store the salt only
-// //string storedSalt = parts[0];
-
-// //// Use the hash as the password
-// //string storedHash = parts[1];
-
-// //context.Database.SetConnectionString($"Data Source={Path.Combine(environment.ContentRootPath, name)}.vault;Mode=ReadWriteCreate;Password={storedHash}");
-// //await context.Database.EnsureCreatedAsync();
-
-// return true;
-// }
-// }
-
-// return false;
-// }
-//}
\ No newline at end of file
diff --git a/Bitvault/Document.cs b/Bitvault/Document.cs
new file mode 100644
index 0000000..82426ad
--- /dev/null
+++ b/Bitvault/Document.cs
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Bitvault;
+
+public record Document
+{
+ public byte[]? Blob { get; set; }
+
+ public DocumentType Type { get; set; }
+
+ [Key]
+ public int Id { get; set; }
+}
\ No newline at end of file
diff --git a/Bitvault/DocumentType.cs b/Bitvault/DocumentType.cs
new file mode 100644
index 0000000..fab272f
--- /dev/null
+++ b/Bitvault/DocumentType.cs
@@ -0,0 +1,7 @@
+namespace Bitvault;
+
+public enum DocumentType
+{
+ Form,
+ File
+}
\ No newline at end of file
diff --git a/Bitvault/Form.cs b/Bitvault/Form.cs
new file mode 100644
index 0000000..160fd76
--- /dev/null
+++ b/Bitvault/Form.cs
@@ -0,0 +1,6 @@
+namespace Bitvault;
+
+public record Form
+{
+ public ICollection? Entries { get; set;}
+}
\ No newline at end of file
diff --git a/Bitvault/FormEntry.cs b/Bitvault/FormEntry.cs
new file mode 100644
index 0000000..2b3325d
--- /dev/null
+++ b/Bitvault/FormEntry.cs
@@ -0,0 +1,3 @@
+namespace Bitvault;
+
+public record FormEntry;
\ No newline at end of file
diff --git a/Bitvault/FormField.cs b/Bitvault/FormField.cs
new file mode 100644
index 0000000..2082797
--- /dev/null
+++ b/Bitvault/FormField.cs
@@ -0,0 +1,12 @@
+namespace Bitvault;
+
+public record FormField : FormEntry
+{
+ public string? Name { get; set; }
+
+ public string? Description { get; set; }
+
+ public object? Value { get; set; }
+
+ public FormFieldType Type { get; set; }
+}
\ No newline at end of file
diff --git a/Bitvault/FormFieldType.cs b/Bitvault/FormFieldType.cs
new file mode 100644
index 0000000..d6f6801
--- /dev/null
+++ b/Bitvault/FormFieldType.cs
@@ -0,0 +1,16 @@
+namespace Bitvault;
+
+public enum FormFieldType
+{
+ Attachments,
+ Date,
+ Masked,
+ Note,
+ Number,
+ Options,
+ Password,
+ Phone,
+ Text,
+ Time,
+ Url
+}
diff --git a/Bitvault/FormGroup.cs b/Bitvault/FormGroup.cs
new file mode 100644
index 0000000..730b15e
--- /dev/null
+++ b/Bitvault/FormGroup.cs
@@ -0,0 +1,8 @@
+namespace Bitvault;
+
+public record FormGroup : FormEntry
+{
+ public string? Name { get; set; }
+
+ public ICollection? Fields { get; set; }
+}
\ No newline at end of file
diff --git a/Bitvault/Locker.cs b/Bitvault/Locker.cs
index 85d722e..92300fb 100644
--- a/Bitvault/Locker.cs
+++ b/Bitvault/Locker.cs
@@ -8,4 +8,14 @@ public record Locker
public int Id { get; set; }
public string? Name { get; set; }
-}
+
+ public string? Description { get; set; }
+
+ public int State { get; set; }
+
+ public ICollection? Tags { get; }
+
+ public Category? Category { get; }
+
+ public ICollection? Documents { get; }
+}
\ No newline at end of file
diff --git a/Bitvault/LockerNavigationViewModel.cs b/Bitvault/LockerNavigationViewModel.cs
index 5039732..ab6ab9a 100644
--- a/Bitvault/LockerNavigationViewModel.cs
+++ b/Bitvault/LockerNavigationViewModel.cs
@@ -7,5 +7,9 @@ public class LockerNavigationViewModel(IServiceProvider provider,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
- IDisposer disposer) :
- ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
\ No newline at end of file
+ IDisposer disposer,
+ IContentTemplate template) :
+ ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer)
+{
+ public IContentTemplate Template { get; set; } = template;
+}
\ No newline at end of file
diff --git a/Bitvault/VaultNavigationViewModelHandler.cs b/Bitvault/MainViewModelHandler.cs
similarity index 93%
rename from Bitvault/VaultNavigationViewModelHandler.cs
rename to Bitvault/MainViewModelHandler.cs
index 31c61f7..49e3e99 100644
--- a/Bitvault/VaultNavigationViewModelHandler.cs
+++ b/Bitvault/MainViewModelHandler.cs
@@ -3,7 +3,7 @@ using Toolkit.Foundation;
namespace Bitvault;
-public class VaultNavigationViewModelHandler(IPublisher publisher,
+public class MainViewModelHandler(IPublisher publisher,
IVaultHostCollection vaults) :
INotificationHandler>
{
diff --git a/Bitvault/ManageNavigationViewModel.cs b/Bitvault/ManageNavigationViewModel.cs
index 471caf5..fa940e8 100644
--- a/Bitvault/ManageNavigationViewModel.cs
+++ b/Bitvault/ManageNavigationViewModel.cs
@@ -2,11 +2,33 @@
namespace Bitvault;
-public partial class ManageNavigationViewModel :
- ObservableViewModel,
- IMainNavigationViewModel
+public partial class ManageNavigationViewModel(IServiceProvider provider,
+ IServiceFactory factory,
+ IMediator mediator,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
+ IMainNavigationViewModel;
+
+public partial class VaultCommandViewModel : ObservableCollectionViewModel
{
- public ManageNavigationViewModel(IServiceProvider provider,
+ public VaultCommandViewModel(IServiceProvider provider,
+ IServiceFactory factory,
+ IMediator mediator,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
+ {
+ Add();
+ Add();
+ }
+}
+
+public partial class SearchVaultCommandViewModel :
+ ObservableCollectionViewModel
+{
+ public SearchVaultCommandViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
@@ -14,4 +36,17 @@ public partial class ManageNavigationViewModel :
IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
}
+}
+
+public partial class CreateLockerCommandViewModel :
+ ObservableCollectionViewModel
+{
+ public CreateLockerCommandViewModel(IServiceProvider provider,
+ IServiceFactory factory,
+ IMediator mediator,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
+ {
+ }
}
\ No newline at end of file
diff --git a/Bitvault/StarredNavigationViewModel.cs b/Bitvault/StarredNavigationViewModel.cs
index 27b2f7f..79f28f2 100644
--- a/Bitvault/StarredNavigationViewModel.cs
+++ b/Bitvault/StarredNavigationViewModel.cs
@@ -1,12 +1,21 @@
-using Toolkit.Foundation;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+using Toolkit.Foundation;
namespace Bitvault;
-public class StarredNavigationViewModel(IServiceProvider provider,
+public partial class StarredNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
- IVaultNavigationViewModel;
\ No newline at end of file
+ IVaultNavigationViewModel
+{
+ [ObservableProperty]
+ private bool selected;
+
+ [RelayCommand]
+ public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Starred")));
+}
\ No newline at end of file
diff --git a/Bitvault/Tag.cs b/Bitvault/Tag.cs
new file mode 100644
index 0000000..20d84f4
--- /dev/null
+++ b/Bitvault/Tag.cs
@@ -0,0 +1,11 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Bitvault;
+
+public class Tag
+{
+ [Key]
+ public int Id { get; set; }
+
+ public string? Name { get; set; }
+}
diff --git a/Bitvault/VaultCategory.cs b/Bitvault/VaultCategory.cs
new file mode 100644
index 0000000..eecc42e
--- /dev/null
+++ b/Bitvault/VaultCategory.cs
@@ -0,0 +1,3 @@
+namespace Bitvault;
+
+public record VaultCategory(string Name);
diff --git a/Bitvault/VaultDbContext.cs b/Bitvault/VaultDbContext.cs
index 505a894..cac68d9 100644
--- a/Bitvault/VaultDbContext.cs
+++ b/Bitvault/VaultDbContext.cs
@@ -2,12 +2,25 @@
namespace Bitvault;
-public class VaultDbContext: DbContext
+public class VaultDbContext(DbContextOptions options) :
+ DbContext(options)
{
+ public DbSet Categories { get; set; }
+
+ public DbSet Documents { get; set; }
+
public DbSet Lockers { get; set; }
- public VaultDbContext(DbContextOptions options): base(options)
- {
+ public DbSet Tags { get; set; }
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ modelBuilder.Entity()
+ .HasMany(x => x.Tags)
+ .WithOne();
+
+ modelBuilder.Entity()
+ .HasMany(x => x.Documents)
+ .WithOne();
}
}
diff --git a/Bitvault/VaultViewModel.cs b/Bitvault/VaultViewModel.cs
index bf00c75..4fc8b61 100644
--- a/Bitvault/VaultViewModel.cs
+++ b/Bitvault/VaultViewModel.cs
@@ -2,10 +2,14 @@
namespace Bitvault;
-public class VaultViewModel(IServiceProvider provider,
+[Notification(nameof(VaultViewModel))]
+public partial class VaultViewModel(IServiceProvider provider,
IServiceFactory factory,
- IMediator mediator,
- IPublisher publisher,
+ IMediator mediator,
+ IPublisher publisher,
ISubscriber subscriber,
- IDisposer disposer) :
- ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
\ No newline at end of file
+ IDisposer disposer,
+ IContentTemplate template) : ObservableCollectionViewModel(provider, factory, mediator, publisher, subscriber, disposer)
+{
+ public IContentTemplate Template { get; set; } = template;
+}
\ No newline at end of file
diff --git a/Bitvault/VaultViewModelHandler.cs b/Bitvault/VaultViewModelHandler.cs
new file mode 100644
index 0000000..24bce70
--- /dev/null
+++ b/Bitvault/VaultViewModelHandler.cs
@@ -0,0 +1,21 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class VaultViewModelHandler(IServiceFactory factory,
+ IPublisher publisher) :
+ INotificationHandler>
+{
+ public async Task Handle(Enumerate args,
+ CancellationToken cancellationToken = default)
+ {
+ for (int i = 0; i < 5000; i++)
+ {
+ if (factory.Create() is LockerNavigationViewModel viewModel)
+ {
+ await publisher.Publish(new Create(viewModel),
+ nameof(VaultViewModel), cancellationToken);
+ }
+ }
+ }
+}
\ No newline at end of file