DocSpace-client/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 FileDtoHelper _fileDtoHelper;
2022-03-03 18:01:34 +00:00
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 FolderDtoHelper _folderDtoHelper;
private readonly FileOperationDtoHelper _fileOperationDtoHelper;
private readonly FileShareDtoHelper _fileShareDtoHelper;
2022-03-03 18:01:34 +00:00
private readonly FileShareParamsHelper _fileShareParamsHelper;
private readonly EntryManager _entryManager;
private readonly FolderContentDtoHelper _folderContentDtoHelper;
2022-03-03 18:01:34 +00:00
private readonly ChunkedUploadSessionHelper _chunkedUploadSessionHelper;
private readonly DocumentServiceTrackerHelper _documentServiceTracker;
private readonly SettingsManager _settingsManager;
private readonly EncryptionKeyPairDtoHelper _encryptionKeyPairHelper;
2022-03-03 18:01:34 +00:00
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,
FileDtoHelper fileDtoHelper,
2022-03-03 18:01:34 +00:00
FilesSettingsHelper filesSettingsHelper,
FilesLinkUtility filesLinkUtility,
FileUploader fileUploader,
DocumentServiceHelper documentServiceHelper,
TenantManager tenantManager,
SecurityContext securityContext,
FolderDtoHelper folderDtoHelper,
FileOperationDtoHelper fileOperationDtoHelper,
FileShareDtoHelper fileShareDtoHelper,
2022-03-03 18:01:34 +00:00
FileShareParamsHelper fileShareParamsHelper,
EntryManager entryManager,
FolderContentDtoHelper folderContentDtoHelper,
2022-03-03 18:01:34 +00:00
ChunkedUploadSessionHelper chunkedUploadSessionHelper,
DocumentServiceTrackerHelper documentServiceTracker,
IOptionsMonitor<ILog> optionMonitor,
SettingsManager settingsManager,
EncryptionKeyPairDtoHelper encryptionKeyPairHelper,
2022-03-03 18:01:34 +00:00
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;
_fileDtoHelper = fileDtoHelper;
2022-03-03 18:01:34 +00:00
_filesSettingsHelper = filesSettingsHelper;
_filesLinkUtility = filesLinkUtility;
_fileUploader = fileUploader;
_documentServiceHelper = documentServiceHelper;
_tenantManager = tenantManager;
_securityContext = securityContext;
_folderDtoHelper = folderDtoHelper;
_fileOperationDtoHelper = fileOperationDtoHelper;
_fileShareDtoHelper = fileShareDtoHelper;
2022-03-03 18:01:34 +00:00
_fileShareParamsHelper = fileShareParamsHelper;
_entryManager = entryManager;
_folderContentDtoHelper = folderContentDtoHelper;
2022-03-03 18:01:34 +00:00
_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
public async Task<FolderContentDto<T>> GetFolderAsync(T folderId, Guid userIdOrGroupId, FilterType filterType, bool withSubFolders)
2022-03-03 18:01:34 +00:00
{
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
public async Task<object> UploadFileAsync(T folderId, UploadRequestDto uploadModel)
2022-03-03 18:01:34 +00:00
{
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<FileDto<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<FileDto<T>> InsertFileAsync(T folderId, Stream file, string title, bool? createNewIfExist, bool keepConvertStatus = false)
2022-03-03 18:01:34 +00:00
{
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 _fileDtoHelper.GetAsync(resultFile);
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
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
public async Task<FileDto<T>> UpdateFileStreamAsync(Stream file, T fileId, string fileExtension, bool encrypted = false, bool forcesave = false)
2022-03-03 18:01:34 +00:00
{
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
return await _fileDtoHelper.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
public async Task<FileDto<T>> SaveEditingAsync(T fileId, string fileExtension, string downloadUri, Stream stream, string doc, bool forcesave)
2022-03-03 18:01:34 +00:00
{
return await _fileDtoHelper.GetAsync(await _fileStorageService.SaveEditingAsync(fileId, fileExtension, downloadUri, stream, doc, forcesave));
2022-03-03 18:01:34 +00:00
}
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<FileDto<T>> CreateTextFileAsync(T folderId, string title, string content)
2022-03-03 18:01:34 +00:00
{
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
private async Task<FileDto<T>> CreateFileAsync(T folderId, string title, string content, string extension)
2022-03-03 18:01:34 +00:00
{
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
return await _fileDtoHelper.GetAsync(file);
2022-03-03 18:01:34 +00:00
}
2020-06-25 17:17:24 +00:00
public Task<FileDto<T>> CreateHtmlFileAsync(T folderId, string title, string content)
2022-03-03 18:01:34 +00:00
{
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
public async Task<FolderDto<T>> CreateFolderAsync(T folderId, string title)
2022-03-03 18:01:34 +00:00
{
var folder = await _fileStorageService.CreateNewFolderAsync(folderId, title);
2020-03-18 13:19:37 +00:00
return await _folderDtoHelper.GetAsync(folder);
2022-03-03 18:01:34 +00:00
}
2022-02-22 09:22:15 +00:00
public async Task<FileDto<T>> CreateFileAsync(T folderId, string title, JsonElement templateId, bool enableExternalExt = false)
2022-03-03 18:01:34 +00:00
{
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
return await _fileDtoHelper.GetAsync(file);
2022-03-03 18:01:34 +00:00
}
2021-11-22 13:17:27 +00:00
public async Task<FolderDto<T>> RenameFolderAsync(T folderId, string title)
2022-03-03 18:01:34 +00:00
{
var folder = await _fileStorageService.FolderRenameAsync(folderId, title);
2020-03-18 13:19:37 +00:00
return await _folderDtoHelper.GetAsync(folder);
2022-03-03 18:01:34 +00:00
}
2021-11-16 17:40:15 +00:00
public async Task<FolderDto<T>> GetFolderInfoAsync(T folderId)
2022-03-03 18:01:34 +00:00
{
var folder = await _fileStorageService.GetFolderAsync(folderId).NotFoundIfNull("Folder not found");
2022-02-22 09:22:15 +00:00
return await _folderDtoHelper.GetAsync(folder);
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
public async IAsyncEnumerable<FileEntryDto> GetFolderPathAsync(T folderId)
2022-03-03 18:01:34 +00:00
{
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
public async Task<FileDto<T>> GetFileInfoAsync(T fileId, int version = -1)
2022-03-03 18:01:34 +00:00
{
var file = await _fileStorageService.GetFileAsync(fileId, version);
file = file.NotFoundIfNull("File not found");
2020-03-18 13:19:37 +00:00
return await _fileDtoHelper.GetAsync(file);
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
public async Task<FileDto<TTemplate>> CopyFileAsAsync<TTemplate>(T fileId, TTemplate destFolderId, string destTitle, string password = null)
2022-03-03 18:01:34 +00:00
{
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
return await _fileDtoHelper.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
public async Task<FileDto<T>> AddToRecentAsync(T fileId, int version = -1)
2022-03-03 18:01:34 +00:00
{
var file = await _fileStorageService.GetFileAsync(fileId, version).NotFoundIfNull("File not found");
_entryManager.MarkAsRecent(file);
2022-02-22 09:22:15 +00:00
return await _fileDtoHelper.GetAsync(file);
2022-03-03 18:01:34 +00:00
}
2022-02-22 09:22:15 +00:00
public async Task<List<FileEntryDto>> GetNewItemsAsync(T folderId)
2022-03-03 18:01:34 +00:00
{
var newItems = await _fileStorageService.GetNewItemsAsync(folderId);
var result = new List<FileEntryDto>();
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
public async Task<FileDto<T>> UpdateFileAsync(T fileId, string title, int lastVersion)
2022-03-03 18:01:34 +00:00
{
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
public async Task<IEnumerable<FileOperationDto>> DeleteFileAsync(T fileId, bool deleteAfter, bool immediately)
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
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 _fileOperationDtoHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public IAsyncEnumerable<ConversationResultDto<T>> StartConversionAsync(CheckConversionRequestDto<T> cheqConversionRequestDto)
2022-03-03 18:01:34 +00:00
{
cheqConversionRequestDto.StartConvert = true;
return CheckConversionAsync(cheqConversionRequestDto);
2022-03-03 18:01:34 +00:00
}
2020-03-18 13:19:37 +00:00
public async IAsyncEnumerable<ConversationResultDto<T>> CheckConversionAsync(CheckConversionRequestDto<T> cheqConversionRequestDto)
2022-03-03 18:01:34 +00:00
{
var checkConversaion = _fileStorageService.CheckConversionAsync(new List<CheckConversionRequestDto<T>>() { cheqConversionRequestDto }, cheqConversionRequestDto.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 ConversationResultDto<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
};
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
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
public async Task<IEnumerable<FileOperationDto>> DeleteFolder(T folderId, bool deleteAfter, bool immediately)
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
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 _fileOperationDtoHelper.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
public async IAsyncEnumerable<FileEntryDto> MoveOrCopyBatchCheckAsync(BatchRequestDto batchRequestDto)
2022-03-03 18:01:34 +00:00
{
List<object> checkedFiles;
List<object> checkedFolders;
2022-02-22 09:22:15 +00:00
if (batchRequestDto.DestFolderId.ValueKind == JsonValueKind.Number)
2022-03-03 18:01:34 +00:00
{
(checkedFiles, checkedFolders) = await _fileStorageService.MoveOrCopyFilesCheckAsync(batchRequestDto.FileIds.ToList(), batchRequestDto.FolderIds.ToList(), batchRequestDto.DestFolderId.GetInt32());
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
else
{
(checkedFiles, checkedFolders) = await _fileStorageService.MoveOrCopyFilesCheckAsync(batchRequestDto.FileIds.ToList(), batchRequestDto.FolderIds.ToList(), batchRequestDto.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
public async Task<IEnumerable<FileOperationDto>> MoveBatchItemsAsync(BatchRequestDto batchRequestDto)
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
2020-03-18 13:19:37 +00:00
foreach (var e in _fileStorageService.MoveOrCopyItems(batchRequestDto.FolderIds.ToList(), batchRequestDto.FileIds.ToList(), batchRequestDto.DestFolderId, batchRequestDto.ConflictResolveType, false, batchRequestDto.DeleteAfter))
2020-08-12 15:13:52 +00:00
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
2020-08-12 15:13:52 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationDto>> CopyBatchItemsAsync(BatchRequestDto batchRequestDto)
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.MoveOrCopyItems(batchRequestDto.FolderIds.ToList(), batchRequestDto.FileIds.ToList(), batchRequestDto.DestFolderId, batchRequestDto.ConflictResolveType, true, batchRequestDto.DeleteAfter))
2021-08-11 15:04:23 +00:00
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
2021-08-11 15:04:23 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationDto>> MarkAsReadAsync(BaseBatchRequestDto batchRequestDto)
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.MarkAsRead(batchRequestDto.FolderIds.ToList(), batchRequestDto.FileIds.ToList()))
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationDto>> TerminateTasksAsync()
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.TerminateTasks())
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationDto>> GetOperationStatusesAsync()
2022-03-03 18:01:34 +00:00
{
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.GetTasksStatuses())
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
}
2021-08-11 15:04:23 +00:00
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileOperationDto>> BulkDownloadAsync(DownloadRequestDto model)
2022-03-03 18:01:34 +00:00
{
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
}
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in _fileStorageService.BulkDownload(folders, files))
2021-06-11 11:24:01 +00:00
{
result.Add(await _fileOperationDtoHelper.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<FileOperationDto>> EmptyTrashAsync()
2022-03-03 18:01:34 +00:00
{
var emptyTrash = await _fileStorageService.EmptyTrashAsync();
var result = new List<FileOperationDto>();
2022-03-03 18:01:34 +00:00
foreach (var e in emptyTrash)
{
result.Add(await _fileOperationDtoHelper.GetAsync(e));
2021-06-11 11:24:01 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileDto<T>>> GetFileVersionInfoAsync(T fileId)
2022-03-03 18:01:34 +00:00
{
var files = await _fileStorageService.GetFileHistoryAsync(fileId);
var result = new List<FileDto<T>>();
2022-03-03 18:01:34 +00:00
foreach (var e in files)
2020-12-02 13:17:43 +00:00
{
result.Add(await _fileDtoHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<IEnumerable<FileDto<T>>> ChangeHistoryAsync(T fileId, int version, bool continueVersion)
2022-03-03 18:01:34 +00:00
{
var pair = await _fileStorageService.CompleteVersionAsync(fileId, version, continueVersion);
var history = pair.Value;
var result = new List<FileDto<T>>();
2022-03-03 18:01:34 +00:00
foreach (var e in history)
2020-03-18 13:19:37 +00:00
{
result.Add(await _fileDtoHelper.GetAsync(e));
2020-03-18 13:19:37 +00:00
}
2022-03-03 18:01:34 +00:00
return result;
}
public async Task<FileDto<T>> LockFileAsync(T fileId, bool lockFile)
2022-03-03 18:01:34 +00:00
{
var result = await _fileStorageService.LockFileAsync(fileId, lockFile);
return await _fileDtoHelper.GetAsync(result);
2022-03-03 18:01:34 +00:00
}
public Task<DocumentService.FileLink> GetPresignedUriAsync(T fileId)
{
return _fileStorageService.GetPresignedUriAsync(fileId);
}
public async Task<List<EditHistoryDto>> GetEditHistoryAsync(T fileId, string doc = null)
2022-03-03 18:01:34 +00:00
{
var result = await _fileStorageService.GetEditHistoryAsync(fileId, doc);
return result.Select(r => new EditHistoryDto(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList();
2022-03-03 18:01:34 +00:00
}
public Task<EditHistoryDataDto> GetEditDiffUrlAsync(T fileId, int version = 0, string doc = null)
2022-03-03 18:01:34 +00:00
{
return _fileStorageService.GetEditDiffUrlAsync(fileId, version, doc);
}
public async Task<List<EditHistoryDto>> RestoreVersionAsync(T fileId, int version = 0, string url = null, string doc = null)
2022-03-03 18:01:34 +00:00
{
var result = await _fileStorageService.RestoreVersionAsync(fileId, version, url, doc);
return result.Select(r => new EditHistoryDto(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList();
2022-03-03 18:01:34 +00:00
}
public Task<string> UpdateCommentAsync(T fileId, int version, string comment)
{
return _fileStorageService.UpdateCommentAsync(fileId, version, comment);
}
public Task<IEnumerable<FileShareDto>> GetFileSecurityInfoAsync(T fileId)
2022-03-03 18:01:34 +00:00
{
return GetSecurityInfoAsync(new List<T> { fileId }, new List<T> { });
}
public Task<IEnumerable<FileShareDto>> GetFolderSecurityInfoAsync(T folderId)
2022-03-03 18:01:34 +00:00
{
return GetSecurityInfoAsync(new List<T> { }, new List<T> { folderId });
}
public async IAsyncEnumerable<FileEntryDto> GetFoldersAsync(T folderId)
2022-03-03 18:01:34 +00:00
{
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
public async Task<IEnumerable<FileShareDto>> GetSecurityInfoAsync(IEnumerable<T> fileIds, IEnumerable<T> folderIds)
2022-03-03 18:01:34 +00:00
{
var fileShares = await _fileStorageService.GetSharedInfoAsync(fileIds, folderIds);
return fileShares.Select(_fileShareDtoHelper.Get).ToList();
2022-03-03 18:01:34 +00:00
}
public Task<IEnumerable<FileShareDto>> SetFileSecurityInfoAsync(T fileId, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
2022-03-03 18:01:34 +00:00
{
return SetSecurityInfoAsync(new List<T> { fileId }, new List<T>(), share, notify, sharingMessage);
}
public Task<IEnumerable<FileShareDto>> SetFolderSecurityInfoAsync(T folderId, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
2022-03-03 18:01:34 +00:00
{
return SetSecurityInfoAsync(new List<T>(), new List<T> { folderId }, share, notify, sharingMessage);
}
public async Task<IEnumerable<FileShareDto>> SetSecurityInfoAsync(IEnumerable<T> fileIds, IEnumerable<T> folderIds, IEnumerable<FileShareParams> share, bool notify, string sharingMessage)
2022-03-03 18:01:34 +00:00
{
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));
2022-03-03 18:01:34 +00:00
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
};
2020-03-18 13:19:37 +00:00
2022-03-03 18:01:34 +00:00
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-12-01 19:59:42 +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
};
2022-03-03 18:01:34 +00:00
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<FolderContentDto<T>> ToFolderContentWrapperAsync(T folderId, Guid userIdOrGroupId, FilterType filterType, bool withSubFolders)
2022-03-03 18:01:34 +00:00
{
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 _folderContentDtoHelper.GetAsync(items, startIndex);
}
internal async Task<FileEntryDto> GetFileEntryWrapperAsync(FileEntry r)
{
FileEntryDto wrapper = null;
2022-03-03 18:01:34 +00:00
if (r is Folder<int> fol1)
2020-03-18 13:19:37 +00:00
{
wrapper = await _folderDtoHelper.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
{
wrapper = await _folderDtoHelper.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
{
wrapper = await _fileDtoHelper.GetAsync(file1);
2022-03-03 18:01:34 +00:00
}
else if (r is File<string> file2)
{
wrapper = await _fileDtoHelper.GetAsync(file2);
2022-03-03 18:01:34 +00:00
}
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
}
}