public FileManagerResponse UploadFile(string path, IList <IFormFile> uploadFiles, string action) { long filesLength = 0; //add ServerFile entity for each file uploaded foreach (var file in uploadFiles) { path = Path.Combine(path, file.FileName); var folderId = GetFolderId(path); SaveServerFileViewModel viewModel = new SaveServerFileViewModel() { Id = Guid.NewGuid(), //TODO: update to match args id ContentType = file.ContentType, CorrelationEntity = "", //TODO: update or remove from ServerFileViewModel and ServerFile CorrelationEntityId = Guid.Empty, //TODO: update or remove from ServerFileViewModel and ServerFile File = file, HashCode = null, StorageFolderId = folderId, SizeInBytes = file.Length, StoragePath = path, StorageProvider = "LocalFileStorage" }; SaveFile(viewModel); filesLength += file.Length; } //add to SizeInBytes property in ServerDrive var serverDrive = GetDrive(); serverDrive.StorageSizeInBytes += filesLength; serverDriveRepository.Update(serverDrive); webhookPublisher.PublishAsync("Files.DriveUpdated", serverDrive.Id.ToString(), serverDrive.Name); FileManagerResponse uploadResponse = operation.Upload(path, uploadFiles, action, null); return(uploadResponse); }
public object LocalFileStorageOperation(FileManagerDirectoryContent args) { if (args.Action == "delete" || args.Action == "rename") { if ((args.TargetPath == null) && (args.Path == "")) { FileManagerResponse response = new FileManagerResponse(); response.Error = new ErrorDetails { Code = "401", Message = "Restricted to modify the root folder." }; return(this.operation.ToCamelCase(response)); } } var serverDrive = GetDrive(); var entityId = Guid.Parse(args.Id); ServerFile serverFile = new ServerFile(); ServerFolder serverFolder = new ServerFolder(); if (args.IsFile) { serverFile = serverFileRepository.GetOne(entityId); } else { serverFolder = serverFolderRepository.GetOne(entityId); } switch (args.Action) { case "read": //reads the file(s) or folder(s) from the given path //update FileAttribute (retrieval) var fileAttribute = fileAttributeRepository.Find(null).Items?.Where(q => q.Name == FileAttributes.RetrievalCount.ToString() && q.ServerFileId == entityId).FirstOrDefault(); fileAttribute.AttributeValue += 1; fileAttributeRepository.Update(fileAttribute); return(this.operation.ToCamelCase(this.operation.GetFiles(args.Path, args.ShowHiddenItems))); case "delete": //deletes the selected file(s) or folder(s) from the given path if (args.IsFile.Equals(true)) { DeleteFile(args.Path); serverDrive.StorageSizeInBytes -= args.Size; } else { //removes the size of folder and any files from server drive property var files = serverFileRepository.Find(null).Items?.Where(q => q.StorageFolderId == entityId); long fileSize = 0; foreach (var file in files) { fileSize += file.SizeInBytes; } serverDrive.StorageSizeInBytes -= args.Size - fileSize; DeleteFolder(args.Path); } serverDriveRepository.Update(serverDrive); webhookPublisher.PublishAsync("Files.DriveUpdated", serverDrive.Id.ToString(), serverDrive.Name); return(this.operation.ToCamelCase(this.operation.Delete(args.Path, args.Names))); case "copy": //copies the selected file(s) or folder(s) from a path and then pastes them into a given target path if (args.IsFile.Equals(true)) { foreach (var file in args.UploadFiles) { var folderId = GetFolderId(args.Path); //add serverFile entity SaveServerFileViewModel viewModel = new SaveServerFileViewModel() { Id = Guid.Parse(args.Id), ContentType = file.ContentType, CorrelationEntity = "", //TODO: update or remove CorrelationEntityId = Guid.Empty, //TODO: update or remove HashCode = null, SizeInBytes = file.Length, StorageFolderId = folderId, StoragePath = args.Path, StorageProvider = "LocalFileStorage", File = file }; SaveFile(viewModel); } } else { //add serverFolder entity AddFolder(args); } AddBytesToServerDrive(serverDrive, args.Size); return(this.operation.ToCamelCase(this.operation.Copy(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData))); case "move": //cuts the selected file(s) or folder(s) from a path and then pastes them into a given target path if (args.IsFile.Equals(true)) { foreach (var file in args.UploadFiles) { var folderId = GetFolderId(args.Path); UpdateServerFileViewModel viewModel = new UpdateServerFileViewModel() { ContentType = file.ContentType, CorrelationEntity = "", //TODO: remove or update CorrelationEntityId = Guid.Empty, //TODO: remove or update HashCode = null, File = file, SizeInBytes = file.Length, StorageFolderId = folderId, StoragePath = Path.Combine(args.Path, file.FileName), StorageProvider = "LocalFileStorage" }; UpdateFile(viewModel); } } else { //update ServerFolder entity serverFolder.ParentFolderId = Guid.Parse(args.ParentId); serverFolder.StoragePath = args.Path; serverFolderRepository.Update(serverFolder); webhookPublisher.PublishAsync("Files.FolderUpdated", serverFolder.Id.ToString(), serverFolder.Name); } return(this.operation.ToCamelCase(this.operation.Move(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData))); case "details": //gets the details of the selected file(s) or folder(s) return(this.operation.ToCamelCase(this.operation.Details(args.Path, args.Names, args.Data))); case "create": //creates a new folder in a given path //add ServerFolder entity AddFolder(args); AddBytesToServerDrive(serverDrive, args.Size); return(this.operation.ToCamelCase(this.operation.Create(args.Path, args.Name))); case "search": //gets the list of file(s) or folder(s) from a given path based on the searched key string //add to retrieval count value to file attribute entity for each file //update FileAttribute (retrieval) foreach (var file in args.UploadFiles) { fileAttribute = fileAttributeRepository.Find(null).Items?.Where(q => q.Name == FileAttributes.RetrievalCount.ToString() && q.ServerFileId == entityId).FirstOrDefault(); fileAttribute.AttributeValue += 1; fileAttributeRepository.Update(fileAttribute); } return(this.operation.ToCamelCase(this.operation.Search(args.Path, args.SearchString, args.ShowHiddenItems, args.CaseSensitive))); case "rename": //renames a file or folder if (args.IsFile.Equals(true)) { //update ServerFile entity foreach (var file in args.UploadFiles) { var folderId = GetFolderId(args.Path); UpdateServerFileViewModel viewModel = new UpdateServerFileViewModel() { ContentType = file.ContentType, CorrelationEntity = "", //TODO: remove or update CorrelationEntityId = Guid.Empty, //TODO: remove or update HashCode = null, File = file, SizeInBytes = file.Length, StorageFolderId = folderId, StoragePath = Path.Combine(args.Path, file.FileName), StorageProvider = "LocalFileStorage" }; UpdateFile(viewModel); } } else { //update ServerFolder entity serverFolder.ParentFolderId = Guid.Parse(args.ParentId); serverFolder.StoragePath = args.Path; serverFolderRepository.Update(serverFolder); webhookPublisher.PublishAsync("Files.FolderUpdated", serverFolder.Id.ToString(), serverFolder.Name); } return(this.operation.ToCamelCase(this.operation.Rename(args.Path, args.Name, args.NewName))); } return(null); }
public void SaveFile(SaveServerFileViewModel request) { var file = request.File; Guid? id = request.Id; string path = request.StoragePath; Guid? organizationId = organizationManager.GetDefaultOrganization().Id; var hash = GetHash(path); //add FileAttribute entities var attributes = new Dictionary <string, int>() { { FileAttributes.StorageCount.ToString(), 1 }, { FileAttributes.RetrievalCount.ToString(), 0 }, { FileAttributes.AppendCount.ToString(), 0 } }; List <FileAttribute> fileAttributes = new List <FileAttribute>(); foreach (var attribute in attributes) { var fileAttribute = new FileAttribute() { ServerFileId = request.Id, AttributeValue = attribute.Value, CreatedBy = httpContextAccessor.HttpContext.User.Identity.Name, CreatedOn = DateTime.UtcNow, DataType = attribute.Value.GetType().ToString(), Name = attribute.Key, OrganizationId = organizationId }; fileAttributeRepository.Add(fileAttribute); fileAttributes.Add(fileAttribute); } //add file properties to ServerFile entity var serverFile = new ServerFile() { Id = id, ContentType = file.ContentType, CorrelationEntity = request.CorrelationEntity, CorrelationEntityId = request.CorrelationEntityId, CreatedBy = httpContextAccessor.HttpContext.User.Identity.Name, CreatedOn = DateTime.UtcNow, HashCode = hash, Name = file.FileName, SizeInBytes = file.Length, StorageFolderId = request.StorageFolderId, StoragePath = path, StorageProvider = request.StorageProvider, OrganizationId = organizationId, FileAttributes = fileAttributes }; serverFileRepository.Add(serverFile); webhookPublisher.PublishAsync("Files.NewFileCreated", serverFile.Id.ToString(), serverFile.Name); //upload file to local server //CheckDirectoryExists(path, organizationId); //if (file.Length <= 0 || file.Equals(null)) throw new Exception("No file exists"); //if (file.Length > 0) //{ // path = Path.Combine(path, serverFile.Id.ToString()); // using (var stream = new FileStream(path, FileMode.Create)) // file.CopyTo(stream); // ConvertToBinaryObject(path); //} }