public async Task <IEnumerable <StorageItem> > GetWithQueryAsync(StorageItemQuery query, CancellationToken cancellationToken) { if (query.FlattenAllDescendants && query.ParentId != null) { return(await GetWithQueryRecursively(query, cancellationToken)); } return(await GetWithQuerySimple(query, cancellationToken)); }
private Task <IEnumerable <StorageItem> > GetWithQueryRecursively(StorageItemQuery query, CancellationToken cancellationToken) { var filteredItems = new List <StorageItem>(); var items = m_dbContext.StorageItems .Where(x => x.DriveId == m_driveId && x.ParentId == query.ParentId) .ToList(); FilterItemsRecursively(items, query, filteredItems); return(Task.FromResult((IEnumerable <StorageItem>)filteredItems)); }
private async Task <IEnumerable <StorageItem> > GetWithQuerySimple( StorageItemQuery query, CancellationToken cancellationToken) { var dbQuery = m_dbContext.StorageItems.Where(x => x.DriveId == m_driveId); if (query != null) { dbQuery = dbQuery.Where(x => (query.FlattenAllDescendants || x.ParentId == query.ParentId) && (query.States == null || query.States.Length == 0 || query.States.Contains(x.State)) && (query.IsTrashedExplicitly == null || query.IsTrashedExplicitly == x.TrashedExplicitly)); } return(await dbQuery.ToListAsync(cancellationToken)); }
private void FilterItemsRecursively(IEnumerable <StorageItem> itemsToFilter, StorageItemQuery query, ICollection <StorageItem> filteredItems) { foreach (var itemToFilter in itemsToFilter) { if (query.States == null || query.States.Length == 0 || query.States.Contains(itemToFilter.State)) { filteredItems.Add(itemToFilter); } if (itemToFilter is not Folder folder) { continue; } m_dbContext.Entry(folder) .Collection(x => x.Children) .Load(); FilterItemsRecursively(folder.Children, query, filteredItems); } }
public async Task <ActionResult <dynamic> > GetFiles( [FromRoute, ModelBinder] IDriveScopeFactory driveScopeFactory, [FromQuery] StorageItemQuery query, CancellationToken cancellationToken) { using var driveScope = driveScopeFactory.CreateInstance(); IEnumerable <dynamic> parentsResult; if (query.ParentId == null) { parentsResult = Array.Empty <Folder>(); } else { var directFolder = await driveScope.StorageItems.GetAsync((Guid)query.ParentId, cancellationToken); if (directFolder == null || directFolder.GetType() != typeof(Folder)) { return(BadRequest($"No folder found with id '{query.ParentId}'.")); } var parents = (await driveScope.StorageItems.GetParentsAsync(directFolder, cancellationToken)).ToList(); parents.Insert(0, (Folder)directFolder); parentsResult = parents.Select(p => new { p.Id, p.DriveId, p.Name, p.ParentId }); } var items = await driveScope.StorageItems.GetWithQueryAsync(query, cancellationToken); var itemsResult = items.Select(i => new { i.Id, i.DriveId, i.ParentId, i.Name, i.TimeCreated, i.Size, i.State, i.Trashed, i.TrashedExplicitly, i.TrashedTime, Type = i.GetType().ToString(), i.RowVersion }); return(Ok(new { Parents = parentsResult, Items = itemsResult })); }