示例#1
0
        public ResultModel DeleteFile(FileDeleteRequestModel param)
        {
            ResultModel result = new ResultModel();

            try
            {
                int?memberId = IdentityHelper.GetMemberId();
                if (!memberId.HasValue)
                {
                    throw new OrgException("Invalid MemberId");
                }

                if ((param == null) || String.IsNullOrWhiteSpace(param.fileId))
                {
                    throw new OrgException("Invalid file Id");
                }

                UploadBL bl = new UploadBL();

                bl.RemoveFile(memberId, param.fileId);

                result.Status  = true;
                result.Message = "Delete file successfully";
            }
            catch (OrgException oex)
            {
                result.Status  = false;
                result.Message = oex.Message;
            }
            catch (Exception ex)
            {
                result.Status  = false;
                result.Message = AppConfigs.InternalErrorMessage;

                if (AppConfigs.DebugInternalMessage)
                {
                    result.InternalMessage = ex.Message;
                }
            }

            return(result);
        }
示例#2
0
        public IActionResult DeleteFile([FromBody] FileDeleteRequestModel requestModel)
        {
            if (!(HttpContext.Items["actor"] is User loginUser))
            {
                throw new UnexpectedException();
            }

            var result = _databaseService.Files.AsQueryable();

            // 过滤掉未确认的文件
            result = result.Where(s => s.Status == EntityFile.FileStatus.Confirmed);

            // 注入用户权限
            if (loginUser.HasPermission(PermissionBank.StoragePermission("root", "root", "delete")) != true)
            {
                List <string> filter = new List <string>();
                filter.Add("everyone");

                if (loginUser.HasPermission(PermissionBank.StoragePermission("users", loginUser.Username, "delete")) != false)
                {
                    filter.Add($"users.{loginUser.Username}");
                }
                foreach (var groupToUser in loginUser.GroupToUser)
                {
                    var groupName = groupToUser.Group.GroupName;
                    if (loginUser.HasPermission(PermissionBank.StoragePermission("groups", groupName, "delete")) != false)
                    {
                        filter.Add($"groups.{groupName}");
                    }
                }

                var groups = loginUser.GroupToUser;
                foreach (var groupToUser in groups)
                {
                    var group       = groupToUser.Group;
                    var permissions = group.GroupToPermission;
                    foreach (var groupToPermission in permissions)
                    {
                        var permission = groupToPermission.Permission;

                        var permissionNode = permission.Split(".");

                        // storage.file.operation.{type}.{name}.{operation}

                        if ((permissionNode.Length == 6) && (permissionNode[0] == "storage") && (permissionNode[1] == "file") && (permissionNode[2] == "operation"))
                        {
                            var type      = permissionNode[3];
                            var name      = permissionNode[4];
                            var operation = permissionNode[5];
                            if (operation != "list")
                            {
                                continue;
                            }

                            switch (type)
                            {
                            case "users":
                                filter.Add($"users.{name}");
                                break;

                            case "groups":
                                filter.Add($"groups.{name}");
                                break;
                            }
                        }
                    }
                }

                result = result.Where(s => filter.Contains(s.Permission));
            }

            // 按文件夹查找
            if (!string.IsNullOrEmpty(requestModel.Folder))
            {
                requestModel.Folder = requestModel.Folder.Replace("\\", "/");
                result = result.Where(s => s.Folder == requestModel.Folder);
            }

            // 按路径前缀查找
            if (!string.IsNullOrEmpty(requestModel.PathPrefix))
            {
                requestModel.PathPrefix = requestModel.PathPrefix.Replace("\\", "/");
                result = result.Where(s => s.Folder.StartsWith(requestModel.PathPrefix));
            }

            // 按路径包含内容查找
            if (requestModel.PathContains?.Length > 0)
            {
                result = requestModel.PathContains.Aggregate(result,
                                                             (current, t) => current.Where(s => s.Path.Contains(t)));
            }

            // 按文件名包含内容查找
            if (requestModel.NameContains?.Length > 0)
            {
                result = requestModel.NameContains.Aggregate(result,
                                                             (current, t) => current.Where(s => s.Name.Contains(t)));
            }

            // 按照文件类型查找
            if (requestModel.Type?.Length > 0)
            {
                result = result.Where(s => requestModel.Type.Contains(s.Type));
            }

            // 按照路径全字匹配
            if (requestModel.Path?.Length > 0)
            {
                result = result.Where(s => requestModel.Path.Contains(s.Path));
            }

            // 按照 ID 匹配
            if (requestModel.Id?.Length > 0)
            {
                result = result.Where(s => requestModel.Id.Contains(s.Id));
            }

            // 按照 Guid 匹配
            if (requestModel.Guid?.Length > 0)
            {
                result = result.Where(s => requestModel.Guid.Contains(s.Guid));
            }

            // TODO 按照用户权限添加筛选

            // 添加其他的搜索条件

            result = result.Skip(requestModel.Offset);
            result = result.Take(requestModel.Amount);

            var count = 0L;

            var nonDirectory = result.Where(s => s.Type != "text/directory");

            count += nonDirectory.Count();
            _databaseService.Files.RemoveRange(nonDirectory);
            _databaseService.SaveChanges();

            var directorys = result.Where(s => s.Type == "text/directory").ToList();

            foreach (var s in directorys)
            {
                var p = s.Path;
                p = Path.EndsInDirectorySeparator(p) ? p : p + "/";
                var delete = _databaseService.Files.Where(s => s.Path.StartsWith(p));
                count += delete.Count();
                _databaseService.Files.RemoveRange(delete);
                _databaseService.SaveChanges();

                p      = p.Remove(p.Length - 1);
                delete = _databaseService.Files.Where(s => s.Path == p);
                count += delete.Count();
                _databaseService.Files.RemoveRange(delete);
                _databaseService.SaveChanges();
            }

            return(Ok(new FileDeleteResultModel(count)));
        }