/// <summary> /// Creates a copy of the specified file using an generated file name, /// which is returned as the output. /// </summary> /// <param name="fileId">Unique ID of source file</param> /// <param name="userId">UserID of user the initiating copy. This will be the owner of the file copy.</param> /// <returns>Name of the new file or null if the file was not found or the specified user does not have permissions to the file</returns> public async Task <Tuple <HttpStatusCode, WopiFile> > CreateCopySuggested(string fileId, string userId, string suggestedCopyName) { using (var wopiContext = new WopiContext()) { var originalFile = await wopiContext.Files.Where(f => f.FileId == fileId && f.FilePermissions.Any(fp => fp.UserId == userId)).FirstOrDefaultAsync(); if (originalFile == null) { return(new Tuple <HttpStatusCode, WopiFile>(HttpStatusCode.NotFound, null)); } if (suggestedCopyName.StartsWith(".")) { suggestedCopyName = Path.GetFileNameWithoutExtension(originalFile.FileName) + suggestedCopyName; } var newFileName = FileNameUtil.MakeValidFileName(suggestedCopyName); WopiFile existingFile = null; do { existingFile = await wopiContext.Files.Where(f => f.FileName == newFileName).FirstOrDefaultAsync(); if (existingFile != null) { newFileName = Path.GetFileNameWithoutExtension(newFileName) + "-copy" + Path.GetExtension(newFileName); } }while (existingFile != null); var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); var blobClient = storageAccount.CreateCloudBlobClient(); var newFile = await CreateCopyInternal(blobClient, wopiContext, originalFile, newFileName, userId); wopiContext.Files.Add(newFile); await wopiContext.SaveChangesAsync(); return(new Tuple <HttpStatusCode, WopiFile>(HttpStatusCode.OK, newFile)); } }
public async Task <Tuple <HttpStatusCode, WopiFile, string> > CreateCopy(string fileId, string userId, string copyName, bool overwrite = false) { using (var wopiContext = new WopiContext()) { var originalFile = await wopiContext.Files.Where(f => f.FileId == fileId && f.FilePermissions.Any(fp => fp.UserId == userId)).FirstOrDefaultAsync(); if (originalFile == null) { return(new Tuple <HttpStatusCode, WopiFile, string>(HttpStatusCode.NotFound, null, null)); } if (!FileNameUtil.IsValidFileName(copyName)) { return(new Tuple <HttpStatusCode, WopiFile, string>(HttpStatusCode.BadRequest, null, null)); } var existingFile = await wopiContext.Files.Where(f => f.FileName == copyName).FirstOrDefaultAsync(); if (existingFile != null) { if (!overwrite) { return(new Tuple <HttpStatusCode, WopiFile, string>(HttpStatusCode.Conflict, null, existingFile.LockValue)); } if (existingFile.IsLocked) { return(new Tuple <HttpStatusCode, WopiFile, string>(HttpStatusCode.Conflict, null, existingFile.LockValue)); } } var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); var blobClient = storageAccount.CreateCloudBlobClient(); var newWopiFile = await CreateCopyInternal(blobClient, wopiContext, originalFile, copyName, userId); wopiContext.Files.Add(newWopiFile); if (existingFile != null) { wopiContext.Files.Remove(existingFile); } await wopiContext.SaveChangesAsync(); if (existingFile != null) { // Do we need to explicity delete FilePermissions? var container = blobClient.GetContainerReference(existingFile.Container); if (await container.ExistsAsync()) { var blockBlob = container.GetBlockBlobReference(existingFile.FileId); if (await blockBlob.ExistsAsync()) { await blockBlob.DeleteAsync(); } } } return(new Tuple <HttpStatusCode, WopiFile, string>(HttpStatusCode.OK, newWopiFile, null)); } }