public override Task <UploadFileReply> UploadFile(UploadFileRequest request, ServerCallContext context) { var result = new UploadFileReply(); string logFileName = WordSanitizer.Sanitize(request.FileName); string logFolderName = WordSanitizer.Sanitize(request.FolderName); SharePointFileManager _sharePointFileManager = new SharePointFileManager(_configuration); CreateDocumentLibraryIfMissing(GetDocumentListTitle(request.EntityName), GetDocumentTemplateUrlPart(request.EntityName)); try { string fileName = _sharePointFileManager.AddFile(GetDocumentTemplateUrlPart(request.EntityName), request.FolderName, request.FileName, request.Data.ToByteArray(), request.ContentType).GetAwaiter().GetResult(); result.FileName = fileName; result.ResultStatus = ResultStatus.Success; } catch (SharePointRestException ex) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in uploading file {logFileName} to folder {logFolderName}"; _logger.LogError(ex, result.ErrorDetail); } catch (Exception e) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in uploading file {logFileName} to folder {logFolderName}"; _logger.LogError(e, result.ErrorDetail); } return(Task.FromResult(result)); }
public static void UploadPdf(this FileManagerClient _fileManagerClient, ILogger _logger, string entityName, string entityId, string folderName, string filename, byte[] data) { Contract.Requires(_fileManagerClient != null); // call the web service var uploadRequest = new UploadFileRequest { ContentType = "application/pdf", Data = ByteString.CopyFrom(data), EntityName = entityName, FileName = filename, FolderName = folderName }; var uploadResult = _fileManagerClient.UploadFile(uploadRequest); // Do not save full file names to the logs (for privacy) var logFolderName = WordSanitizer.Sanitize(folderName); var logFileName = WordSanitizer.Sanitize(filename); if (uploadResult.ResultStatus == ResultStatus.Success) { _logger.LogInformation($"SUCCESS in uploading PDF file {logFileName} to folder {logFolderName}"); } else { _logger.LogError($"ERROR in uploading PDF file {logFileName} to folder {logFolderName}"); throw new Exception($"ERROR in uploading PDF file {logFileName} to folder {logFolderName}"); } }
public override Task <CreateFolderReply> CreateFolder(CreateFolderRequest request, ServerCallContext context) { var result = new CreateFolderReply(); var logFolder = WordSanitizer.Sanitize(request.FolderName); var listTitle = GetDocumentListTitle(request.EntityName); var _sharePointFileManager = new SharePointFileManager(_configuration); CreateDocumentLibraryIfMissing(listTitle, GetDocumentTemplateUrlPart(request.EntityName)); var folderExists = false; try { var folder = _sharePointFileManager.GetFolder(listTitle, request.FolderName).GetAwaiter().GetResult(); if (folder != null) { folderExists = true; } } catch (SharePointRestException ex) { Log.Error(ex, $"SharePointRestException creating sharepoint folder (status code: {ex.Response.StatusCode})"); folderExists = false; } catch (Exception e) { Log.Error(e, "Generic Exception creating sharepoint folder"); folderExists = false; } if (folderExists) { result.ResultStatus = ResultStatus.Success; } else { try { _sharePointFileManager.CreateFolder(GetDocumentListTitle(request.EntityName), request.FolderName) .GetAwaiter().GetResult(); var folder = _sharePointFileManager.GetFolder(listTitle, request.FolderName).GetAwaiter() .GetResult(); if (folder != null) { result.ResultStatus = ResultStatus.Success; } } catch (SharePointRestException ex) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in creating folder {logFolder}"; Log.Error(ex, result.ErrorDetail); } }
public static string GetTruncatedFilename(this FileManagerClient _fileManagerClient, ILogger _logger, string entityName, string folderName, string fileName) { Contract.Requires(_fileManagerClient != null); var truncated = fileName; // Do not save full file names to the logs (for privacy) var logFileName = WordSanitizer.Sanitize(fileName); var logFolderName = WordSanitizer.Sanitize(folderName); var errorMessage = $"ERROR in getting truncated filename {logFileName} for folder {logFolderName}"; try { // call the web service var request = new TruncatedFilenameRequest { EntityName = entityName, FolderName = folderName, FileName = fileName }; // Get the (potentially) truncated filename from SharePoint var result = _fileManagerClient.GetTruncatedFilename(request); if (result.ResultStatus == ResultStatus.Success) { truncated = result.FileName; } else { _logger.LogError(errorMessage); } } catch (Exception e) { _logger.LogError(e, errorMessage); } return(truncated); }
public override Task <DownloadFileReply> DownloadFile(DownloadFileRequest request, ServerCallContext context) { var result = new DownloadFileReply(); string logUrl = WordSanitizer.Sanitize(request.ServerRelativeUrl); SharePointFileManager _sharePointFileManager = new SharePointFileManager(_configuration); try { byte[] data = _sharePointFileManager.DownloadFile(request.ServerRelativeUrl).GetAwaiter().GetResult(); if (data != null) { result.ResultStatus = ResultStatus.Success; result.Data = ByteString.CopyFrom(data); } else { result.ResultStatus = ResultStatus.Fail; } } catch (SharePointRestException ex) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in downloading file {logUrl}"; _logger.LogError(ex, result.ErrorDetail); } catch (Exception e) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in downloading file {logUrl}"; _logger.LogError(e, result.ErrorDetail); } return(Task.FromResult(result)); }
public override Task <DeleteFileReply> DeleteFile(DeleteFileRequest request, ServerCallContext context) { var result = new DeleteFileReply(); string logUrl = WordSanitizer.Sanitize(request.ServerRelativeUrl); SharePointFileManager _sharePointFileManager = new SharePointFileManager(_configuration); try { bool success = _sharePointFileManager.DeleteFile(request.ServerRelativeUrl).GetAwaiter().GetResult(); if (success) { result.ResultStatus = ResultStatus.Success; } else { result.ResultStatus = ResultStatus.Fail; } } catch (SharePointRestException ex) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in deleting file {logUrl}"; _logger.LogError(ex, result.ErrorDetail); } catch (Exception e) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in deleting file {logUrl}"; _logger.LogError(e, result.ErrorDetail); } return(Task.FromResult(result)); }
public override Task <TruncatedFilenameReply> GetTruncatedFilename(TruncatedFilenameRequest request, ServerCallContext context) { var result = new TruncatedFilenameReply(); string logFileName = WordSanitizer.Sanitize(request.FileName); string logFolderName = WordSanitizer.Sanitize(request.FolderName); try { var _sharePointFileManager = new SharePointFileManager(_configuration); // Ask SharePoint whether this filename would be truncated upon upload var listTitle = GetDocumentListTitle(request.EntityName); var maybeTruncated = _sharePointFileManager.GetTruncatedFileName(request.FileName, listTitle, request.FolderName); result.FileName = maybeTruncated; result.ResultStatus = ResultStatus.Success; } catch (SharePointRestException ex) { result.ResultStatus = ResultStatus.Fail; result.ErrorDetail = $"ERROR in getting truncated filename {logFileName} for folder {logFolderName}"; Log.Error(ex, result.ErrorDetail); } return(Task.FromResult(result)); }
public static void CreateFolderIfNotExist(this FileManagerClient _fileManagerClient, ILogger _logger, string entityName, string folderName) { string logFolderName = WordSanitizer.Sanitize(folderName); try { var createFolderRequest = new CreateFolderRequest() { EntityName = entityName, FolderName = folderName }; var createFolderResult = _fileManagerClient.CreateFolder(createFolderRequest); if (createFolderResult.ResultStatus == ResultStatus.Fail) { _logger.LogError($"Error creating folder for entity {entityName} and folder {logFolderName}. Error is {createFolderResult.ErrorDetail}"); } } catch (Exception e) { _logger.LogError(e, $"Error creating folder for account {entityName} and folder {logFolderName}"); } }
public static void UploadPdfIfChanged(this FileManagerClient _fileManagerClient, ILogger _logger, string entityName, string entityId, string folderName, string documentType, byte[] data, string hash) { Contract.Requires(_fileManagerClient != null); Contract.Requires(documentType != null); // SharePoint can truncate file names that are too long. Make sure we account for that. var fileName = FileSystemItemExtensions.CombineNameDocumentType($"{hash}.pdf", documentType); fileName = _fileManagerClient.GetTruncatedFilename(_logger, entityName, folderName, fileName); var notChanged = _fileManagerClient.FileExists(_logger, entityName, entityId, folderName, documentType, fileName); if (notChanged) { // Do not save full file names to the logs (for privacy) var logFolderName = WordSanitizer.Sanitize(folderName); var logFileName = WordSanitizer.Sanitize(fileName); _logger.LogInformation($"PDF file {logFileName} in folder {logFolderName} hasn't changed. Will NOT UPLOAD again."); // Abort early if PDF hasn't changed... return; } _fileManagerClient.UploadPdf(_logger, entityName, entityId, folderName, fileName, data); }