using Bitvault.Data; using LinqKit; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation; namespace Bitvault; public class ContainerViewModelHandler(IDbContextFactory dbContextFactory, IServiceProvider serviceProvider, IPublisher publisher) : INotificationHandler> { public async Task Handle(Enumerate args, CancellationToken cancellationToken = default) { if (args.Options is ContainerViewModelConfiguration configuration) { ExpressionStarter predicate = PredicateBuilder.New(true); if (configuration.Filter == "All") { predicate = predicate.And(x => x.State != 3); } if (configuration.Filter == "Starred") { predicate = predicate.And(x => x.State != 3 && x.State == 2); } if (configuration.Filter == "Archive") { predicate = predicate.And(x => x.State == 3); } var items = await Task.Run(async () => { using ContainerDbContext context = dbContextFactory.CreateDbContext(); return await context.Set().Where(predicate).Select(x => new { x.Id, x.Name }).ToListAsync(); }, cancellationToken); foreach (var item in items) { IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); if (serviceFactory.Create(item.Id, item.Name, "Description " + 1) is ItemNavigationViewModel viewModel) { await publisher.Publish(new CreateEventArgs(viewModel), nameof(ContainerViewModel), cancellationToken); } } } } }