Esempio n. 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);
        }
Esempio n. 2
0
        private bool AddFileFromNewFolderItem(HashSet <string> existedFiles, List <File> files, NewFolderItem item,
                                              File parent, DateTime created, bool autoFix)
        {
            if (!ValidateFileName(item.Name))
            {
                return(autoFix);
            }

            if (autoFix)
            {
                var key = DbcToSbc(item.Name).ToLower();
                if (existedFiles.Contains(key))
                {
                    return(true);
                }

                existedFiles.Add(key);
            }

            var file = new File
            {
                Type      = (int)FileType.Folder,
                Name      = item.Name,
                Created   = created,
                Modified  = created,
                Published = created
            };

            files.Add(file);
            if (parent != null)
            {
                file.Parent = parent;
                file.Path   = JoinPath(parent.Path, file.Name);
            }
            else
            {
                file.Path = PathSep + file.Name;
            }

            if (item.Children != null && item.Children.Count > 0)
            {
                var existedChildren = autoFix ? new HashSet <string>() : null;
                foreach (var c in item.Children)
                {
                    if (!AddFileFromNewFolderItem(existedChildren, files, c, file, created, autoFix))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Esempio n. 3
0
        public override async Task <FileReply> Add(AddRequest request, ServerCallContext context)
        {
            var reply = new FileReply();
            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);
            }

            if (!ValidateFileName(request.Name))
            {
                reply.Error = Error.InvalidArguments;
                return(reply);
            }

            var file = new File
            {
                Type = (int)request.FileType, Name = request.Name, Created = DateTime.Now, Modified = DateTime.Now
            };

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

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

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

                file.Parent = parent;
                file.Path   = JoinPath(parent.Path, file.Name);
            }
            else
            {
                file.Path = PathSep + file.Name;
            }

            using (var trans = _service.Context.BeginTransaction())
            {
                file = await _service.Add(file);

                if (file.Type == (int)FileType.Normal && file.Parent != null &&
                    file.Parent.Type == (int)FileType.Folder)
                {
                    file.Parent.Weight = (file.Parent.Weight ?? 0) + 1;
                    await _service.Update(file.Parent);
                    await ClearFolderVersionsCache();
                }
                else if (file.Type == (int)FileType.Folder)
                {
                    await ClearFolderVersionsCache();
                }
                if (file.Type == (int)FileType.Normal)
                {
                    await ClearFileWeightsCache(file.Path);
                }

                await trans.Commit();
            }

            reply.File = Converter(file);
            return(reply);
        }
Esempio n. 4
0
        public override async Task <ResourceReply> AddResource(AddResourceRequest request, ServerCallContext context)
        {
            var reply = new ResourceReply();
            var type  = GetContentType(request.Type);
            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);
            }

            if (!Guid.TryParse(request.ParentId, out var id))
            {
                reply.Error = Error.InvalidArguments;
                return(reply);
            }

            var parent = await _service.All().Where(i => i.Id == id).FirstOrDefaultAsync();

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

            var file = new File
            {
                Type      = (int)FileType.Resource,
                Name      = Guid.NewGuid().ToString(),
                Parent    = parent,
                Created   = DateTime.Now,
                Modified  = DateTime.Now,
                Published = DateTime.Now,
                Private   = (ulong)request.Private
            };

            file.Path = JoinPath(parent.Path, file.Name);
            if (!string.IsNullOrWhiteSpace(request.TextContent))
            {
                file.Content = await _contentService.Add(_resourcesGroup, request.TextContent);
            }
            else
            {
                file.Content = await _contentService.Add(_resourcesGroup, stream =>
                {
                    request.Content.WriteTo(stream);
                    return(Task.FromResult(true));
                }, string.IsNullOrWhiteSpace(type)?null : type);
            }

            file = await _service.Add(file);

            reply.Id        = file.Id.ToString();
            reply.ContentId = file.Content;
            return(reply);
        }