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