using Bitvault.Data; using LinqKit; using Microsoft.EntityFrameworkCore; using Toolkit.Foundation; namespace Bitvault; public class QueryItemHandler(IDbContextFactory dbContextFactory) : IHandler, (int Id, string? Name)> { public Task<(int Id, string? Name)> Handle(RequestEventArgs args, CancellationToken cancellationToken) { throw new NotImplementedException(); } } public record QueryItemConfiguration { public int Id { get; set; } } public class QueryContainerHandler(IDbContextFactory dbContextFactory) : IHandler, IReadOnlyCollection<(int Id, string? Name, bool Favourite, bool Archived)>> { public async Task> Handle(RequestEventArgs args, CancellationToken cancellationToken) { List<(int Id, string? Name, bool Favourite, bool Archived)> items = []; if (args.Value is QueryContainerConfiguration 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 ContainerDbContext context = dbContextFactory.CreateDbContext(); return await context.Set().Where(predicate).Select(x => new { x.Id, x.Name, Favourite = x.State == 1, Archived = x.State == 2 }).OrderBy(x => x.Name).ToListAsync(); }); foreach (var result in results) { items.Add(new(result.Id, result.Name, result.Favourite, result.Archived)); } } return items; } }