コード例 #1
0
        public override async Task <FilesReply> AddFolders(AddFoldersRequest request, ServerCallContext context)
        {
            var reply = new FilesReply();
            var user  = await _userService.GetUser(context.GetHttpContext());

            if (user == null)
            {
                reply.Error = Error.NeedLogin;
                return(reply);
            }

            if (!user.HasWritePermission())
            {
                reply.Error = Error.NoPermission;
                return(reply);
            }

            File parent = null;

            if (!string.IsNullOrWhiteSpace(request.ParentId))
            {
                if (!Guid.TryParse(request.ParentId, out var parentId))
                {
                    reply.Error = Error.NoSuchEntity;
                    return(reply);
                }

                parent = await _service.All()
                         .FirstOrDefaultAsync(f => f.Id == parentId && f.Type == (int)FileType.Folder);

                if (parent == null)
                {
                    reply.Error = Error.NoSuchEntity;
                    return(reply);
                }
            }

            var now          = DateTime.Now;
            var files        = new List <File>();
            var autoFix      = request.AutoFix;
            var existedFiles = autoFix ? new HashSet <string>() : null;

            foreach (var f in request.Folders)
            {
                if (!AddFileFromNewFolderItem(existedFiles, files, f, parent, now, autoFix))
                {
                    reply.Error = Error.InvalidArguments;
                    return(reply);
                }
            }

            await _service.AddRange(files);

            await ClearFolderVersionsCache();

            reply.Files.AddRange(files.Select(Converter));
            return(reply);
        }
コード例 #2
0
        public override async Task <FilesReply> GetFiles(GetFilesRequest request, ServerCallContext context)
        {
            var reply = new FilesReply();
            var items = _service.All().Where(f => f.Type == (int)FileType.Normal);

            if (!string.IsNullOrWhiteSpace(request.ParentId))
            {
                if (!Guid.TryParse(request.ParentId, out var folderId))
                {
                    reply.Error = Error.NoSuchEntity;
                    return(reply);
                }

                var folder = await _service.All().Where(k => k.Id == folderId && k.Type == (int)FileType.Folder)
                             .FirstOrDefaultAsync();

                if (folder == null)
                {
                    reply.Error = Error.NoSuchEntity;
                    return(reply);
                }

                var pathPrefix = folder.Path + PathSep;
                items = items.Where(f => f.Path.StartsWith(pathPrefix));
            }

            var readPrivate = (await _userService.GetUser(context.GetHttpContext())).HasReadPrivatePermission();

            if (!readPrivate)
            {
                items = items.Where(i => i.Private == (ulong)PrivateType.Public);
            }

            int?total = null;

            if (request.Skip > 0)
            {
                total = await items.CountAsync();

                items = items.Skip(request.Skip);
            }

            if (request.Take > 0)
            {
                items = items.Take(request.Take);
            }

            reply.Files.AddRange(await items
                                 .Select(Selector)
                                 .ToArrayAsync());
            if (total.HasValue)
            {
                reply.Total = total.Value;
            }

            return(reply);
        }
コード例 #3
0
        private async Task <FilesReply> GetFoldersInternal()
        {
            var reply = new FilesReply();

            reply.Files.AddRange(await _service.All()
                                 .Where(f => f.Type == (int)FileType.Folder)
                                 .Select(Selector)
                                 .ToArrayAsync());
            return(reply);
        }
コード例 #4
0
        public override async Task <FilesReply> GetFolders(Empty request, ServerCallContext context)
        {
            var version = await _cache.GetStringAsync(FoldersVersionCacheKey);

            if (string.IsNullOrWhiteSpace(version) || !await _contentService.Existed(version))
            {
                var reply = await UpdateFolderVersionsCache();

                return(reply);
            }
            else
            {
                var reply = new FilesReply {
                    Version = version
                };
                return(reply);
            }
        }
コード例 #5
0
        public override async Task <FilesReply> Query(QueryRequest request, ServerCallContext context)
        {
            var reply       = new FilesReply();
            var query       = request.Query;
            var parentPaths = default(FileParentId[]);

            if (!string.IsNullOrWhiteSpace(query.Parent))
            {
                var indexedParentPath = query.Parent !;
                parentPaths = await _service.All()
                              .Where(n => n.Type == (int)FileType.Folder && n.Path == indexedParentPath).Select(
                    n => new FileParentId {
                    Path = n.Path + PathSep
                }
                    ).ToArrayAsync();

                if (!parentPaths.Any())
                {
                    return(null);
                }
            }

            Expression <Func <File, bool> > queryFunc;

            try
            {
                queryFunc = _queryCompiler.Compile(parentPaths, query);
            }
            catch
            {
                reply.Error = Error.InvalidArguments;
                return(reply);
            }

            var items = _service.All().Where(queryFunc);

            items = await FilterPrivate(items, context);

            var filter = request.Filter;

            if (!string.IsNullOrWhiteSpace(filter))
            {
                filter = filter !.Trim();
                items  = items.Where(n =>
                                     n.Path !.Contains(filter, StringComparison.CurrentCultureIgnoreCase));
            }

            var randomOrder = query.OrderBy == "Random";
            int?total       = null;

            if (randomOrder)
            {
                total = await items.CountAsync();

                var skip = total.Value - request.Take + 1;
                if (skip > 0)
                {
                    skip  = new Random().Next() % skip;
                    items = items.Skip(skip);
                }

                if (request.Take > 0)
                {
                    items = items.Take(request.Take);
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(query.OrderBy))
                {
                    Expression <Func <File, object> > orderBy = default;
                    switch (query.OrderBy)
                    {
                    case nameof(File.Name):
                        orderBy = node => node.Name !;
                        break;

                    case nameof(File.Created):
                        orderBy = node => node.Created;
                        break;

                    case nameof(File.Modified):
                        orderBy = node => node.Modified;
                        break;

                    case nameof(File.Published):
                        orderBy = node => node.Published;
                        break;
                    }

                    if (orderBy == null)
                    {
                        reply.Error = Error.InvalidArguments;
                        return(reply);
                    }

                    items = query.OrderByDesc ? items.OrderByDescending(orderBy) : items.OrderBy(orderBy);
                }

                if (request.Skip > 0 || request.Take > 0)
                {
                    total = await items.CountAsync();
                }

                if (request.Skip > 0)
                {
                    items = items.Skip(request.Skip);
                }

                if (request.Take > 0)
                {
                    items = items.Take(request.Take);
                }
            }

            var files = await items
                        .Select(Selector)
                        .ToArrayAsync();

            reply.Files.AddRange(files);
            if (total.HasValue)
            {
                reply.Total = total.Value;
            }

            return(reply);
        }