public async Task <IReadOnlyList <TodoDto> > Handle(ListSharedTodosQuery request, CancellationToken cancellationToken) { var currentAccount = await accountProvider.GetCurrentAsync(cancellationToken); var todos = await customDbContext.Todos .AsNoTracking() .Where(todo => !todo.Archived) .OrderBy(t => t.Completed ? 1 : 0) .ThenByDescending(t => EF.Property <int>(t.Priority, "priority")) .Include(t => t.accountsThatCanEdit) .Include(t => t.accountsThatCanView) .ToListAsync(cancellationToken); var todoDtosViews = todos .Where(t => t.CanViewOnly(currentAccount)) .Skip(request.Offset) .Take(request.Limit) .Select(todo => new TodoDto(todo.Id.ToGuid(), todo.Name, todo.Priority.ToInt32(), todo.Completed, todo.GroupId, true)); var todoDtosEdit = todos .Where(t => t.CanEditOnly(currentAccount)) .Skip(request.Offset) .Take(request.Limit) .Select(todo => new TodoDto(todo.Id.ToGuid(), todo.Name, todo.Priority.ToInt32(), todo.Completed, todo.GroupId, false)); return(todoDtosEdit.Union(todoDtosViews).ToList().AsReadOnly()); }
public async Task <ActionResult <IEnumerable <TodoDto> > > GetAsListAsync(int limit, int offset, bool listShared, Guid?groupId) { IRequest <IReadOnlyList <TodoDto> > query; if (groupId.HasValue) { query = new ListTodosByGroupQuery(groupId.Value, limit, offset); } else if (listShared) { query = new ListSharedTodosQuery(limit, offset); } else { query = new ListTodosWithoutGroupQuery(limit, offset); } var todos = await requestSender.Send(query); return(Ok(todos)); }