diff --git a/common.props b/common.props index 8f33a16..8610f7f 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 5.1.0 + 5.2.0-preview.1 $(NoWarn);CS1591 true EasyAbp Team diff --git a/src/EasyAbp.FileManagement.Application.Contracts/EasyAbp/FileManagement/Files/IFileAppService.cs b/src/EasyAbp.FileManagement.Application.Contracts/EasyAbp/FileManagement/Files/IFileAppService.cs index 5875277..34728e0 100644 --- a/src/EasyAbp.FileManagement.Application.Contracts/EasyAbp/FileManagement/Files/IFileAppService.cs +++ b/src/EasyAbp.FileManagement.Application.Contracts/EasyAbp/FileManagement/Files/IFileAppService.cs @@ -37,5 +37,7 @@ public interface IFileAppService : Task GetConfigurationAsync(string fileContainerName, Guid? ownerUserId); Task GetLocationAsync(Guid id); + + Task GetByPathAsync(string path, string fileContainerName, Guid? ownerUserId); } } \ No newline at end of file diff --git a/src/EasyAbp.FileManagement.Application/EasyAbp/FileManagement/Files/FileAppService.cs b/src/EasyAbp.FileManagement.Application/EasyAbp/FileManagement/Files/FileAppService.cs index a86243d..ee79ffe 100644 --- a/src/EasyAbp.FileManagement.Application/EasyAbp/FileManagement/Files/FileAppService.cs +++ b/src/EasyAbp.FileManagement.Application/EasyAbp/FileManagement/Files/FileAppService.cs @@ -456,6 +456,16 @@ public virtual async Task GetLocationAsync(Guid id) }; } + public virtual async Task GetByPathAsync(string path, string fileContainerName, Guid? ownerUserId) + { + var file = await _fileManager.GetByPathAsync(path, fileContainerName, ownerUserId); + + await AuthorizationService.CheckAsync(new FileGetInfoOperationInfoModel(file), + new OperationAuthorizationRequirement { Name = FileManagementPermissions.File.Default }); + + return await MapToGetOutputDtoAsync(file); + } + protected virtual string GenerateUniqueFileName([CanBeNull] string fileName) { return Guid.NewGuid().ToString("N") + Path.GetExtension(fileName); diff --git a/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/FileManagerBase.cs b/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/FileManagerBase.cs index fa6c0ed..19f2509 100644 --- a/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/FileManagerBase.cs +++ b/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/FileManagerBase.cs @@ -37,6 +37,8 @@ public abstract Task> CreateManyAsync(List models, public abstract Task> CreateManyAsync(List models, CancellationToken cancellationToken = default); + public abstract Task GetByPathAsync(string path, string fileContainerName, Guid? ownerUserId); + public virtual async Task GetFileLocationAsync(File file, CancellationToken cancellationToken = default) { diff --git a/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/IFileManager.cs b/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/IFileManager.cs index ab87eaf..d40bcf9 100644 --- a/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/IFileManager.cs +++ b/src/EasyAbp.FileManagement.Domain.Core/EasyAbp/FileManagement/Files/IFileManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; @@ -26,5 +27,7 @@ Task> CreateManyAsync(List models, Task GetDownloadInfoAsync(File file); Task GetFileLocationAsync(File file, CancellationToken cancellationToken = default); + + Task GetByPathAsync([NotNull] string path, [NotNull] string fileContainerName, Guid? ownerUserId); } } \ No newline at end of file diff --git a/src/EasyAbp.FileManagement.Domain.Shared/EasyAbp/FileManagement/FileManagementConsts.cs b/src/EasyAbp.FileManagement.Domain.Shared/EasyAbp/FileManagement/FileManagementConsts.cs index c0d520d..7667574 100644 --- a/src/EasyAbp.FileManagement.Domain.Shared/EasyAbp/FileManagement/FileManagementConsts.cs +++ b/src/EasyAbp.FileManagement.Domain.Shared/EasyAbp/FileManagement/FileManagementConsts.cs @@ -6,6 +6,8 @@ public static class FileManagementConsts public static int DirectoryMaxSubResourceCount { get; set; } = 99999; // todo + public static int DirectoryMaxDepth { get; set; } = 500; // todo + public static int FileContainerNameMaxLength { get; set; } = 64; public static class File diff --git a/src/EasyAbp.FileManagement.Domain/EasyAbp/FileManagement/Files/FileManager.cs b/src/EasyAbp.FileManagement.Domain/EasyAbp/FileManagement/Files/FileManager.cs index 7486049..b70236b 100644 --- a/src/EasyAbp.FileManagement.Domain/EasyAbp/FileManagement/Files/FileManager.cs +++ b/src/EasyAbp.FileManagement.Domain/EasyAbp/FileManagement/Files/FileManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -6,6 +7,7 @@ using EasyAbp.FileManagement.Options.Containers; using Microsoft.Extensions.Options; using Volo.Abp; +using Volo.Abp.Domain.Entities; using Volo.Abp.ObjectExtending; using Volo.Abp.Uow; @@ -164,6 +166,41 @@ public override async Task> CreateManyAsync(List GetByPathAsync(string path, string fileContainerName, Guid? ownerUserId) + { + Check.NotNullOrWhiteSpace(path, nameof(path)); + Check.NotNullOrWhiteSpace(fileContainerName, nameof(fileContainerName)); + + var splitFileName = path.Split(FileManagementConsts.DirectorySeparator); + + foreach (var fileName in splitFileName) + { + Check.Length(fileName, "fileName", FileManagementConsts.File.FileNameMaxLength, 1); + } + + File foundFile = null; + Guid? parentId = null; + + foreach (var fileName in splitFileName) + { + foundFile = await FileRepository.FindAsync(fileName, parentId, fileContainerName, ownerUserId); + + if (foundFile is null) + { + throw new EntityNotFoundException(typeof(File)); + } + + parentId = foundFile.Id; + } + + if (foundFile is null) + { + throw new EntityNotFoundException(typeof(File)); + } + + return foundFile; + } + protected override IFileDownloadProvider GetFileDownloadProvider(File file) { var options = LazyServiceProvider.LazyGetRequiredService>().Value; diff --git a/src/EasyAbp.FileManagement.HttpApi/EasyAbp/FileManagement/Files/FileController.cs b/src/EasyAbp.FileManagement.HttpApi/EasyAbp/FileManagement/Files/FileController.cs index 01d1661..0f7d1c0 100644 --- a/src/EasyAbp.FileManagement.HttpApi/EasyAbp/FileManagement/Files/FileController.cs +++ b/src/EasyAbp.FileManagement.HttpApi/EasyAbp/FileManagement/Files/FileController.cs @@ -211,9 +211,16 @@ public virtual async Task GetConfigurationAsyn [HttpGet] [Route("location")] - public async Task GetLocationAsync(Guid id) + public virtual Task GetLocationAsync(Guid id) { - return await _service.GetLocationAsync(id); + return _service.GetLocationAsync(id); + } + + [HttpGet] + [Route("by-path")] + public virtual Task GetByPathAsync(string path, string fileContainerName, Guid? ownerUserId) + { + return _service.GetByPathAsync(path, fileContainerName, ownerUserId); } } } \ No newline at end of file diff --git a/test/EasyAbp.FileManagement.Domain.Tests/Files/FileDomainTests.cs b/test/EasyAbp.FileManagement.Domain.Tests/Files/FileDomainTests.cs index 65a1d4a..fc240ba 100644 --- a/test/EasyAbp.FileManagement.Domain.Tests/Files/FileDomainTests.cs +++ b/test/EasyAbp.FileManagement.Domain.Tests/Files/FileDomainTests.cs @@ -192,4 +192,21 @@ public async Task Should_Get_File_Location() fileLocation.FilePath.ShouldBe("dir/sub-dir/file.txt"); fileLocation.ParentPath.ShouldBe("dir/sub-dir"); } + + [Fact] + public async Task Should_Get_File_By_Path() + { + var dir = await FileManager.CreateAsync(new CreateFileModel("test", null, "dir", null, + FileType.Directory, null, null)); + + var subDir = await FileManager.CreateAsync(new CreateFileModel("test", null, "sub-dir", null, + FileType.Directory, dir, null)); + + var file = await FileManager.CreateAsync(new CreateFileModel("test", null, "file.txt", null, + FileType.RegularFile, subDir, "new-content"u8.ToArray())); + + (await FileManager.GetByPathAsync("dir", "test", null)).Id.ShouldBe(dir.Id); + (await FileManager.GetByPathAsync("dir/sub-dir", "test", null)).Id.ShouldBe(subDir.Id); + (await FileManager.GetByPathAsync("dir/sub-dir/file.txt", "test", null)).Id.ShouldBe(file.Id); + } } \ No newline at end of file