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