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))); } } }
/// <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); }