public override async Task <WopiResponse> PutRelativeFileSpecific(PutRelativeFileSpecificRequest putRelativeFileSpecificRequest) { var userId = WopiSecurity.GetIdentityNameFromToken(putRelativeFileSpecificRequest.AccessToken); var wopiFileRepository = new WopiFileRepository(); var response = await wopiFileRepository.CreateCopy(putRelativeFileSpecificRequest.ResourceId, userId, putRelativeFileSpecificRequest.RelativeTarget, putRelativeFileSpecificRequest.OverwriteRelativeTarget); if (response.Item1 == HttpStatusCode.NotFound) { return(putRelativeFileSpecificRequest.ResponseNotFound()); } else if (response.Item1 == HttpStatusCode.BadRequest) { return(putRelativeFileSpecificRequest.ResponseBadRequest()); } else if (response.Item1 == HttpStatusCode.Conflict) { return(putRelativeFileSpecificRequest.ResponseLockConflict(response.Item3)); } else if (response.Item1 == HttpStatusCode.OK) { // Get access token for the new file WopiSecurity security = new WopiSecurity(); var token = security.GenerateToken(response.Item2.OwnerId); var tokenStr = security.WriteToken(token); var url = new Uri(string.Format("https://{0}/wopi/files/{1}?access_token={2}", putRelativeFileSpecificRequest.RequestUri.Authority, response.Item2.FileId, tokenStr)); Uri hostViewUrl = null; Uri hostEditUrl = null; var actions = await WopiDiscovery.GetActions(); var view = actions.FirstOrDefault(i => i.ext == response.Item2.FileExtension && i.name == "view"); if (view != null) { hostViewUrl = new Uri(WopiDiscovery.GetActionUrl(view, response.Item2.FileId, putRelativeFileSpecificRequest.RequestUri.Authority)); } var edit = actions.FirstOrDefault(i => i.ext == response.Item2.FileExtension && i.name == "edit"); if (edit != null) { hostEditUrl = new Uri(WopiDiscovery.GetActionUrl(edit, response.Item2.FileId, putRelativeFileSpecificRequest.RequestUri.Authority)); } return(putRelativeFileSpecificRequest.ResponseOK(response.Item2.FileName, url, hostViewUrl, hostEditUrl)); } else { return(putRelativeFileSpecificRequest.ResponseServerError(string.Format("Unknown HTTPStatusCode from WopiFileRepository.CreateCopy: {0}", response.Item1))); } }
public abstract Task <WopiResponse> PutRelativeFileSpecific(PutRelativeFileSpecificRequest putRelativeFileSpecificRequest);
public override async Task <WopiResponse> PutRelativeFileSpecific(PutRelativeFileSpecificRequest putRelativeFileSpecificRequest) { WopiResponse wopiResponse = null; var file = DocumentDBRepository <DetailedFileModel> .GetItem("Files", i => i.id.ToString() == putRelativeFileSpecificRequest.ResourceId); // Check for null file if (file != null) { var inputStream = await putRelativeFileSpecificRequest.Content.ReadAsStreamAsync(); // Create the file entity FileModel newFile = new FileModel() { id = Guid.NewGuid(), OwnerId = file.OwnerId, BaseFileName = putRelativeFileSpecificRequest.RelativeTarget, Size = inputStream.Length, Container = file.Container, Version = 1 }; // First stream the file into blob storage var bytes = new byte[inputStream.Length]; await inputStream.ReadAsync(bytes, 0, (int)inputStream.Length); var id = await Utils.AzureStorageUtil.UploadFile(newFile.id.ToString(), newFile.Container, bytes); // Write the details into documentDB await DocumentDBRepository <FileModel> .CreateItemAsync("Files", (FileModel)newFile); // Get access token for the new file WopiSecurity security = new WopiSecurity(); var token = security.GenerateToken(newFile.OwnerId, newFile.Container, newFile.id.ToString()); var tokenStr = security.WriteToken(token); // Prepare the Json response var name = newFile.BaseFileName; var url = string.Format("https://{0}/wopi/files/{1}?access_token={2}", putRelativeFileSpecificRequest.RequestUri.Authority, newFile.id.ToString(), tokenStr); // Add the optional properties to response if applicable (HostViewUrl, HostEditUrl) var fileExt = newFile.BaseFileName.Substring(newFile.BaseFileName.LastIndexOf('.') + 1).ToLower(); string hostViewUrl = null; string hostEditUrl = null; var actions = await WopiDiscovery.GetActions(); var view = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "view"); if (view != null) { hostViewUrl = WopiDiscovery.GetActionUrl(view, newFile.id.ToString(), putRelativeFileSpecificRequest.RequestUri.Authority); } var edit = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "edit"); if (edit != null) { hostEditUrl = WopiDiscovery.GetActionUrl(edit, newFile.id.ToString(), putRelativeFileSpecificRequest.RequestUri.Authority); } // Write the response and return a success 200 wopiResponse = putRelativeFileSpecificRequest.ResponseOK(name, new Uri(url), new Uri(hostViewUrl), new Uri(hostEditUrl)); } else { wopiResponse = putRelativeFileSpecificRequest.ResponseNotFound(); } return(wopiResponse); }