2022-03-15 18:00:53 +00:00
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
2022-06-16 08:13:53 +00:00
using AutoMapper ;
2022-03-15 18:00:53 +00:00
namespace ASC.Files.Api ;
2022-05-23 15:48:23 +00:00
2022-03-14 10:57:59 +00:00
[ConstraintRoute("int")]
2022-05-23 15:48:23 +00:00
public class FilesControllerInternal : FilesController < int >
2022-03-03 17:33:11 +00:00
{
2022-06-16 08:13:53 +00:00
public FilesControllerInternal (
FilesControllerHelper < int > filesControllerHelper ,
FileStorageService < int > fileStorageService ,
IMapper mapper )
: base ( filesControllerHelper , fileStorageService , mapper )
2022-05-23 15:48:23 +00:00
{
}
}
public class FilesControllerThirdparty : FilesController < string >
{
2022-06-16 08:13:53 +00:00
public FilesControllerThirdparty (
FilesControllerHelper < string > filesControllerHelper ,
FileStorageService < string > fileStorageService ,
IMapper mapper )
: base ( filesControllerHelper , fileStorageService , mapper )
2022-05-23 15:48:23 +00:00
{
}
}
2022-03-21 16:03:57 +00:00
2022-04-01 12:17:46 +00:00
public abstract class FilesController < T > : ApiControllerBase
{
private readonly FilesControllerHelper < T > _filesControllerHelper ;
2022-06-16 08:13:53 +00:00
private readonly FileStorageService < T > _fileStorageService ;
private readonly IMapper _mapper ;
public FilesController ( FilesControllerHelper < T > filesControllerHelper , FileStorageService < T > fileStorageService , IMapper mapper )
2022-04-01 12:17:46 +00:00
{
_filesControllerHelper = filesControllerHelper ;
2022-06-16 08:13:53 +00:00
_fileStorageService = fileStorageService ;
_mapper = mapper ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Change version history
/// </summary>
/// <param name="fileId">File ID</param>
/// <param name="version">Version of history</param>
/// <param name="continueVersion">Mark as version or revision</param>
/// <category>Files</category>
/// <returns></returns>
2022-05-23 15:48:23 +00:00
[HttpPut("file/{fileId}/history")]
2022-05-17 09:29:24 +00:00
public Task < IEnumerable < FileDto < T > > > ChangeHistoryAsync ( T fileId , ChangeHistoryRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . ChangeHistoryAsync ( fileId , inDto . Version , inDto . ContinueVersion ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Check conversion status
/// </summary>
/// <short>Convert</short>
/// <category>File operations</category>
/// <param name="fileId"></param>
/// <param name="start"></param>
/// <returns>Operation result</returns>
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}/checkconversion")]
2022-03-14 10:57:59 +00:00
public IAsyncEnumerable < ConversationResultDto < T > > CheckConversionAsync ( T fileId , bool start )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . CheckConversionAsync ( new CheckConversionRequestDto < T > ( )
2022-03-03 17:33:11 +00:00
{
FileId = fileId ,
StartConvert = start
} ) ;
2022-06-05 15:44:37 +00:00
}
[HttpGet("file/{fileId}/presigneduri")]
public async Task < string > GetPresignedUri ( T fileId )
{
return await _filesControllerHelper . GetPresignedUri ( fileId ) ;
}
2022-03-03 17:33:11 +00:00
2022-05-23 15:48:23 +00:00
[HttpPost("file/{fileId}/copyas", Order = int.MaxValue)]
2022-05-17 09:29:24 +00:00
public async Task < FileEntryDto > CopyFileAs ( T fileId , CopyAsRequestDto < JsonElement > inDto )
{
if ( inDto . DestFolderId . ValueKind = = JsonValueKind . Number )
{
return await _filesControllerHelper . CopyFileAsAsync ( fileId , inDto . DestFolderId . GetInt32 ( ) , inDto . DestTitle , inDto . Password ) ;
}
else if ( inDto . DestFolderId . ValueKind = = JsonValueKind . String )
{
return await _filesControllerHelper . CopyFileAsAsync ( fileId , inDto . DestFolderId . GetString ( ) , inDto . DestTitle , inDto . Password ) ;
}
2022-03-03 17:33:11 +00:00
2022-05-17 09:29:24 +00:00
return null ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Creates a new file in the specified folder with the title sent in the request
/// </summary>
/// <short>Create file</short>
/// <category>File Creation</category>
/// <param name="folderId">Folder ID</param>
/// <param name="title" remark="Allowed values: the file must have one of the following extensions: DOCX, XLSX, PPTX">File title</param>
/// <remarks>In case the extension for the file title differs from DOCX/XLSX/PPTX and belongs to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not set or is unknown, the DOCX extension will be added to the file title.</remarks>
/// <returns>New file info</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("{folderId}/file")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < T > > CreateFileAsync ( T folderId , CreateFileRequestDto < JsonElement > inDto )
2022-03-03 17:33:11 +00:00
{
2022-04-21 19:36:29 +00:00
return _filesControllerHelper . CreateFileAsync ( folderId , inDto . Title , inDto . TemplateId , inDto . FormId , inDto . EnableExternalExt ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Creates an html (.html) file in the selected folder with the title and contents sent in the request
/// </summary>
/// <short>Create html</short>
/// <category>File Creation</category>
/// <param name="folderId">Folder ID</param>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("{folderId}/html")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < T > > CreateHtmlFileAsync ( T folderId , CreateTextOrHtmlFileRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . CreateHtmlFileAsync ( folderId , inDto . Title , inDto . Content ) ;
2022-05-17 09:29:24 +00:00
}
2022-03-03 17:33:11 +00:00
/// <summary>
/// Creates a text (.txt) file in the selected folder with the title and contents sent in the request
/// </summary>
/// <short>Create txt</short>
/// <category>File Creation</category>
/// <param name="folderId">Folder ID</param>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("{folderId}/text")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < T > > CreateTextFileAsync ( T folderId , CreateTextOrHtmlFileRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . CreateTextFileAsync ( folderId , inDto . Title , inDto . Content ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Deletes the file with the ID specified in the request
/// </summary>
/// <short>Delete file</short>
/// <category>Files</category>
/// <param name="fileId">File ID</param>
/// <param name="deleteAfter">Delete after finished</param>
/// <param name="immediately">Don't move to the Recycle Bin</param>
/// <returns>Operation result</returns>
2022-05-23 15:48:23 +00:00
[HttpDelete("file/{fileId}")]
2022-03-14 10:57:59 +00:00
public Task < IEnumerable < FileOperationDto > > DeleteFile ( T fileId , [ FromBody ] DeleteRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . DeleteFileAsync ( fileId , inDto . DeleteAfter , inDto . Immediately ) ;
2022-03-03 17:33:11 +00:00
}
[AllowAnonymous]
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}/edit/diff")]
2022-03-14 10:57:59 +00:00
public Task < EditHistoryDataDto > GetEditDiffUrlAsync ( T fileId , int version = 0 , string doc = null )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . GetEditDiffUrlAsync ( fileId , version , doc ) ;
2022-03-03 17:33:11 +00:00
}
[AllowAnonymous]
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}/edit/history")]
2022-03-14 10:57:59 +00:00
public Task < List < EditHistoryDto > > GetEditHistoryAsync ( T fileId , string doc = null )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . GetEditHistoryAsync ( fileId , doc ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Returns a detailed information about the file with the ID specified in the request
/// </summary>
/// <short>File information</short>
/// <category>Files</category>
/// <returns>File info</returns>
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}")]
2022-03-14 10:57:59 +00:00
public Task < FileDto < T > > GetFileInfoAsync ( T fileId , int version = - 1 )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . GetFileInfoAsync ( fileId , version ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Returns the detailed information about all the available file versions with the ID specified in the request
/// </summary>
/// <short>File versions</short>
/// <category>Files</category>
/// <param name="fileId">File ID</param>
/// <returns>File information</returns>
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}/history")]
2022-03-14 10:57:59 +00:00
public Task < IEnumerable < FileDto < T > > > GetFileVersionInfoAsync ( T fileId )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . GetFileVersionInfoAsync ( fileId ) ;
2022-03-03 17:33:11 +00:00
}
2022-05-23 15:48:23 +00:00
[HttpPut("file/{fileId}/lock")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < T > > LockFileAsync ( T fileId , LockFileRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . LockFileAsync ( fileId , inDto . LockFile ) ;
2022-03-03 17:33:11 +00:00
}
[AllowAnonymous]
2022-05-23 15:48:23 +00:00
[HttpGet("file/{fileId}/restoreversion")]
2022-03-14 10:57:59 +00:00
public Task < List < EditHistoryDto > > RestoreVersionAsync ( T fileId , int version = 0 , string url = null , string doc = null )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . RestoreVersionAsync ( fileId , version , url , doc ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Start conversion
/// </summary>
/// <short>Convert</short>
/// <category>File operations</category>
/// <param name="fileId"></param>
/// <returns>Operation result</returns>
2022-05-23 15:48:23 +00:00
[HttpPut("file/{fileId}/checkconversion")]
2022-03-14 10:57:59 +00:00
public IAsyncEnumerable < ConversationResultDto < T > > StartConversion ( T fileId , [ FromBody ( EmptyBodyBehavior = Microsoft . AspNetCore . Mvc . ModelBinding . EmptyBodyBehavior . Allow ) ] CheckConversionRequestDto < T > inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-05 14:41:47 +00:00
if ( inDto = = null )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
inDto = new CheckConversionRequestDto < T > ( ) ;
2022-03-03 17:33:11 +00:00
}
2022-03-05 14:41:47 +00:00
inDto . FileId = fileId ;
2022-03-08 17:37:23 +00:00
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . StartConversionAsync ( inDto ) ;
2022-03-03 17:33:11 +00:00
}
2022-05-23 15:48:23 +00:00
[HttpPut("file/{fileId}/comment")]
2022-05-17 09:29:24 +00:00
public async Task < object > UpdateCommentAsync ( T fileId , UpdateCommentRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return await _filesControllerHelper . UpdateCommentAsync ( fileId , inDto . Version , inDto . Comment ) ;
2022-03-03 17:33:11 +00:00
}
/// <summary>
/// Updates the information of the selected file with the parameters specified in the request
/// </summary>
/// <short>Update file info</short>
/// <category>Files</category>
/// <param name="fileId">File ID</param>
/// <param name="title">New title</param>
/// <param name="lastVersion">File last version number</param>
/// <returns>File info</returns>
2022-05-23 15:48:23 +00:00
[HttpPut("file/{fileId}")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < T > > UpdateFileAsync ( T fileId , UpdateFileRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . UpdateFileAsync ( fileId , inDto . Title , inDto . LastVersion ) ;
2022-05-17 09:29:24 +00:00
}
2022-03-03 17:33:11 +00:00
/// <summary>
///
/// </summary>
/// <param name="file"></param>
/// <param name="fileId"></param>
/// <param name="encrypted"></param>
/// <returns></returns>
/// <visible>false</visible>
2022-05-23 15:48:23 +00:00
[HttpPut("{fileId}/update")]
2022-03-14 10:57:59 +00:00
public Task < FileDto < T > > UpdateFileStreamFromFormAsync ( T fileId , [ FromForm ] FileStreamRequestDto inDto )
2022-03-03 17:33:11 +00:00
{
2022-03-14 10:57:59 +00:00
return _filesControllerHelper . UpdateFileStreamAsync ( _filesControllerHelper . GetFileFromRequest ( inDto ) . OpenReadStream ( ) , fileId , inDto . FileExtension , inDto . Encrypted , inDto . Forcesave ) ;
2022-06-16 08:13:53 +00:00
}
[HttpGet("{fileId}/properties")]
public async Task < EntryPropertiesRequestDto > GetProperties ( T fileId )
{
return _mapper . Map < EntryProperties , EntryPropertiesRequestDto > ( await _fileStorageService . GetFileProperties ( fileId ) ) ;
}
[HttpPut("{fileId}/properties")]
public Task < EntryProperties > SetProperties ( T fileId , EntryPropertiesRequestDto fileProperties )
{
return _fileStorageService . SetFileProperties ( fileId , _mapper . Map < EntryPropertiesRequestDto , EntryProperties > ( fileProperties ) ) ;
2022-03-03 17:33:11 +00:00
}
2022-03-14 10:57:59 +00:00
}
public class FilesControllerCommon : ApiControllerBase
2022-06-16 08:13:53 +00:00
{
private readonly IMapper _mapper ;
private readonly IServiceScopeFactory _serviceScopeFactory ;
2022-03-14 10:57:59 +00:00
private readonly GlobalFolderHelper _globalFolderHelper ;
private readonly FileStorageService < string > _fileStorageServiceThirdparty ;
private readonly FilesControllerHelper < int > _filesControllerHelperInternal ;
2022-06-16 08:13:53 +00:00
public FilesControllerCommon (
IMapper mapper ,
IServiceScopeFactory serviceScopeFactory ,
2022-03-14 10:57:59 +00:00
GlobalFolderHelper globalFolderHelper ,
FileStorageService < string > fileStorageServiceThirdparty ,
FilesControllerHelper < int > filesControllerHelperInternal )
2022-06-16 08:13:53 +00:00
{
_mapper = mapper ;
_serviceScopeFactory = serviceScopeFactory ;
2022-03-14 10:57:59 +00:00
_globalFolderHelper = globalFolderHelper ;
_fileStorageServiceThirdparty = fileStorageServiceThirdparty ;
_filesControllerHelperInternal = filesControllerHelperInternal ;
}
/// <summary>
/// Creates a new file in the 'My Documents' section with the title sent in the request
/// </summary>
/// <short>Create file</short>
/// <category>File Creation</category>
/// <param name="title" remark="Allowed values: the file must have one of the following extensions: DOCX, XLSX, PPTX">File title</param>
/// <remarks>In case the extension for the file title differs from DOCX/XLSX/PPTX and belongs to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not set or is unknown, the DOCX extension will be added to the file title.</remarks>
/// <returns>New file info</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("@my/file")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < int > > CreateFileAsync ( CreateFileRequestDto < JsonElement > inDto )
2022-03-14 10:57:59 +00:00
{
2022-04-21 19:36:29 +00:00
return _filesControllerHelperInternal . CreateFileAsync ( _globalFolderHelper . FolderMy , inDto . Title , inDto . TemplateId , inDto . FormId , inDto . EnableExternalExt ) ;
2022-03-14 10:57:59 +00:00
}
/// <summary>
/// Creates an html (.html) file in 'Common Documents' section with the title and contents sent in the request
/// </summary>
/// <short>Create html in 'Common'</short>
/// <category>File Creation</category>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("@common/html")]
2022-05-17 09:29:24 +00:00
public async Task < FileDto < int > > CreateHtmlFileInCommonAsync ( CreateTextOrHtmlFileRequestDto inDto )
2022-03-14 10:57:59 +00:00
{
return await _filesControllerHelperInternal . CreateHtmlFileAsync ( await _globalFolderHelper . FolderCommonAsync , inDto . Title , inDto . Content ) ;
}
/// <summary>
/// Creates an html (.html) file in 'My Documents' section with the title and contents sent in the request
/// </summary>
/// <short>Create html in 'My'</short>
/// <category>File Creation</category>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("@my/html")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < int > > CreateHtmlFileInMyAsync ( CreateTextOrHtmlFileRequestDto inDto )
2022-03-14 10:57:59 +00:00
{
return _filesControllerHelperInternal . CreateHtmlFileAsync ( _globalFolderHelper . FolderMy , inDto . Title , inDto . Content ) ;
}
/// <summary>
/// Creates a text (.txt) file in 'Common Documents' section with the title and contents sent in the request
/// </summary>
/// <short>Create txt in 'Common'</short>
/// <category>File Creation</category>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("@common/text")]
2022-05-17 09:29:24 +00:00
public async Task < FileDto < int > > CreateTextFileInCommonAsync ( CreateTextOrHtmlFileRequestDto inDto )
2022-03-14 10:57:59 +00:00
{
return await _filesControllerHelperInternal . CreateTextFileAsync ( await _globalFolderHelper . FolderCommonAsync , inDto . Title , inDto . Content ) ;
}
/// <summary>
/// Creates a text (.txt) file in 'My Documents' section with the title and contents sent in the request
/// </summary>
/// <short>Create txt in 'My'</short>
/// <category>File Creation</category>
/// <param name="title">File title</param>
/// <param name="content">File contents</param>
/// <returns>Folder contents</returns>
2022-05-23 15:48:23 +00:00
[HttpPost("@my/text")]
2022-05-17 09:29:24 +00:00
public Task < FileDto < int > > CreateTextFileInMyAsync ( CreateTextOrHtmlFileRequestDto inDto )
2022-03-14 10:57:59 +00:00
{
return _filesControllerHelperInternal . CreateTextFileAsync ( _globalFolderHelper . FolderMy , inDto . Title , inDto . Content ) ;
}
2022-05-23 15:48:23 +00:00
[HttpPost("thumbnails")]
2022-05-17 09:29:24 +00:00
public Task < IEnumerable < JsonElement > > CreateThumbnailsAsync ( BaseBatchRequestDto inDto )
2022-03-14 10:57:59 +00:00
{
return _fileStorageServiceThirdparty . CreateThumbnailsAsync ( inDto . FileIds . ToList ( ) ) ;
2022-06-05 15:44:37 +00:00
}
2022-06-16 08:13:53 +00:00
[HttpPut("batch/properties")]
public async Task < List < EntryProperties > > SetProperties ( BatchEntryPropertiesRequestDto batchEntryPropertiesRequestDto )
2022-06-05 15:44:37 +00:00
{
2022-06-16 08:13:53 +00:00
var result = new List < EntryProperties > ( ) ;
2022-06-05 15:44:37 +00:00
2022-06-16 08:13:53 +00:00
foreach ( var fileId in batchEntryPropertiesRequestDto . FilesId )
{
2022-06-05 15:44:37 +00:00
2022-06-16 08:13:53 +00:00
if ( fileId . ValueKind = = JsonValueKind . String )
{
await AddProps ( fileId . GetString ( ) ) ;
}
else if ( fileId . ValueKind = = JsonValueKind . String )
{
await AddProps ( fileId . GetInt32 ( ) ) ;
}
}
2022-06-05 15:44:37 +00:00
2022-06-16 08:13:53 +00:00
return result ;
2022-06-05 15:44:37 +00:00
2022-06-16 08:13:53 +00:00
async Task AddProps < T > ( T fileId )
2022-06-05 15:44:37 +00:00
{
2022-06-16 08:13:53 +00:00
using var scope = _serviceScopeFactory . CreateScope ( ) ;
var fileStorageService = scope . ServiceProvider . GetRequiredService < FileStorageService < T > > ( ) ;
var props = _mapper . Map < EntryPropertiesRequestDto , EntryProperties > ( batchEntryPropertiesRequestDto . FileProperties ) ;
if ( batchEntryPropertiesRequestDto . CreateSubfolder )
2022-06-05 15:44:37 +00:00
{
2022-06-16 08:13:53 +00:00
var file = await fileStorageService . GetFileAsync ( fileId , - 1 ) . NotFoundIfNull ( "File not found" ) ;
props . FormFilling . CreateFolderTitle = Path . GetFileNameWithoutExtension ( file . Title ) ;
2022-06-05 15:44:37 +00:00
}
2022-06-16 08:13:53 +00:00
result . Add ( await fileStorageService . SetFileProperties ( fileId , props ) ) ;
2022-06-05 15:44:37 +00:00
}
2022-03-14 10:57:59 +00:00
}
2022-03-03 17:33:11 +00:00
}