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