using Wallet.Data; using LinqKit; using Microsoft.EntityFrameworkCore; using Toolkit.Foundation; namespace Wallet; public class QueryWalletHandler(IDbContextFactory dbContextFactory) : IHandler>, IReadOnlyCollection<(Guid Id, string? Name, string Category, bool Favourite, bool Archived)>> { public async Task> Handle(QueryEventArgs> args,CancellationToken cancellationToken) { List<(Guid Id, string? Name, string Category, bool Favourite, bool Archived)> items = []; if (args.Value is Wallet<(string, string)> Wallet) { (string filter, string text) = Wallet.Value; ExpressionStarter predicate = PredicateBuilder.New(true); if (filter == "All") { predicate = predicate.And(x => x.State != 2); } if (filter == "Starred") { predicate = predicate.And(x => x.State != 2 && x.State == 1); } if (filter == "Archive") { predicate = predicate.And(x => x.State == 2); } if (text is { Length: > 0 }) { predicate = predicate.And(x => EF.Functions.Like(x.Name, $"%{text}%")); } using WalletContext context = await dbContextFactory.CreateDbContextAsync(cancellationToken); var results = await context.Set() .Where(predicate) .Select(x => new { x.Id, x.Name, x.Category, Favourite = x.State == 1, Archived = x.State == 2 }).ToListAsync(cancellationToken: cancellationToken); foreach (var result in results.OrderBy(x => x.Name, StringComparer.OrdinalIgnoreCase)) { items.Add(new(result.Id, result.Name, result.Category, result.Favourite, result.Archived)); } } return items; } }