示例#1
0
        public HttpResponseMessage Update(string explorerInfo)
        {
            ExplorerInfoViewModel einfo = JsonConvert.DeserializeObject <ExplorerInfoViewModel>(explorerInfo);
            Guid   projectId;
            string folder;

            if (Guid.TryParse(einfo.ProjectId, out projectId) == true)
            {
                folder = ShqConstants.ProjectRootFolder + "\\" + einfo.ParentPath;
            }
            else
            {
                folder = ShqConstants.TemplateRootFolder + "\\" + einfo.ParentPath;
            }
            folder = new DirectoryInfo(Path.Combine(folder, "1b2cd8ab-6d6c-4a05-931b-e40607bd8b19")).Parent.FullName;//to workaround a issue the if path end with \ will fail

            string name    = einfo.Name + "." + einfo.Id.ToString();
            string oldName = einfo.OldName + "." + einfo.Id.ToString();

            switch (einfo.cmd)
            {
            case "createFolder":
            {
                var     fileSystemDriver = new FileSystemDriver();
                IDriver driver           = fileSystemDriver;
                var     root             = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(new DirectoryInfo(folder).Name);

                try
                {
                    driver.MakeDir(target, name);
                }
                finally
                {
                    if (Directory.Exists(Path.Combine(folder, name)))
                    {
                        db.ProjectFiles.Add(new ProjectFile
                            {
                                Id               = einfo.Id,
                                Name             = einfo.Name,
                                Level            = einfo.Level,
                                IsFolder         = true,
                                Path             = Path.Combine(folder, name),
                                CreatedById      = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId,
                                LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId
                            });
                    }
                }

                break;
            }

            case "delete":
            {
                var     fileSystemDriver = new FileSystemDriver();
                IDriver driver           = fileSystemDriver;
                folder = Path.Combine(folder, name);
                var root = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(new DirectoryInfo(folder).Name);

                driver.Remove(new string[] { target });
                var f = db.ProjectFiles.FirstOrDefault(item => item.Id == einfo.Id);
                if (f != null)
                {
                    f.Status           = 1;
                    f.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    f.LastModfiedTime  = DateTime.Now;
                }
                break;
            }

            case "rename":
            {
                var     fileSystemDriver = new FileSystemDriver();
                IDriver driver           = fileSystemDriver;
                var     root             = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(@"\" + oldName);

                driver.Rename(target, name);
                var f = db.ProjectFiles.FirstOrDefault(item => item.Id == einfo.Id);
                if (f != null)
                {
                    f.Name             = einfo.Name;
                    f.Path             = Path.Combine(Directory.GetParent(folder).FullName, name);
                    f.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    f.LastModfiedTime  = DateTime.Now;
                }
                break;
            }

            case "uploadFile":    //https://forums.asp.net/t/2104884.aspx?Uploading+a+file+using+webapi+C+
            {
                var fileSystemDriver = new FileSystemDriver();
                var root             = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(new DirectoryInfo(folder).Name);

                var    wrapper  = new HttpRequestWrapper(HttpContext.Current.Request);
                string fileName = wrapper.Files[0].FileName + "." + einfo.Id;
                try
                {
                    fileSystemDriver.Upload(target, wrapper.Files[0], fileName);
                }
                finally
                {
                    if (File.Exists(Path.Combine(folder, fileName)))
                    {
                        db.ProjectFiles.Add(new ProjectFile
                            {
                                Id               = einfo.Id,
                                Name             = wrapper.Files[0].FileName,
                                Level            = einfo.Level,
                                IsFolder         = false,
                                Path             = Path.Combine(folder, fileName),
                                CreatedById      = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId,
                                LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId
                            });
                    }
                }

                break;
            }

            case "dowloadFile":
            {
                folder = Path.Combine(folder, einfo.Name);
                if (File.Exists(folder) == false)
                {
                    return(new HttpResponseMessage(HttpStatusCode.NotFound));
                }

                //converting Pdf file into bytes array
                var dataBytes = System.IO.File.ReadAllBytes(folder);
                //adding bytes to memory stream
                var stream = new MemoryStream(dataBytes);

                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(stream.ToArray())
                };
                result.Content.Headers.ContentDisposition =
                    new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = einfo.Name
                };
                result.Content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/octet-stream");

                return(result);
            }
            }

            db.SaveChanges();

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
        public HttpResponseMessage Update(ExplorerInfoViewModel einfo)
        {
            WorkProject wp = null;
            string      folder;
            var         pro = db.Projects.FirstOrDefault(item => item.Id == einfo.ProjectId);
            Guid?       workProjectId;
            Guid        worktemplateid = Guid.Empty;

            if (pro != null)
            {
                if (ProjectHelper.HasReadAccess(pro) == false)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "No Access"));
                }

                if (einfo.cmd != "dowloadFile" && ProjectHelper.HasUpdateAccess(pro) == false)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "No Access"));
                }

                folder          = ShqConstants.ProjectRootFolder + "\\" + einfo.ProjectId + "\\" + einfo.TartgetPath;
                wp              = db.WorkProjects.FirstOrDefault(item => item.ProjectId == einfo.ProjectId);
                workProjectId   = wp.Id;
                worktemplateid  = wp.WorkProjectTemplateId;
                einfo.Privilege = 1;
            }
            else if (db.WorkProjectTemplates.FirstOrDefault(item => item.Id == einfo.ProjectId) != null)
            {
                if (HttpContext.Current.User.IsInRole(ShqConstants.AdministratorRole) == false)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "No Access"));
                }

                workProjectId   = null;
                worktemplateid  = einfo.ProjectId;
                einfo.Privilege = 0;
                folder          = ShqConstants.TemplateRootFolder + "\\" + worktemplateid + "\\" + einfo.TartgetPath;
            }
            else
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "projectId is not found"));
            }

            folder = new DirectoryInfo(Path.Combine(folder, "1b2cd8ab-6d6c-4a05-931b-e40607bd8b19")).Parent.FullName;//to workaround a issue the if path end with \ will fail

            if (CheckIfParentExistInDb(folder) == false)
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "The parent folder is not found in the db"));
            }

            string name    = einfo.Name + "." + einfo.Id.ToString();
            string oldName = einfo.OldName + "." + einfo.Id.ToString();

            switch (einfo.cmd)
            {
            case "createFolder":
            {
                if (string.IsNullOrEmpty(einfo.Name) == true)
                {
                    break;
                }

                var     fileSystemDriver = new FileSystemDriver();
                IDriver driver           = fileSystemDriver;
                var     root             = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);

                var dbFile = db.ProjectFiles.FirstOrDefault(item => item.WorkProjectId == workProjectId &&
                                                            item.WorkProjectTemplateId == worktemplateid &&
                                                            item.Name == einfo.Name &&
                                                            item.Path == folder + "\\" + einfo.Name + "." + item.Id);

                if (dbFile != null)
                {
                    dbFile.Status           = (int)ShqConstants.FileStatus.Ready;
                    dbFile.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    dbFile.LastModfiedTime  = DateTime.Now;
                }
                else
                {
                    dbFile = db.ProjectFiles.Add(new ProjectFile
                        {
                            FileId                = Guid.NewGuid(),
                            Name                  = einfo.Name,
                            Level                 = 0,
                            IsFolder              = true,
                            Path                  = Path.Combine(folder, einfo.Name),
                            WorkProjectId         = workProjectId,
                            WorkProjectTemplateId = worktemplateid,
                            Privilege             = einfo.Privilege,
                            CreatedById           = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId,
                            LastModifiedById      = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId
                        });

                    if (wp != null)
                    {
                        wp.ProjectFiles.Add(dbFile);
                    }

                    db.SaveChanges();
                }

                name = einfo.Name + "." + dbFile.Id.ToString();
                string target = root.VolumeId + Helper.EncodePath(new DirectoryInfo(folder).Name);

                try
                {
                    driver.MakeDir(target, name);
                }
                finally
                {
                    if (Directory.Exists(Path.Combine(folder, name)))
                    {
                        dbFile.Status = (int)ShqConstants.FileStatus.Ready;
                        dbFile.Path   = Path.Combine(folder, name);
                    }
                    else
                    {
                        dbFile.Status           = (int)ShqConstants.FileStatus.Deleted;
                        dbFile.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                        dbFile.LastModfiedTime  = DateTime.Now;
                    }
                }
            }

            break;

            case "delete":
            {
                var     fileSystemDriver = new FileSystemDriver();
                IDriver driver           = fileSystemDriver;
                //folder = Path.Combine(folder, name);
                var root = new Root(new DirectoryInfo(folder).Parent)
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(@"\" + new DirectoryInfo(folder).Name);

                driver.Remove(new string[] { target });
                if (Directory.Exists(folder) == false && File.Exists(folder) == false)
                {
                    //var f = db.ProjectFiles.FirstOrDefault(item => item.Id == einfo.Id
                    //&& item.WorkProjectId == projectId
                    //&& item.WorkProjectTemplateId == worktemplateid);
                    //if (f != null)
                    //{
                    //    f.Status = 1;
                    //    f.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    //    f.LastModfiedTime = DateTime.Now;
                    //}

                    string userId = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    var    fs     = db.ProjectFiles.Where(item => item.Path.Contains(folder) == true &&
                                                          item.WorkProjectId == workProjectId &&
                                                          item.WorkProjectTemplateId == worktemplateid);
                    foreach (var f in fs)
                    {
                        f.Status           = 1;
                        f.LastModifiedById = userId;
                        f.LastModfiedTime  = DateTime.Now;
                    }
                }

                break;
            }

            case "rename":
            {
                var           fileSystemDriver = new FileSystemDriver();
                IDriver       driver           = fileSystemDriver;
                DirectoryInfo rootPath         = new DirectoryInfo(folder).Parent;
                var           root             = new Root(rootPath)
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);
                string target = root.VolumeId + Helper.EncodePath(@"\" + oldName);

                var dbFile = db.ProjectFiles.FirstOrDefault(item => item.WorkProjectId == workProjectId &&
                                                            item.WorkProjectTemplateId == worktemplateid &&
                                                            item.Name == einfo.Name &&
                                                            item.Path == rootPath.FullName + "\\" + einfo.Name + "." + item.Id &&
                                                            item.Status != (int)ShqConstants.FileStatus.Deleted);
                if (dbFile != null && (File.Exists(dbFile.Path) || Directory.Exists(dbFile.Path)))
                {
                    return(new HttpResponseMessage(HttpStatusCode.Conflict));
                }

                driver.Rename(target, name);
                string oldPath = Path.Combine(Directory.GetParent(folder).FullName, oldName);
                string newPath = Path.Combine(Directory.GetParent(folder).FullName, name);

                var userId  = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                var wpFiles = db.ProjectFiles.Where(item => item.WorkProjectId == workProjectId &&
                                                    item.WorkProjectTemplateId == worktemplateid &&
                                                    item.Path.Contains(oldPath) == true);
                if (wpFiles != null)
                {
                    foreach (var f in wpFiles)
                    {
                        if (f.Id == einfo.Id)
                        {
                            f.Name = einfo.Name;
                        }
                        f.Path             = f.Path.Replace(oldPath, newPath);
                        f.LastModifiedById = userId;
                        f.LastModfiedTime  = DateTime.Now;
                    }
                }
                break;
            }

            case "uploadFile":    //https://forums.asp.net/t/2104884.aspx?Uploading+a+file+using+webapi+C+
                //https://shazwazza.com/post/uploading-files-and-json-data-in-the-same-request-with-angular-js/
            {
                var fileSystemDriver = new FileSystemDriver();
                var root             = new Root(new DirectoryInfo(folder))
                {
                    IsReadOnly        = false,
                    Alias             = "Root",
                    MaxUploadSizeInMb = 500,
                    LockedFolders     = new List <string>()
                };
                fileSystemDriver.AddRoot(root);

                var dbFile = db.ProjectFiles.FirstOrDefault(item => item.WorkProjectId == workProjectId &&
                                                            item.WorkProjectTemplateId == worktemplateid &&
                                                            item.Name == einfo.Name &&
                                                            item.Path == folder + "\\" + einfo.Name + "." + item.Id);

                if (dbFile == null)
                {
                    dbFile = db.ProjectFiles.Add(new ProjectFile
                        {
                            FileId                = Guid.NewGuid(),
                            Name                  = einfo.Name,
                            Level                 = einfo.Level,
                            IsFolder              = false,
                            Path                  = Path.Combine(folder, name),
                            WorkProjectId         = workProjectId,
                            WorkProjectTemplateId = worktemplateid,
                            Privilege             = einfo.Privilege,
                            CreatedById           = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId,
                            LastModifiedById      = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId
                        });

                    if (wp != null)
                    {
                        wp.ProjectFiles.Add(dbFile);
                    }

                    db.SaveChanges();
                }
                else
                {
                    dbFile.Status           = (int)ShqConstants.FileStatus.Ready;
                    dbFile.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    dbFile.LastModfiedTime  = DateTime.Now;
                }

                name = einfo.Name + "." + dbFile.Id.ToString();
                string target = root.VolumeId + Helper.EncodePath(new DirectoryInfo(folder).Name);

                try
                {
                    byte[] bytes = Convert.FromBase64String(einfo.FileContent);
                    fileSystemDriver.Upload(target, name, bytes);
                }
                finally
                {
                    if (File.Exists(Path.Combine(folder, name)))
                    {
                        if (File.Exists(Path.Combine(folder, name)))
                        {
                            dbFile.Path = Path.Combine(folder, name);
                        }
                        else
                        {
                            db.ProjectFiles.Remove(dbFile);
                        }
                    }
                }

                break;
            }

            case "dowloadFile":
            {
                if (File.Exists(folder) == false)
                {
                    return(new HttpResponseMessage(HttpStatusCode.NotFound));
                }

                //converting Pdf file into bytes array
                var dataBytes = System.IO.File.ReadAllBytes(folder);
                //adding bytes to memory stream
                var stream = new MemoryStream(dataBytes);

                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(stream.ToArray())
                };
                result.Content.Headers.ContentDisposition =
                    new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = einfo.Name
                };
                result.Content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/octet-stream");

                return(result);
            }

            case "newLevel":
            {
                var f = db.ProjectFiles.FirstOrDefault(item => item.Id == einfo.Id && item.WorkProjectId == workProjectId && item.WorkProjectTemplateId == worktemplateid);
                if (f != null)
                {
                    f.Level            = einfo.Level;
                    f.LastModifiedById = db.ShqUsers.Where(u => u.IdentityUser.UserName == HttpContext.Current.User.Identity.Name).FirstOrDefault().IdentityUserId;
                    f.LastModfiedTime  = DateTime.Now;
                }

                break;
            }
            }

            db.SaveChanges();

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }