Esempio n. 1
0
        /// <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));
            }
        }
Esempio n. 2
0
        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));
            }
        }