public async Task <IEnumerable <AssetAggregate> > Search(SearchAssetsParameter parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            using (var serviceScope = _serviceProvider.GetRequiredService <IServiceScopeFactory>().CreateScope())
            {
                using (var context = serviceScope.ServiceProvider.GetService <HierarchicalResourceDbContext>())
                {
                    IQueryable <Asset> assets = context.Assets
                                                .Include(a => a.Children)
                                                .Include(a => a.Parent);
                    if (parameter.HashLst != null && parameter.HashLst.Any())
                    {
                        assets = assets.Where(a => parameter.HashLst.Contains(a.Hash));
                    }

                    if (parameter.ExcludedHashLst != null && parameter.ExcludedHashLst.Any())
                    {
                        assets = assets.Where(a => !parameter.ExcludedHashLst.Contains(a.Hash));
                    }

                    switch (parameter.AssetLevelType)
                    {
                    case AssetLevelTypes.ROOT:
                        assets = assets.Where(a => a.Parent == null);
                        break;
                    }

                    if (parameter.IsDefaultWorkingDirectory != null)
                    {
                        assets = assets.Where(a => a.IsDefaultWorkingDirectory == parameter.IsDefaultWorkingDirectory.Value);
                    }

                    if (parameter.Names != null && parameter.Names.Any())
                    {
                        assets = assets.Where(a => parameter.Names.Any(n => a.Name.Contains(n)));
                    }

                    var result = await assets.ToListAsync().ConfigureAwait(false);

                    return(result.Select(a => GetAsset(a)));
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#open
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteOpen(ElFinderParameter elFinderParameter)
        {
            if (!elFinderParameter.Init && string.IsNullOrWhiteSpace(elFinderParameter.Target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var            assets        = new List <AssetAggregate>();
            AssetAggregate rootDirectory = null;

            if (!string.IsNullOrWhiteSpace(elFinderParameter.Target)) // Search the target.
            {
                rootDirectory = await _assetRepository.Get(elFinderParameter.Target);
            }

            if (elFinderParameter.Init || rootDirectory == null) // Returns the default root directory of the default volume.
            {
                var searchRootParameter = new SearchAssetsParameter
                {
                    AssetLevelType            = AssetLevelTypes.ROOT,
                    IsDefaultWorkingDirectory = true
                };
                rootDirectory = (await _assetRepository.Search(searchRootParameter)).First();
            }

            assets.Add(rootDirectory);
            foreach (var child in rootDirectory.Children)
            {
                assets.Add(child);
            }

            if (elFinderParameter.Tree)
            {
                var searchRootParameter = new SearchAssetsParameter // Search all the roots.
                {
                    AssetLevelType  = AssetLevelTypes.ROOT,
                    ExcludedHashLst = assets.Select(a => a.Hash)
                };
                var searchResult = await _assetRepository.Search(searchRootParameter);

                foreach (var record in searchResult)
                {
                    assets.Add(record);
                    foreach (var child in record.Children)
                    {
                        if (assets.Any(a => a.Hash == child.Hash))
                        {
                            continue;
                        }
                        assets.Add(child);
                    }
                }
                if (!string.IsNullOrWhiteSpace(elFinderParameter.Target)) // Search the parents.
                {
                    var parents = await _assetRepository.GetAllParents(elFinderParameter.Target);

                    foreach (var parent in parents)
                    {
                        if (!assets.Any(a => a.Hash == parent.Hash))
                        {
                            assets.Add(parent);
                        }

                        foreach (var child in parent.Children)
                        {
                            if (assets.Any(a => a.Hash == child.Hash))
                            {
                                continue;
                            }
                            assets.Add(child);
                        }
                    }
                }
            }

            var files = new JArray();

            foreach (var asset in assets)
            {
                files.Add(GetFile(asset));
            }

            var result = new JObject(); // 3. Return the result.

            if (elFinderParameter.Init)
            {
                result.Add(Constants.ElFinderResponseNames.Api, "2.1");
            }

            var opts = new JObject();

            opts.Add(Constants.ElFinderOptionNames.Disabled, new JArray(new[] { "chmod" }));
            opts.Add(Constants.ElFinderOptionNames.Separator, Constants.PathSeparator);
            opts.Add(Constants.ElFinderOptionNames.Path, rootDirectory.Path);
            result.Add(Constants.ElFinderResponseNames.UplMaxSize, "0");
            result.Add(Constants.ElFinderResponseNames.Cwd, GetFile(rootDirectory));
            result.Add(Constants.ElFinderResponseNames.Files, files);
            result.Add(Constants.ElFinderResponseNames.Options, opts);
            return(result);
        }