DocSpace-buildtools/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs

938 lines
36 KiB
C#
Raw Normal View History

2022-03-03 18:01:34 +00:00
using FileShare = ASC.Files.Core.Security.FileShare;
2020-03-18 13:19:37 +00:00
using MimeMapping = ASC.Common.Web.MimeMapping;
using SortedByType = ASC.Files.Core.SortedByType;
2022-03-03 18:01:34 +00:00
namespace ASC.Files.Helpers;
[Scope]
public class FilesControllerHelper<T>
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
private readonly ApiContext _apiContext;
private readonly FileStorageService<T> _fileStorageService;
private readonly GlobalFolderHelper _globalFolderHelper;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly FileUtility _fileUtility;
private readonly FileWrapperHelper _fileWrapperHelper;
private readonly FilesSettingsHelper _filesSettingsHelper;
private readonly FilesLinkUtility _filesLinkUtility;
private readonly FileUploader _fileUploader;
private readonly DocumentServiceHelper _documentServiceHelper;
private readonly TenantManager _tenantManager;
private readonly SecurityContext _securityContext;
private readonly FolderWrapperHelper _folderWrapperHelper;
private readonly FileOperationWraperHelper _fileOperationWraperHelper;
private readonly FileShareWrapperHelper _fileShareWrapperHelper;
private readonly FileShareParamsHelper _fileShareParamsHelper;
private readonly EntryManager _entryManager;
private readonly FolderContentWrapperHelper _folderContentWrapperHelper;
private readonly ChunkedUploadSessionHelper _chunkedUploadSessionHelper;
private readonly DocumentServiceTrackerHelper _documentServiceTracker;
private readonly SettingsManager _settingsManager;
private readonly EncryptionKeyPairHelper _encryptionKeyPairHelper;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly FileConverter _fileConverter;
private readonly ApiDateTimeHelper _apiDateTimeHelper;
private readonly UserManager _userManager;
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
public readonly SocketManager _socketManager;
public readonly IServiceProvider _serviceProvider;
private readonly ILog _logger;
private readonly IHttpClientFactory _clientFactory;
/// <summary>
/// </summary>
/// <param name="context"></param>
/// <param name="fileStorageService"></param>
public FilesControllerHelper(
ApiContext context,
FileStorageService<T> fileStorageService,
FileWrapperHelper fileWrapperHelper,
FilesSettingsHelper filesSettingsHelper,
FilesLinkUtility filesLinkUtility,
FileUploader fileUploader,
DocumentServiceHelper documentServiceHelper,
TenantManager tenantManager,
SecurityContext securityContext,
FolderWrapperHelper folderWrapperHelper,
FileOperationWraperHelper fileOperationWraperHelper,
FileShareWrapperHelper fileShareWrapperHelper,
FileShareParamsHelper fileShareParamsHelper,
EntryManager entryManager,
FolderContentWrapperHelper folderContentWrapperHelper,
ChunkedUploadSessionHelper chunkedUploadSessionHelper,
DocumentServiceTrackerHelper documentServiceTracker,
IOptionsMonitor<ILog> optionMonitor,
SettingsManager settingsManager,
EncryptionKeyPairHelper encryptionKeyPairHelper,
IHttpContextAccessor httpContextAccessor,
FileConverter fileConverter,
ApiDateTimeHelper apiDateTimeHelper,
UserManager userManager,
DisplayUserSettingsHelper displayUserSettingsHelper,
IServiceProvider serviceProvider,
SocketManager socketManager,
IHttpClientFactory clientFactory,
GlobalFolderHelper globalFolderHelper,
CoreBaseSettings coreBaseSettings,
FileUtility fileUtility)
{
_apiContext = context;
_fileStorageService = fileStorageService;
_fileWrapperHelper = fileWrapperHelper;
_filesSettingsHelper = filesSettingsHelper;
_filesLinkUtility = filesLinkUtility;
_fileUploader = fileUploader;
_documentServiceHelper = documentServiceHelper;
_tenantManager = tenantManager;
_securityContext = securityContext;
_folderWrapperHelper = folderWrapperHelper;
_fileOperationWraperHelper = fileOperationWraperHelper;
_fileShareWrapperHelper = fileShareWrapperHelper;
_fileShareParamsHelper = fileShareParamsHelper;
_entryManager = entryManager;
_folderContentWrapperHelper = folderContentWrapperHelper;
_chunkedUploadSessionHelper = chunkedUploadSessionHelper;
_documentServiceTracker = documentServiceTracker;
_settingsManager = settingsManager;
_encryptionKeyPairHelper = encryptionKeyPairHelper;
_apiDateTimeHelper = apiDateTimeHelper;
_userManager = userManager;
_displayUserSettingsHelper = displayUserSettingsHelper;
_serviceProvider = serviceProvider;
_socketManager = socketManager;
_httpContextAccessor = httpContextAccessor;
_fileConverter = fileConverter;
_logger = optionMonitor.Get("ASC.Files");
_clientFactory = clientFactory;
_globalFolderHelper = globalFolderHelper;
_fileUtility = fileUtility;
_coreBaseSettings = coreBaseSettings;
}
2022-03-03 17:33:11 +00:00
2022-03-03 18:01:34 +00:00
public async Task<SortedSet<int>> GetRootFoldersIdsAsync(bool withoutTrash, bool withoutAdditionalFolder)
{
var IsVisitor = _userManager.GetUsers(_securityContext.CurrentAccount.ID).IsVisitor(_userManager);
var IsOutsider = _userManager.GetUsers(_securityContext.CurrentAccount.ID).IsOutsider(_userManager);
var folders = new SortedSet<int>();
2022-03-03 17:33:11 +00:00
2022-03-03 18:01:34 +00:00
if (IsOutsider)
{
withoutTrash = true;
withoutAdditionalFolder = true;
}
2022-03-03 17:33:11 +00:00
2022-03-03 18:01:34 +00:00
if (!IsVisitor)
{
folders.Add(_globalFolderHelper.FolderMy);
}
2022-03-03 17:33:11 +00:00
2022-03-03 18:01:34 +00:00
if (!_coreBaseSettings.Personal && !_userManager.GetUsers(_securityContext.CurrentAccount.ID).IsOutsider(_userManager))
{
folders.Add(await _globalFolderHelper.FolderShareAsync);
}
2022-03-03 17:33:11 +00:00
2022-03-03 18:01:34 +00:00
if (!IsVisitor && !withoutAdditionalFolder)
{
if (_filesSettingsHelper.FavoritesSection)
2022-03-03 17:33:11 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(await _globalFolderHelper.FolderFavoritesAsync);
2022-03-03 17:33:11 +00:00
}
2022-03-03 18:01:34 +00:00
if (_filesSettingsHelper.RecentSection)
2022-03-03 17:33:11 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(await _globalFolderHelper.FolderRecentAsync);
2022-03-03 17:33:11 +00:00
}
2022-03-03 18:01:34 +00:00
if (!_coreBaseSettings.Personal && PrivacyRoomSettings.IsAvailable(_tenantManager))
2022-03-03 17:33:11 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(await _globalFolderHelper.FolderPrivacyAsync);
2022-03-03 17:33:11 +00:00
}
}
2022-03-03 18:01:34 +00:00
if (!_coreBaseSettings.Personal)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(await _globalFolderHelper.FolderCommonAsync);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
if (!IsVisitor
&& !withoutAdditionalFolder
&& _fileUtility.ExtsWebTemplate.Count > 0
&& _filesSettingsHelper.TemplatesSection)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(await _globalFolderHelper.FolderTemplatesAsync);
}
2021-09-27 19:28:49 +00:00
2022-03-03 18:01:34 +00:00
if (!withoutTrash)
{
folders.Add((int)_globalFolderHelper.FolderTrash);
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
return folders;
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FolderContentWrapper<T>> GetFolderAsync(T folderId, Guid userIdOrGroupId, FilterType filterType, bool withSubFolders)
{
var folderContentWrapper = await ToFolderContentWrapperAsync(folderId, userIdOrGroupId, filterType, withSubFolders);
2021-09-27 19:28:49 +00:00
2022-03-03 18:01:34 +00:00
return folderContentWrapper.NotFoundIfNull();
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<object> UploadFileAsync(T folderId, UploadModel uploadModel)
{
if (uploadModel.StoreOriginalFileFlag.HasValue)
{
_filesSettingsHelper.StoreOriginalFiles = uploadModel.StoreOriginalFileFlag.Value;
}
2021-09-27 19:28:49 +00:00
2022-03-03 18:01:34 +00:00
IEnumerable<IFormFile> files = _httpContextAccessor.HttpContext.Request.Form.Files;
if (files == null || !files.Any())
{
files = uploadModel.Files;
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
if (files != null && files.Any())
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
if (files.Count() == 1)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
//Only one file. return it
var postedFile = files.First();
2022-03-03 18:01:34 +00:00
return await InsertFileAsync(folderId, postedFile.OpenReadStream(), postedFile.FileName, uploadModel.CreateNewIfExist, uploadModel.KeepConvertStatus);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
//For case with multiple files
var result = new List<object>();
foreach (var postedFile in uploadModel.Files)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await InsertFileAsync(folderId, postedFile.OpenReadStream(), postedFile.FileName, uploadModel.CreateNewIfExist, uploadModel.KeepConvertStatus));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
if (uploadModel.File != null)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var fileName = "file" + MimeMapping.GetExtention(uploadModel.ContentType.MediaType);
if (uploadModel.ContentDisposition != null)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
fileName = uploadModel.ContentDisposition.FileName;
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return new List<FileWrapper<T>>
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
await InsertFileAsync(folderId, uploadModel.File.OpenReadStream(), fileName, uploadModel.CreateNewIfExist, uploadModel.KeepConvertStatus)
};
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
throw new InvalidOperationException("No input files");
}
public async Task<FileWrapper<T>> InsertFileAsync(T folderId, Stream file, string title, bool? createNewIfExist, bool keepConvertStatus = false)
{
try
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var resultFile = await _fileUploader.ExecAsync(folderId, title, file.Length, file, createNewIfExist ?? !_filesSettingsHelper.UpdateIfExist, !keepConvertStatus);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
await _socketManager.CreateFileAsync(resultFile);
return await _fileWrapperHelper.GetAsync(resultFile);
}
catch (FileNotFoundException e)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
throw new ItemNotFoundException("File not found", e);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
catch (DirectoryNotFoundException e)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
throw new ItemNotFoundException("Folder not found", e);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> UpdateFileStreamAsync(Stream file, T fileId, string fileExtension, bool encrypted = false, bool forcesave = false)
{
try
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var resultFile = await _fileStorageService.UpdateFileStreamAsync(fileId, file, fileExtension, encrypted, forcesave);
2020-12-29 13:04:50 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(resultFile);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
catch (FileNotFoundException e)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
throw new ItemNotFoundException("File not found", e);
}
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> SaveEditingAsync(T fileId, string fileExtension, string downloadUri, Stream stream, string doc, bool forcesave)
{
return await _fileWrapperHelper.GetAsync(await _fileStorageService.SaveEditingAsync(fileId, fileExtension, downloadUri, stream, doc, forcesave));
}
2021-10-12 10:14:33 +00:00
2022-03-03 18:01:34 +00:00
public Task<string> StartEditAsync(T fileId, bool editingAlone, string doc)
{
return _fileStorageService.StartEditAsync(fileId, editingAlone, doc);
}
2021-10-12 10:14:33 +00:00
2022-03-03 18:01:34 +00:00
public Task<KeyValuePair<bool, string>> TrackEditFileAsync(T fileId, Guid tabId, string docKeyForTrack, string doc, bool isFinish)
{
return _fileStorageService.TrackEditFileAsync(fileId, tabId, docKeyForTrack, doc, isFinish);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<Configuration<T>> OpenEditAsync(T fileId, int version, string doc, bool view)
{
var docParams = await _documentServiceHelper.GetParamsAsync(fileId, version, doc, true, !view, true);
var configuration = docParams.Configuration;
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
configuration.EditorType = EditorType.External;
if (configuration.EditorConfig.ModeWrite)
{
configuration.EditorConfig.CallbackUrl = _documentServiceTracker.GetCallbackUrl(configuration.Document.Info.GetFile().ID.ToString());
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
if (configuration.Document.Info.GetFile().RootFolderType == FolderType.Privacy && PrivacyRoomSettings.GetEnabled(_settingsManager))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var keyPair = _encryptionKeyPairHelper.GetKeyPair();
if (keyPair != null)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
configuration.EditorConfig.EncryptionKeys = new EncryptionKeysConfig
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
PrivateKeyEnc = keyPair.PrivateKeyEnc,
PublicKey = keyPair.PublicKey,
};
2020-03-18 13:19:37 +00:00
}
}
2022-03-03 18:01:34 +00:00
if (!configuration.Document.Info.GetFile().Encrypted && !configuration.Document.Info.GetFile().ProviderEntry) _entryManager.MarkAsRecent(configuration.Document.Info.GetFile());
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
configuration.Token = _documentServiceHelper.GetSignature(configuration);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return configuration;
}
2022-03-03 18:01:34 +00:00
public async Task<object> CreateUploadSessionAsync(T folderId, string fileName, long fileSize, string relativePath, ApiDateTime lastModified, bool encrypted)
{
var file = await _fileUploader.VerifyChunkedUploadAsync(folderId, fileName, fileSize, _filesSettingsHelper.UpdateIfExist, lastModified, relativePath);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
if (_filesLinkUtility.IsLocalFileUploader)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var session = await _fileUploader.InitiateUploadAsync(file.FolderID, file.ID ?? default, file.Title, file.ContentLength, encrypted);
2022-03-03 18:01:34 +00:00
var responseObject = await _chunkedUploadSessionHelper.ToResponseObjectAsync(session, true);
2022-03-03 18:01:34 +00:00
return new
{
success = true,
data = responseObject
};
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
var createSessionUrl = _filesLinkUtility.GetInitiateUploadSessionUrl(_tenantManager.GetCurrentTenant().Id, file.FolderID, file.ID, file.Title, file.ContentLength, encrypted, _securityContext);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
var httpClient = _clientFactory.CreateClient();
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
var request = new HttpRequestMessage();
request.RequestUri = new Uri(createSessionUrl);
request.Method = HttpMethod.Post;
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
// hack for uploader.onlyoffice.com in api requests
var rewriterHeader = _apiContext.HttpContextAccessor.HttpContext.Request.Headers[HttpRequestExtensions.UrlRewriterHeader];
if (!string.IsNullOrEmpty(rewriterHeader))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
request.Headers.Add(HttpRequestExtensions.UrlRewriterHeader, rewriterHeader.ToString());
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
using var response = await httpClient.SendAsync(request);
using var responseStream = await response.Content.ReadAsStreamAsync();
using var streamReader = new StreamReader(responseStream);
return JObject.Parse(await streamReader.ReadToEndAsync()); //result is json string
}
public Task<FileWrapper<T>> CreateTextFileAsync(T folderId, string title, string content)
{
if (title == null)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
throw new ArgumentNullException(nameof(title));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
//Try detect content
var extension = ".txt";
if (!string.IsNullOrEmpty(content))
2021-11-29 14:52:50 +00:00
{
2022-03-03 18:01:34 +00:00
if (Regex.IsMatch(content, @"<([^\s>]*)(\s[^<]*)>"))
2021-11-29 14:52:50 +00:00
{
2022-03-03 18:01:34 +00:00
extension = ".html";
2021-11-29 14:52:50 +00:00
}
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return CreateFileAsync(folderId, title, content, extension);
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
private async Task<FileWrapper<T>> CreateFileAsync(T folderId, string title, string content, string extension)
{
using var memStream = new MemoryStream(Encoding.UTF8.GetBytes(content));
var file = await _fileUploader.ExecAsync(folderId,
title.EndsWith(extension, StringComparison.OrdinalIgnoreCase) ? title : (title + extension),
memStream.Length, memStream);
2020-06-25 17:17:24 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(file);
}
2020-06-25 17:17:24 +00:00
2022-03-03 18:01:34 +00:00
public Task<FileWrapper<T>> CreateHtmlFileAsync(T folderId, string title, string content)
{
if (title == null)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
throw new ArgumentNullException(nameof(title));
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return CreateFileAsync(folderId, title, content, ".html");
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FolderWrapper<T>> CreateFolderAsync(T folderId, string title)
{
var folder = await _fileStorageService.CreateNewFolderAsync(folderId, title);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return await _folderWrapperHelper.GetAsync(folder);
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> CreateFileAsync(T folderId, string title, JsonElement templateId, bool enableExternalExt = false)
{
File<T> file;
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
if (templateId.ValueKind == JsonValueKind.Number)
{
file = await _fileStorageService.CreateNewFileAsync(new FileModel<T, int> { ParentId = folderId, Title = title, TemplateId = templateId.GetInt32() }, enableExternalExt);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
else if (templateId.ValueKind == JsonValueKind.String)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
file = await _fileStorageService.CreateNewFileAsync(new FileModel<T, string> { ParentId = folderId, Title = title, TemplateId = templateId.GetString() }, enableExternalExt);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
else
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
file = await _fileStorageService.CreateNewFileAsync(new FileModel<T, int> { ParentId = folderId, Title = title, TemplateId = 0 }, enableExternalExt);
}
2021-11-22 13:17:27 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(file);
}
2021-11-22 13:17:27 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FolderWrapper<T>> RenameFolderAsync(T folderId, string title)
{
var folder = await _fileStorageService.FolderRenameAsync(folderId, title);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return await _folderWrapperHelper.GetAsync(folder);
}
2021-11-16 17:40:15 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FolderWrapper<T>> GetFolderInfoAsync(T folderId)
{
var folder = await _fileStorageService.GetFolderAsync(folderId).NotFoundIfNull("Folder not found");
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
return await _folderWrapperHelper.GetAsync(folder);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async IAsyncEnumerable<FileEntryWrapper> GetFolderPathAsync(T folderId)
{
var breadCrumbs = await _entryManager.GetBreadCrumbsAsync(folderId);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in breadCrumbs)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
yield return await GetFileEntryWrapperAsync(e);
}
}
2020-05-27 15:23:50 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> GetFileInfoAsync(T fileId, int version = -1)
{
var file = await _fileStorageService.GetFileAsync(fileId, version);
file = file.NotFoundIfNull("File not found");
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(file);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<TTemplate>> CopyFileAsAsync<TTemplate>(T fileId, TTemplate destFolderId, string destTitle, string password = null)
{
var service = _serviceProvider.GetService<FileStorageService<TTemplate>>();
var controller = _serviceProvider.GetService<FilesControllerHelper<TTemplate>>();
var file = await _fileStorageService.GetFileAsync(fileId, -1);
var ext = FileUtility.GetFileExtension(file.Title);
var destExt = FileUtility.GetFileExtension(destTitle);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
if (ext == destExt)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var newFile = await service.CreateNewFileAsync(new FileModel<TTemplate, T> { ParentId = destFolderId, Title = destTitle, TemplateId = fileId }, false);
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(newFile);
Merge branch 'develop' into feature/backend-refactor # Conflicts: # common/ASC.Common/Caching/ICacheNotify.cs # common/ASC.Common/Caching/KafkaCache.cs # common/ASC.Common/Caching/MemoryCacheNotify.cs # common/ASC.Common/Threading/DistributedTaskProgress.cs # common/ASC.Common/Threading/DistributedTaskQueue.cs # common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs # common/ASC.Data.Backup.Core/Core/FileBackupProvider.cs # common/ASC.Data.Backup.Core/Storage/BackupRepository.cs # common/ASC.Data.Backup.Core/Storage/ConsumerBackupStorage.cs # common/ASC.Data.Backup.Core/Storage/DataStoreBackupStorage.cs # common/ASC.Data.Backup.Core/Storage/DocumentsBackupStorage.cs # common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs # common/ASC.Data.Backup.Core/Tasks/DeletePortalTask.cs # common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs # common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs # common/ASC.Data.Backup.Core/Tasks/TransferPortalTask.cs # common/ASC.Data.Reassigns/RemoveProgressItem.cs # common/ASC.Data.Storage/BaseStorage.cs # common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs # common/ASC.Data.Storage/CrossModuleTransferUtility.cs # common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs # common/ASC.Data.Storage/Encryption/EncryptionOperation.cs # common/ASC.Data.Storage/Extensions.cs # common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs # common/ASC.Data.Storage/IDataStore.cs # common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs # common/ASC.Data.Storage/S3/S3Storage.cs # common/ASC.Data.Storage/S3/S3UploadGuard.cs # common/ASC.Data.Storage/StaticUploader.cs # common/ASC.Data.Storage/StorageHandler.cs # common/ASC.Data.Storage/StorageUploader.cs # common/ASC.Data.Storage/WebPath.cs # common/services/ASC.ApiSystem/Controllers/PortalController.cs # common/services/ASC.AuditTrail/AuditEventsRepository.cs # common/services/ASC.AuditTrail/AuditReportCreator.cs # common/services/ASC.AuditTrail/LoginEventsRepository.cs # products/ASC.Files/Core/Configuration/FilesSpaceUsageStatManager.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IFolderDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/ILinkDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IProviderDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IProviderInfo.cs # products/ASC.Files/Core/Core/Dao/Interfaces/ITagDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/LinkDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs # products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs # products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs # products/ASC.Files/Core/Core/FileStorageService.cs # products/ASC.Files/Core/Core/FilesIntegration.cs # products/ASC.Files/Core/Core/Security/FileSecurity.cs # products/ASC.Files/Core/Core/Security/IFileSecurity.cs # products/ASC.Files/Core/Core/Security/ISecurityDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxStorage.cs # products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderAccountDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderTagDao.cs # products/ASC.Files/Core/Core/Thirdparty/RegexDaoSelectorBase.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs # products/ASC.Files/Core/Helpers/DocuSignHelper.cs # products/ASC.Files/Core/Helpers/Global.cs # products/ASC.Files/Core/Helpers/PathProvider.cs # products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs # products/ASC.Files/Core/HttpHandlers/SearchHandler.cs # products/ASC.Files/Core/Model/FileEntryWrapper.cs # products/ASC.Files/Core/Model/FileOperationWraper.cs # products/ASC.Files/Core/Model/FileWrapper.cs # products/ASC.Files/Core/Model/FolderContentWrapper.cs # products/ASC.Files/Core/Model/FolderWrapper.cs # products/ASC.Files/Core/Services/DocumentService/Configuration.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceHelper.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs # products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileDownloadOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileMarkAsReadOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileOperationsManager.cs # products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs # products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs # products/ASC.Files/Core/ThirdPartyApp/IThirdPartyApp.cs # products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs # products/ASC.Files/Core/Utils/EntryManager.cs # products/ASC.Files/Core/Utils/FileConverter.cs # products/ASC.Files/Core/Utils/FileMarker.cs # products/ASC.Files/Core/Utils/FileShareLink.cs # products/ASC.Files/Core/Utils/FileSharing.cs # products/ASC.Files/Core/Utils/FileUploader.cs # products/ASC.Files/Core/Utils/MailMergeTask.cs # products/ASC.Files/Core/Utils/SocketManager.cs # products/ASC.Files/Server/Controllers/FilesController.cs # products/ASC.Files/Server/Controllers/PrivacyRoomController.cs # products/ASC.Files/Server/Helpers/FilesControllerHelper.cs # products/ASC.People/Server/Controllers/PeopleController.cs # web/ASC.Web.Api/Controllers/AuthenticationController.cs # web/ASC.Web.Api/Controllers/PortalController.cs # web/ASC.Web.Api/Controllers/SettingsController.cs # web/ASC.Web.Api/Models/BuildVersion.cs # web/ASC.Web.Core/Files/DocumentService.cs # web/ASC.Web.Core/Files/DocumentServiceLicense.cs # web/ASC.Web.Core/Helpers/ApiSystemHelper.cs # web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs # web/ASC.Web.Core/Notify/StudioPeriodicNotify.cs # web/ASC.Web.Core/Recaptcha.cs # web/ASC.Web.Core/Sms/SmsManager.cs # web/ASC.Web.Core/Sms/SmsProvider.cs # web/ASC.Web.Core/Sms/SmsSender.cs # web/ASC.Web.Core/SpaceUsageStatManager.cs # web/ASC.Web.Core/Utility/UrlShortener.cs
2022-02-23 19:42:34 +00:00
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
using (var fileStream = await _fileConverter.ExecAsync(file, destExt, password))
{
return await controller.InsertFileAsync(destFolderId, fileStream, destTitle, true);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> AddToRecentAsync(T fileId, int version = -1)
{
var file = await _fileStorageService.GetFileAsync(fileId, version).NotFoundIfNull("File not found");
_entryManager.MarkAsRecent(file);
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
return await _fileWrapperHelper.GetAsync(file);
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
public async Task<List<FileEntryWrapper>> GetNewItemsAsync(T folderId)
{
var newItems = await _fileStorageService.GetNewItemsAsync(folderId);
var result = new List<FileEntryWrapper>();
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in newItems)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await GetFileEntryWrapperAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<FileWrapper<T>> UpdateFileAsync(T fileId, string title, int lastVersion)
{
if (!string.IsNullOrEmpty(title))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
await _fileStorageService.FileRenameAsync(fileId, title);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
if (lastVersion > 0)
{
await _fileStorageService.UpdateToVersionAsync(fileId, lastVersion);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return await GetFileInfoAsync(fileId);
}
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
public async Task<IEnumerable<FileOperationWraper>> DeleteFileAsync(T fileId, bool deleteAfter, bool immediately)
{
var result = new List<FileOperationWraper>();
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.DeleteFile("delete", fileId, false, deleteAfter, immediately))
{
result.Add(await _fileOperationWraperHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public IAsyncEnumerable<ConversationResult<T>> StartConversionAsync(CheckConversionModel<T> model)
{
model.StartConvert = true;
return CheckConversionAsync(model);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async IAsyncEnumerable<ConversationResult<T>> CheckConversionAsync(CheckConversionModel<T> model)
{
var checkConversaion = _fileStorageService.CheckConversionAsync(new List<CheckConversionModel<T>>() { model }, model.Sync);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
await foreach (var r in checkConversaion)
{
var o = new ConversationResult<T>
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
Id = r.Id,
Error = r.Error,
OperationType = r.OperationType,
Processed = r.Processed,
Progress = r.Progress,
Source = r.Source,
};
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
if (!string.IsNullOrEmpty(r.Result))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
try
{
var options = new JsonSerializerOptions
{
AllowTrailingCommas = true,
PropertyNameCaseInsensitive = true
};
var jResult = JsonSerializer.Deserialize<FileJsonSerializerData<T>>(r.Result, options);
o.File = await GetFileInfoAsync(jResult.Id, jResult.Version);
}
catch (Exception e)
{
o.File = r.Result;
_logger.Error(e);
}
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
yield return o;
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public Task<string> CheckFillFormDraftAsync(T fileId, int version, string doc, bool editPossible, bool view)
{
return _fileStorageService.CheckFillFormDraftAsync(fileId, version, doc, editPossible, view);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<IEnumerable<FileOperationWraper>> DeleteFolder(T folderId, bool deleteAfter, bool immediately)
{
var result = new List<FileOperationWraper>();
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.DeleteFolder("delete", folderId, false, deleteAfter, immediately))
{
result.Add(await _fileOperationWraperHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async IAsyncEnumerable<FileEntryWrapper> MoveOrCopyBatchCheckAsync(BatchModel batchModel)
{
List<object> checkedFiles;
List<object> checkedFolders;
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
if (batchModel.DestFolderId.ValueKind == JsonValueKind.Number)
{
(checkedFiles, checkedFolders) = await _fileStorageService.MoveOrCopyFilesCheckAsync(batchModel.FileIds.ToList(), batchModel.FolderIds.ToList(), batchModel.DestFolderId.GetInt32());
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
else
{
(checkedFiles, checkedFolders) = await _fileStorageService.MoveOrCopyFilesCheckAsync(batchModel.FileIds.ToList(), batchModel.FolderIds.ToList(), batchModel.DestFolderId.GetString());
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
var entries = await _fileStorageService.GetItemsAsync(checkedFiles.OfType<int>().Select(Convert.ToInt32), checkedFiles.OfType<int>().Select(Convert.ToInt32), FilterType.FilesOnly, false, "", "");
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
entries.AddRange(await _fileStorageService.GetItemsAsync(checkedFiles.OfType<string>(), checkedFiles.OfType<string>(), FilterType.FilesOnly, false, "", ""));
2022-02-22 09:22:15 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in entries)
{
yield return await GetFileEntryWrapperAsync(e);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<IEnumerable<FileOperationWraper>> MoveBatchItemsAsync(BatchModel batchModel)
{
var result = new List<FileOperationWraper>();
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.MoveOrCopyItems(batchModel.FolderIds.ToList(), batchModel.FileIds.ToList(), batchModel.DestFolderId, batchModel.ConflictResolveType, false, batchModel.DeleteAfter))
2020-08-12 15:13:52 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
2020-08-12 15:13:52 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> CopyBatchItemsAsync(BatchModel batchModel)
{
var result = new List<FileOperationWraper>();
foreach (var e in _fileStorageService.MoveOrCopyItems(batchModel.FolderIds.ToList(), batchModel.FileIds.ToList(), batchModel.DestFolderId, batchModel.ConflictResolveType, true, batchModel.DeleteAfter))
2021-08-11 15:04:23 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
2021-08-11 15:04:23 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> MarkAsReadAsync(BaseBatchModel model)
{
var result = new List<FileOperationWraper>();
foreach (var e in _fileStorageService.MarkAsRead(model.FolderIds.ToList(), model.FileIds.ToList()))
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> TerminateTasksAsync()
{
var result = new List<FileOperationWraper>();
foreach (var e in _fileStorageService.TerminateTasks())
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> GetOperationStatusesAsync()
{
var result = new List<FileOperationWraper>();
foreach (var e in _fileStorageService.GetTasksStatuses())
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
}
2021-08-11 15:04:23 +00:00
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> BulkDownloadAsync(DownloadModel model)
{
var folders = new Dictionary<JsonElement, string>();
var files = new Dictionary<JsonElement, string>();
foreach (var fileId in model.FileConvertIds.Where(fileId => !files.ContainsKey(fileId.Key)))
{
2022-03-03 18:01:34 +00:00
files.Add(fileId.Key, fileId.Value);
}
2022-03-03 18:01:34 +00:00
foreach (var fileId in model.FileIds.Where(fileId => !files.ContainsKey(fileId)))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
files.Add(fileId, string.Empty);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
foreach (var folderId in model.FolderIds.Where(folderId => !folders.ContainsKey(folderId)))
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
folders.Add(folderId, string.Empty);
2020-12-02 13:17:43 +00:00
}
2022-03-03 18:01:34 +00:00
var result = new List<FileOperationWraper>();
foreach (var e in _fileStorageService.BulkDownload(folders, files))
2021-06-11 11:24:01 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileOperationWraperHelper.GetAsync(e));
Merge branch 'develop' into feature/backend-refactor # Conflicts: # common/ASC.Common/Caching/ICacheNotify.cs # common/ASC.Common/Caching/KafkaCache.cs # common/ASC.Common/Caching/MemoryCacheNotify.cs # common/ASC.Common/Threading/DistributedTaskProgress.cs # common/ASC.Common/Threading/DistributedTaskQueue.cs # common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs # common/ASC.Data.Backup.Core/Core/FileBackupProvider.cs # common/ASC.Data.Backup.Core/Storage/BackupRepository.cs # common/ASC.Data.Backup.Core/Storage/ConsumerBackupStorage.cs # common/ASC.Data.Backup.Core/Storage/DataStoreBackupStorage.cs # common/ASC.Data.Backup.Core/Storage/DocumentsBackupStorage.cs # common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs # common/ASC.Data.Backup.Core/Tasks/DeletePortalTask.cs # common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs # common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs # common/ASC.Data.Backup.Core/Tasks/TransferPortalTask.cs # common/ASC.Data.Reassigns/RemoveProgressItem.cs # common/ASC.Data.Storage/BaseStorage.cs # common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs # common/ASC.Data.Storage/CrossModuleTransferUtility.cs # common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs # common/ASC.Data.Storage/Encryption/EncryptionOperation.cs # common/ASC.Data.Storage/Extensions.cs # common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs # common/ASC.Data.Storage/IDataStore.cs # common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs # common/ASC.Data.Storage/S3/S3Storage.cs # common/ASC.Data.Storage/S3/S3UploadGuard.cs # common/ASC.Data.Storage/StaticUploader.cs # common/ASC.Data.Storage/StorageHandler.cs # common/ASC.Data.Storage/StorageUploader.cs # common/ASC.Data.Storage/WebPath.cs # common/services/ASC.ApiSystem/Controllers/PortalController.cs # common/services/ASC.AuditTrail/AuditEventsRepository.cs # common/services/ASC.AuditTrail/AuditReportCreator.cs # common/services/ASC.AuditTrail/LoginEventsRepository.cs # products/ASC.Files/Core/Configuration/FilesSpaceUsageStatManager.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IFolderDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/ILinkDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IProviderDao.cs # products/ASC.Files/Core/Core/Dao/Interfaces/IProviderInfo.cs # products/ASC.Files/Core/Core/Dao/Interfaces/ITagDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/LinkDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs # products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs # products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs # products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs # products/ASC.Files/Core/Core/FileStorageService.cs # products/ASC.Files/Core/Core/FilesIntegration.cs # products/ASC.Files/Core/Core/Security/FileSecurity.cs # products/ASC.Files/Core/Core/Security/IFileSecurity.cs # products/ASC.Files/Core/Core/Security/ISecurityDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Box/BoxStorage.cs # products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderAccountDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs # products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderTagDao.cs # products/ASC.Files/Core/Core/Thirdparty/RegexDaoSelectorBase.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxFileDao.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxFolderDao.cs # products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs # products/ASC.Files/Core/Helpers/DocuSignHelper.cs # products/ASC.Files/Core/Helpers/Global.cs # products/ASC.Files/Core/Helpers/PathProvider.cs # products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs # products/ASC.Files/Core/HttpHandlers/SearchHandler.cs # products/ASC.Files/Core/Model/FileEntryWrapper.cs # products/ASC.Files/Core/Model/FileOperationWraper.cs # products/ASC.Files/Core/Model/FileWrapper.cs # products/ASC.Files/Core/Model/FolderContentWrapper.cs # products/ASC.Files/Core/Model/FolderWrapper.cs # products/ASC.Files/Core/Services/DocumentService/Configuration.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceHelper.cs # products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs # products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileDownloadOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileMarkAsReadOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs # products/ASC.Files/Core/Services/WCFService/FileOperations/FileOperationsManager.cs # products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs # products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs # products/ASC.Files/Core/ThirdPartyApp/IThirdPartyApp.cs # products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs # products/ASC.Files/Core/Utils/EntryManager.cs # products/ASC.Files/Core/Utils/FileConverter.cs # products/ASC.Files/Core/Utils/FileMarker.cs # products/ASC.Files/Core/Utils/FileShareLink.cs # products/ASC.Files/Core/Utils/FileSharing.cs # products/ASC.Files/Core/Utils/FileUploader.cs # products/ASC.Files/Core/Utils/MailMergeTask.cs # products/ASC.Files/Core/Utils/SocketManager.cs # products/ASC.Files/Server/Controllers/FilesController.cs # products/ASC.Files/Server/Controllers/PrivacyRoomController.cs # products/ASC.Files/Server/Helpers/FilesControllerHelper.cs # products/ASC.People/Server/Controllers/PeopleController.cs # web/ASC.Web.Api/Controllers/AuthenticationController.cs # web/ASC.Web.Api/Controllers/PortalController.cs # web/ASC.Web.Api/Controllers/SettingsController.cs # web/ASC.Web.Api/Models/BuildVersion.cs # web/ASC.Web.Core/Files/DocumentService.cs # web/ASC.Web.Core/Files/DocumentServiceLicense.cs # web/ASC.Web.Core/Helpers/ApiSystemHelper.cs # web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs # web/ASC.Web.Core/Notify/StudioPeriodicNotify.cs # web/ASC.Web.Core/Recaptcha.cs # web/ASC.Web.Core/Sms/SmsManager.cs # web/ASC.Web.Core/Sms/SmsProvider.cs # web/ASC.Web.Core/Sms/SmsSender.cs # web/ASC.Web.Core/SpaceUsageStatManager.cs # web/ASC.Web.Core/Utility/UrlShortener.cs
2022-02-23 19:42:34 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationWraper>> EmptyTrashAsync()
{
var emptyTrash = await _fileStorageService.EmptyTrashAsync();
var result = new List<FileOperationWraper>();
foreach (var e in emptyTrash)
{
result.Add(await _fileOperationWraperHelper.GetAsync(e));
2021-06-11 11:24:01 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileWrapper<T>>> GetFileVersionInfoAsync(T fileId)
{
var files = await _fileStorageService.GetFileHistoryAsync(fileId);
var result = new List<FileWrapper<T>>();
foreach (var e in files)
2020-12-02 13:17:43 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileWrapperHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileWrapper<T>>> ChangeHistoryAsync(T fileId, int version, bool continueVersion)
{
var pair = await _fileStorageService.CompleteVersionAsync(fileId, version, continueVersion);
var history = pair.Value;
var result = new List<FileWrapper<T>>();
foreach (var e in history)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
result.Add(await _fileWrapperHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<FileWrapper<T>> LockFileAsync(T fileId, bool lockFile)
{
var result = await _fileStorageService.LockFileAsync(fileId, lockFile);
return await _fileWrapperHelper.GetAsync(result);
}
public Task<DocumentService.FileLink> GetPresignedUriAsync(T fileId)
{
return _fileStorageService.GetPresignedUriAsync(fileId);
}
public async Task<List<EditHistoryWrapper>> GetEditHistoryAsync(T fileId, string doc = null)
{
var result = await _fileStorageService.GetEditHistoryAsync(fileId, doc);
return result.Select(r => new EditHistoryWrapper(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList();
}
public Task<EditHistoryData> GetEditDiffUrlAsync(T fileId, int version = 0, string doc = null)
{
return _fileStorageService.GetEditDiffUrlAsync(fileId, version, doc);
}
public async Task<List<EditHistoryWrapper>> RestoreVersionAsync(T fileId, int version = 0, string url = null, string doc = null)
{
var result = await _fileStorageService.RestoreVersionAsync(fileId, version, url, doc);
return result.Select(r => new EditHistoryWrapper(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList();
}
public Task<string> UpdateCommentAsync(T fileId, int version, string comment)
{
return _fileStorageService.UpdateCommentAsync(fileId, version, comment);
}
public Task<IEnumerable<FileShareWrapper>> GetFileSecurityInfoAsync(T fileId)
{
return GetSecurityInfoAsync(new List<T> { fileId }, new List<T> { });
}
public Task<IEnumerable<FileShareWrapper>> GetFolderSecurityInfoAsync(T folderId)
{
return GetSecurityInfoAsync(new List<T> { }, new List<T> { folderId });
}
public async IAsyncEnumerable<FileEntryWrapper> GetFoldersAsync(T folderId)
{
var folders = await _fileStorageService.GetFoldersAsync(folderId);
foreach (var folder in folders)
2020-12-03 14:43:33 +00:00
{
2022-03-03 18:01:34 +00:00
yield return await GetFileEntryWrapperAsync(folder);
2020-12-03 14:43:33 +00:00
}
2022-03-03 18:01:34 +00:00
}
2020-12-03 14:43:33 +00:00
2022-03-03 18:01:34 +00:00
public async Task<IEnumerable<FileShareWrapper>> GetSecurityInfoAsync(IEnumerable<T> fileIds, IEnumerable<T> folderIds)
{
var fileShares = await _fileStorageService.GetSharedInfoAsync(fileIds, folderIds);
return fileShares.Select(_fileShareWrapperHelper.Get).ToList();
}
public Task<IEnumerable<FileShareWrapper>> SetFileSecurityInfoAsync(T fileId, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
{
return SetSecurityInfoAsync(new List<T> { fileId }, new List<T>(), share, notify, sharingMessage);
}
public Task<IEnumerable<FileShareWrapper>> SetFolderSecurityInfoAsync(T folderId, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
{
return SetSecurityInfoAsync(new List<T>(), new List<T> { folderId }, share, notify, sharingMessage);
}
public async Task<IEnumerable<FileShareWrapper>> SetSecurityInfoAsync(IEnumerable<T> fileIds, IEnumerable<T> folderIds, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
{
if (share != null && share.Any())
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
var list = new List<AceWrapper>(share.Select(_fileShareParamsHelper.ToAceObject));
var aceCollection = new AceCollection<T>
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
Files = fileIds,
Folders = folderIds,
Aces = list,
Message = sharingMessage
};
await _fileStorageService.SetAceObjectAsync(aceCollection, notify);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return await GetSecurityInfoAsync(fileIds, folderIds);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
public async Task<bool> RemoveSecurityInfoAsync(List<T> fileIds, List<T> folderIds)
{
await _fileStorageService.RemoveAceAsync(fileIds, folderIds);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
return true;
}
2021-11-15 11:31:47 +00:00
2022-03-03 18:01:34 +00:00
public async Task<string> GenerateSharedLinkAsync(T fileId, FileShare share)
{
var file = await GetFileInfoAsync(fileId);
2021-12-28 15:15:29 +00:00
2022-03-03 18:01:34 +00:00
var tmpInfo = await _fileStorageService.GetSharedInfoAsync(new List<T> { fileId }, new List<T> { });
var sharedInfo = tmpInfo.Find(r => r.SubjectId == FileConstant.ShareLinkId);
if (sharedInfo == null || sharedInfo.Share != share)
{
var list = new List<AceWrapper>
2020-03-18 13:19:37 +00:00
{
new AceWrapper
{
SubjectId = FileConstant.ShareLinkId,
SubjectGroup = true,
Share = share
}
};
2022-03-03 18:01:34 +00:00
var aceCollection = new AceCollection<T>
{
Files = new List<T> { fileId },
Folders = new List<T>(0),
Aces = list
};
await _fileStorageService.SetAceObjectAsync(aceCollection, false);
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
tmpInfo = await _fileStorageService.GetSharedInfoAsync(new List<T> { fileId }, new List<T> { });
sharedInfo = tmpInfo.Find(r => r.SubjectId == FileConstant.ShareLinkId);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return sharedInfo.Link;
}
2022-03-03 18:01:34 +00:00
public Task<bool> SetAceLinkAsync(T fileId, FileShare share)
{
return _fileStorageService.SetAceLinkAsync(fileId, share);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
///// <summary>
/////
///// </summary>
///// <param name="query"></param>
///// <returns></returns>
//[Read(@"@search/{query}")]
//public IEnumerable<FileEntryWrapper> Search(string query)
//{
// var searcher = new SearchHandler();
// var files = searcher.SearchFiles(query).Select(r => (FileEntryWrapper)FileWrapperHelper.Get(r));
// var folders = searcher.SearchFolders(query).Select(f => (FileEntryWrapper)FolderWrapperHelper.Get(f));
// return files.Concat(folders);
//}
private async Task<FolderContentWrapper<T>> ToFolderContentWrapperAsync(T folderId, Guid userIdOrGroupId, FilterType filterType, bool withSubFolders)
{
OrderBy orderBy = null;
if (Enum.TryParse(_apiContext.SortBy, true, out SortedByType sortBy))
{
orderBy = new OrderBy(sortBy, !_apiContext.SortDescending);
}
var startIndex = Convert.ToInt32(_apiContext.StartIndex);
var items = await _fileStorageService.GetFolderItemsAsync(folderId,
startIndex,
Convert.ToInt32(_apiContext.Count),
filterType,
filterType == FilterType.ByUser,
userIdOrGroupId.ToString(),
_apiContext.FilterValue,
false,
withSubFolders,
orderBy);
return await _folderContentWrapperHelper.GetAsync(items, startIndex);
}
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
internal async Task<FileEntryWrapper> GetFileEntryWrapperAsync(FileEntry r)
{
FileEntryWrapper wrapper = null;
if (r is Folder<int> fol1)
2020-03-18 13:19:37 +00:00
{
2022-03-03 18:01:34 +00:00
wrapper = await _folderWrapperHelper.GetAsync(fol1);
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
else if (r is Folder<string> fol2)
2020-12-01 19:59:42 +00:00
{
2022-03-03 18:01:34 +00:00
wrapper = await _folderWrapperHelper.GetAsync(fol2);
2020-12-01 19:59:42 +00:00
}
2022-03-03 18:01:34 +00:00
else if (r is File<int> file1)
2021-09-29 16:08:30 +00:00
{
2022-03-03 18:01:34 +00:00
wrapper = await _fileWrapperHelper.GetAsync(file1);
}
else if (r is File<string> file2)
{
wrapper = await _fileWrapperHelper.GetAsync(file2);
}
return wrapper;
}
2021-09-29 16:08:30 +00:00
2022-03-03 18:01:34 +00:00
internal IFormFile GetFileFromRequest(IModelWithFile model)
{
IEnumerable<IFormFile> files = _httpContextAccessor.HttpContext.Request.Form.Files;
if (files != null && files.Any())
{
return files.First();
2021-09-29 16:08:30 +00:00
}
2022-03-03 18:01:34 +00:00
return model.File;
2020-03-18 13:19:37 +00:00
}
}