namespace ASC.Files.Helpers; public class FilesControllerHelper : FilesHelperBase { private readonly ILog _logger; private readonly ApiDateTimeHelper _apiDateTimeHelper; private readonly UserManager _userManager; private readonly DisplayUserSettingsHelper _displayUserSettingsHelper; private readonly IServiceProvider _serviceProvider; private readonly FileConverter _fileConverter; private readonly FileOperationDtoHelper _fileOperationDtoHelper; public FilesControllerHelper( FilesSettingsHelper filesSettingsHelper, FileUploader fileUploader, SocketManager socketManager, FileDtoHelper fileDtoHelper, ApiContext apiContext, FileStorageService fileStorageService, FolderContentDtoHelper folderContentDtoHelper, IHttpContextAccessor httpContextAccessor, FolderDtoHelper folderDtoHelper, ILog logger, ApiDateTimeHelper apiDateTimeHelper, UserManager userManager, DisplayUserSettingsHelper displayUserSettingsHelper, IServiceProvider serviceProvider, FileConverter fileConverter, FileOperationDtoHelper fileOperationDtoHelper) : base( filesSettingsHelper, fileUploader, socketManager, fileDtoHelper, apiContext, fileStorageService, folderContentDtoHelper, httpContextAccessor, folderDtoHelper) { _logger = logger; _apiDateTimeHelper = apiDateTimeHelper; _fileConverter = fileConverter; _userManager = userManager; _serviceProvider = serviceProvider; _displayUserSettingsHelper = displayUserSettingsHelper; _fileOperationDtoHelper = fileOperationDtoHelper; } public async Task>> ChangeHistoryAsync(T fileId, int version, bool continueVersion) { var pair = await _fileStorageService.CompleteVersionAsync(fileId, version, continueVersion); var history = pair.Value; var result = new List>(); foreach (var e in history) { result.Add(await _fileDtoHelper.GetAsync(e)); } return result; } public async IAsyncEnumerable> CheckConversionAsync(CheckConversionRequestDto cheqConversionRequestDto) { var checkConversaion = _fileStorageService.CheckConversionAsync(new List>() { cheqConversionRequestDto }, cheqConversionRequestDto.Sync); await foreach (var r in checkConversaion) { var o = new ConversationResultDto { Id = r.Id, Error = r.Error, OperationType = r.OperationType, Processed = r.Processed, Progress = r.Progress, Source = r.Source, }; if (!string.IsNullOrEmpty(r.Result)) { try { var options = new JsonSerializerOptions { AllowTrailingCommas = true, PropertyNameCaseInsensitive = true }; var jResult = JsonSerializer.Deserialize>(r.Result, options); o.File = await GetFileInfoAsync(jResult.Id, jResult.Version); } catch (Exception e) { o.File = r.Result; _logger.Error(e); } } yield return o; } } public async Task> CreateFileAsync(T folderId, string title, JsonElement templateId, bool enableExternalExt = false) { File file; if (templateId.ValueKind == JsonValueKind.Number) { file = await _fileStorageService.CreateNewFileAsync(new FileModel { ParentId = folderId, Title = title, TemplateId = templateId.GetInt32() }, enableExternalExt); } else if (templateId.ValueKind == JsonValueKind.String) { file = await _fileStorageService.CreateNewFileAsync(new FileModel { ParentId = folderId, Title = title, TemplateId = templateId.GetString() }, enableExternalExt); } else { file = await _fileStorageService.CreateNewFileAsync(new FileModel { ParentId = folderId, Title = title, TemplateId = 0 }, enableExternalExt); } return await _fileDtoHelper.GetAsync(file); } public Task> CreateHtmlFileAsync(T folderId, string title, string content) { ArgumentNullException.ThrowIfNull(title); return CreateFileAsync(folderId, title, content, ".html"); } public Task> CreateTextFileAsync(T folderId, string title, string content) { ArgumentNullException.ThrowIfNull(title); //Try detect content var extension = ".txt"; if (!string.IsNullOrEmpty(content)) { if (Regex.IsMatch(content, @"<([^\s>]*)(\s[^<]*)>")) { extension = ".html"; } } return CreateFileAsync(folderId, title, content, extension); } private async Task> 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); return await _fileDtoHelper.GetAsync(file); } public Task GetEditDiffUrlAsync(T fileId, int version = 0, string doc = null) { return _fileStorageService.GetEditDiffUrlAsync(fileId, version, doc); } public async Task> GetEditHistoryAsync(T fileId, string doc = null) { var result = await _fileStorageService.GetEditHistoryAsync(fileId, doc); return result.Select(r => new EditHistoryDto(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList(); } public async Task>> GetFileVersionInfoAsync(T fileId) { var files = await _fileStorageService.GetFileHistoryAsync(fileId); var result = new List>(); foreach (var e in files) { result.Add(await _fileDtoHelper.GetAsync(e)); } return result; } public async Task> LockFileAsync(T fileId, bool lockFile) { var result = await _fileStorageService.LockFileAsync(fileId, lockFile); return await _fileDtoHelper.GetAsync(result); } public async Task> 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 EditHistoryDto(r, _apiDateTimeHelper, _userManager, _displayUserSettingsHelper)).ToList(); } public IAsyncEnumerable> StartConversionAsync(CheckConversionRequestDto cheqConversionRequestDto) { cheqConversionRequestDto.StartConvert = true; return CheckConversionAsync(cheqConversionRequestDto); } public Task UpdateCommentAsync(T fileId, int version, string comment) { return _fileStorageService.UpdateCommentAsync(fileId, version, comment); } public async Task> UpdateFileAsync(T fileId, string title, int lastVersion) { if (!string.IsNullOrEmpty(title)) { await _fileStorageService.FileRenameAsync(fileId, title); } if (lastVersion > 0) { await _fileStorageService.UpdateToVersionAsync(fileId, lastVersion); } return await GetFileInfoAsync(fileId); } public async Task> UpdateFileStreamAsync(Stream file, T fileId, string fileExtension, bool encrypted = false, bool forcesave = false) { try { var resultFile = await _fileStorageService.UpdateFileStreamAsync(fileId, file, fileExtension, encrypted, forcesave); return await _fileDtoHelper.GetAsync(resultFile); } catch (FileNotFoundException e) { throw new ItemNotFoundException("File not found", e); } } public async Task> CopyFileAsAsync(T fileId, TTemplate destFolderId, string destTitle, string password = null) { var service = _serviceProvider.GetService>(); var controller = _serviceProvider.GetService>(); var file = await _fileStorageService.GetFileAsync(fileId, -1); var ext = FileUtility.GetFileExtension(file.Title); var destExt = FileUtility.GetFileExtension(destTitle); if (ext == destExt) { var newFile = await service.CreateNewFileAsync(new FileModel { ParentId = destFolderId, Title = destTitle, TemplateId = fileId }, false); return await _fileDtoHelper.GetAsync(newFile); } using (var fileStream = await _fileConverter.ExecAsync(file, destExt, password)) { return await controller.InsertFileAsync(destFolderId, fileStream, destTitle, true); } } public async Task> DeleteFileAsync(T fileId, bool deleteAfter, bool immediately) { var result = new List(); foreach (var e in _fileStorageService.DeleteFile("delete", fileId, false, deleteAfter, immediately)) { result.Add(await _fileOperationDtoHelper.GetAsync(e)); } return result; } }