diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index f00f90a..e917a00 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -51,7 +51,7 @@ public partial class App : Application services.TryAddSingleton, Container>(); services.TryAddSingleton, Container>(); - services.AddDbContextFactory((provider, args) => + services.AddDbContextFactory((provider, args) => { if (provider.GetRequiredService>() is IContainer connection) @@ -87,6 +87,8 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); + + services.AddHandler(); }); })!); @@ -94,7 +96,7 @@ public partial class App : Application services.AddHandler(); services.AddSingleton(); - services.AddInitializer(); + services.AddInitializer(); services.AddTemplate("Main"); services.AddHandler(); diff --git a/Bitvault.Avalonia/ContainerNavigationView.axaml b/Bitvault.Avalonia/ContainerNavigationView.axaml index 2e662fd..da91325 100644 --- a/Bitvault.Avalonia/ContainerNavigationView.axaml +++ b/Bitvault.Avalonia/ContainerNavigationView.axaml @@ -33,7 +33,6 @@ - options) : +public class ContainerDbContext(DbContextOptions options) : DbContext(options) { - public DbSet Categories { get; set; } - public DbSet Documents { get; set; } - public DbSet Items { get; set; } + public DbSet Items { get; set; } public DbSet Tags { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Entity() + modelBuilder.Entity() .HasMany(x => x.Tags) .WithOne(); - modelBuilder.Entity() + modelBuilder.Entity() .HasMany(x => x.Documents) .WithOne(); } diff --git a/Bitvault.Data/Content.cs b/Bitvault.Data/Item.cs similarity index 77% rename from Bitvault.Data/Content.cs rename to Bitvault.Data/Item.cs index 9c3f8c7..2031f90 100644 --- a/Bitvault.Data/Content.cs +++ b/Bitvault.Data/Item.cs @@ -3,7 +3,7 @@ using System.ComponentModel.DataAnnotations; namespace Bitvault.Data; -public record Content +public record Item { [Key] public int Id { get; set; } @@ -12,11 +12,9 @@ public record Content public string? Description { get; set; } - public int State { get; set; } + public int State { get; set; } = 0; public ICollection? Tags { get; } - public Category? Category { get; } - public ICollection? Documents { get; } } \ No newline at end of file diff --git a/Bitvault/AddItemActionViewModel.cs b/Bitvault/AddItemActionViewModel.cs index 5636cc8..fb4d563 100644 --- a/Bitvault/AddItemActionViewModel.cs +++ b/Bitvault/AddItemActionViewModel.cs @@ -1,5 +1,4 @@ using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; using Toolkit.Foundation; namespace Bitvault; @@ -15,7 +14,4 @@ public partial class AddItemActionViewModel(IServiceProvider provider, [ObservableProperty] private string named = $"{named}"; - - [RelayCommand] - public async Task Invoke() => await Publisher.Publish(new Test()); } \ No newline at end of file diff --git a/Bitvault/AddItemViewModel.cs b/Bitvault/AddItemViewModel.cs index fc36087..2ad3847 100644 --- a/Bitvault/AddItemViewModel.cs +++ b/Bitvault/AddItemViewModel.cs @@ -5,7 +5,7 @@ namespace Bitvault; public partial class AddItemViewModel : ObservableCollectionViewModel, - INotificationHandler + INotificationHandler> { [ObservableProperty] private string named; @@ -27,7 +27,7 @@ public partial class AddItemViewModel : public IContentTemplate Template { get; set; } - public Task Confirm() + public async Task Handle(Confirm args, CancellationToken cancellationToken = default) { ItemConfiguration configuration = new(); foreach (IItemViewModel item in this) @@ -35,11 +35,6 @@ public partial class AddItemViewModel : item.Invoke(configuration); } - return Task.FromResult(true); - } - - public Task Handle(Test args, CancellationToken cancellationToken = default) - { - return Task.CompletedTask; + await Mediator.Handle, bool>(Create.As(configuration), cancellationToken); } } diff --git a/Bitvault/ConfirmItemActionViewModel.cs b/Bitvault/ConfirmItemActionViewModel.cs index 94073eb..cec56e1 100644 --- a/Bitvault/ConfirmItemActionViewModel.cs +++ b/Bitvault/ConfirmItemActionViewModel.cs @@ -3,8 +3,6 @@ using Toolkit.Foundation; namespace Bitvault; -public record Test; - public partial class ConfirmItemActionViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, @@ -12,6 +10,7 @@ public partial class ConfirmItemActionViewModel(IServiceProvider provider, ISubscriber subscriber, IDisposer disposer) : ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer) { + [RelayCommand] - public async Task Invoke() => await Publisher.Publish(new Test()); + public async Task Invoke() => await Publisher.Publish(Confirm.As()); } diff --git a/Bitvault/ContainerFactory.cs b/Bitvault/ContainerFactory.cs index 30e8475..2034992 100644 --- a/Bitvault/ContainerFactory.cs +++ b/Bitvault/ContainerFactory.cs @@ -17,8 +17,8 @@ public class ContainerFactory(IContainer connection, connection.Set(new ContainerConnection($"Data Source={Path.Combine(environment.ContentRootPath, name)}" + $".vault;Mode=ReadWriteCreate;Pooling=false;Password={Convert.ToBase64String(key.DecryptedKey)}")); - IDbContextFactory dbContextFactory = provider.GetRequiredService>(); - using VaultDbContext context = await dbContextFactory.CreateDbContextAsync(); + IDbContextFactory dbContextFactory = provider.GetRequiredService>(); + using ContainerDbContext context = await dbContextFactory.CreateDbContextAsync(); try { diff --git a/Bitvault/ContainerCollectionInitializer.cs b/Bitvault/ContainerInitializer.cs similarity index 82% rename from Bitvault/ContainerCollectionInitializer.cs rename to Bitvault/ContainerInitializer.cs index 485d449..74a5afe 100644 --- a/Bitvault/ContainerCollectionInitializer.cs +++ b/Bitvault/ContainerInitializer.cs @@ -2,7 +2,7 @@ namespace Bitvault; -public class ContainerCollectionInitializer(IEnumerable> configurations, +public class ContainerInitializer(IEnumerable> configurations, IComponentFactory componentFactory, IContainerHostCollection vaults) : IInitializer { diff --git a/Bitvault/ContainerViewModel.cs b/Bitvault/ContainerViewModel.cs index 4b5d724..e8118b2 100644 --- a/Bitvault/ContainerViewModel.cs +++ b/Bitvault/ContainerViewModel.cs @@ -36,16 +36,16 @@ public partial class ContainerViewModel(IServiceProvider provider, await base.Deactivated(); } - public async Task Handle(SecureStorage> args, - CancellationToken cancellationToken = default) + public async Task Handle(SecureStorage> args, + CancellationToken cancellationToken = default) + { + if (args.Value is Filter filter) { - if (args.Value is Filter filter) - { - Filter = filter.Value; - await Enumerate(); - } + Filter = filter.Value; + await Enumerate(); } + } - protected override IEnumerate PrepareEnumeration(object? key) => - Enumerate.With(new ContainerViewModelConfiguration { Filter = Filter }) with { Key = key }; + protected override IEnumerate PrepareEnumeration(object? key) => + Enumerate.With(new ContainerViewModelConfiguration { Filter = Filter }) with { Key = key }; } \ No newline at end of file diff --git a/Bitvault/ContainerViewModelHandler.cs b/Bitvault/ContainerViewModelHandler.cs index c18c146..8a7ca9a 100644 --- a/Bitvault/ContainerViewModelHandler.cs +++ b/Bitvault/ContainerViewModelHandler.cs @@ -1,47 +1,34 @@ -using Toolkit.Foundation; +using Bitvault.Data; +using Microsoft.EntityFrameworkCore; +using Toolkit.Foundation; namespace Bitvault; -public class ContainerViewModelHandler(IServiceFactory factory, +public class ContainerViewModelHandler(IDbContextFactory dbContextFactory, + IServiceFactory factory, IPublisher publisher) : INotificationHandler> { public async Task Handle(Enumerate args, CancellationToken cancellationToken = default) { - if (args.Options?.Filter is "All") + var items = await Task.Run(async () => { - for (int i = 0; i < 100; i++) - { - if (factory.Create("Name " + i, "Description " + 1) is ItemNavigationViewModel viewModel) - { - await publisher.Publish(new Create(viewModel), - nameof(ContainerViewModel), cancellationToken); - } - } - } + using ContainerDbContext context = dbContextFactory.CreateDbContext(); + return await context.Set().Select(x => new + { + x.Name, + x.State + }).Where(x => x.State != 3).ToListAsync(); - if (args.Options?.Filter is "Starred") - { - for (int i = 0; i < 10; i++) - { - if (factory.Create("Name " + i, "Description " + 1) is ItemNavigationViewModel viewModel) - { - await publisher.Publish(new Create(viewModel), - nameof(ContainerViewModel), cancellationToken); - } - } - } + }, cancellationToken); - if (args.Options?.Filter is "Archive") + foreach (var item in items) { - for (int i = 0; i < 1000; i++) + if (factory.Create(item.Name, "Description " + 1) is ItemNavigationViewModel viewModel) { - if (factory.Create("Name " + i, "Description " + 1) is ItemNavigationViewModel viewModel) - { - await publisher.Publish(new Create(viewModel), - nameof(ContainerViewModel), cancellationToken); - } + await publisher.Publish(new Create(viewModel), + nameof(ContainerViewModel), cancellationToken); } } } diff --git a/Bitvault/Item.cs b/Bitvault/Item.cs new file mode 100644 index 0000000..d7f47a2 --- /dev/null +++ b/Bitvault/Item.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record Item; diff --git a/Bitvault/ItemConfigurationHandler.cs b/Bitvault/ItemConfigurationHandler.cs new file mode 100644 index 0000000..a5fa2eb --- /dev/null +++ b/Bitvault/ItemConfigurationHandler.cs @@ -0,0 +1,35 @@ +using Bitvault.Data; +using Microsoft.EntityFrameworkCore; +using Toolkit.Foundation; + +namespace Bitvault; + +public class ItemConfigurationHandler(IDbContextFactory dbContextFactory) : + IHandler, bool> +{ + public async Task Handle(Create args, + CancellationToken cancellationToken) + { + if (args.Value is ItemConfiguration configuration) + { + try + { + await Task.Run(async () => + { + using ContainerDbContext context = dbContextFactory.CreateDbContext(); + + await context.AddAsync(new Data.Item { Name = configuration.Name }, cancellationToken); + await context.SaveChangesAsync(cancellationToken); + }, cancellationToken); + + return true; + } + catch + { + + } + } + + return false; + } +} diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index 92903d9..4a40816 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -13,8 +13,7 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, NamedComponent named, string name, string description) : - ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), - INotificationHandler + ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer) { [ObservableProperty] private string? description = description; @@ -28,9 +27,4 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, [ObservableProperty] private bool selected; public IContentTemplate Template { get; set; } = template; - - public Task Handle(Test args, CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } } \ No newline at end of file