Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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 }));
        }