Skip to content

Commit ac5e4a8

Browse files
committed
feat: add more method in file manager
1 parent 9fb8d37 commit ac5e4a8

File tree

8 files changed

+205
-60
lines changed

8 files changed

+205
-60
lines changed

modules/file-management/src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<Product>Passingwind.Abp.FileManagement</Product>
44
<Description>an abp module that provider file and file container management </Description>
55
<Version>0.1.0</Version>
6-
<PackageVersion>0.1.7</PackageVersion>
6+
<PackageVersion>0.1.8</PackageVersion>
77
<PackageReadmeFile>README.md</PackageReadmeFile>
88
</PropertyGroup>
99

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.IO;
3+
using System.Threading.Tasks;
4+
using Volo.Abp;
5+
using Volo.Abp.Application.Services;
6+
7+
namespace Passingwind.Abp.FileManagement.Files;
8+
9+
[IntegrationService]
10+
public interface IFileIntegrationAppService : IApplicationService
11+
{
12+
Task<FileContainerDto> GetContainerAsync(Guid id);
13+
14+
Task<FileDto> GetAsync(string containerName, Guid id);
15+
16+
Task<Stream?> GetStreamAsync(string containerName, Guid id);
17+
Task<byte[]> GetBytesAsync(string containerName, Guid id);
18+
19+
Task<FileDto> CreateByStreamAsync(string containerName, FileCreateByStreamDto input);
20+
Task<FileDto> CreateByBytesAsync(string containerName, FileCreateByBytesDto input);
21+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//using System;
2+
//using System.IO;
3+
//using System.Threading.Tasks;
4+
5+
//namespace Passingwind.Abp.FileManagement.Files;
6+
7+
//public class FileIntegrationAppService : FileManagementAppService, IFileIntegrationAppService
8+
//{
9+
// public Task<FileDto> CreateByBytesAsync(string containerName, FileCreateByBytesDto input)
10+
// {
11+
// throw new NotImplementedException();
12+
// }
13+
14+
// public Task<FileDto> CreateByStreamAsync(string containerName, FileCreateByStreamDto input)
15+
// {
16+
// throw new NotImplementedException();
17+
// }
18+
19+
// public Task<FileDto> GetAsync(string containerName, Guid id)
20+
// {
21+
// throw new NotImplementedException();
22+
// }
23+
24+
// public Task<byte[]> GetBytesAsync(string containerName, Guid id)
25+
// {
26+
// throw new NotImplementedException();
27+
// }
28+
29+
// public Task<FileContainerDto> GetContainerAsync(Guid id)
30+
// {
31+
// throw new NotImplementedException();
32+
// }
33+
34+
// public Task<Stream?> GetStreamAsync(string containerName, Guid id)
35+
// {
36+
// throw new NotImplementedException();
37+
// }
38+
//}

modules/file-management/src/Passingwind.Abp.FileManagement.Domain/BackgroundWorkers/FileShareTokenCleanupBackgroundWorker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public class FileShareTokenCleanupBackgroundWorker : AsyncPeriodicBackgroundWork
1212
{
1313
public FileShareTokenCleanupBackgroundWorker(AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory) : base(timer, serviceScopeFactory)
1414
{
15-
// 12h
16-
Timer.Period = 12 * 60 * 60 * 1000;
15+
// 6h
16+
Timer.Period = 6 * 60 * 60 * 1000;
1717
}
1818

1919
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)

modules/file-management/src/Passingwind.Abp.FileManagement.Domain/Files/FileContainerManager.cs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading;
1+
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34
using Microsoft.Extensions.Options;
45
using Passingwind.Abp.FileManagement.Options;
@@ -8,23 +9,33 @@ namespace Passingwind.Abp.FileManagement.Files;
89

910
public class FileContainerManager : DomainService
1011
{
11-
private readonly IFileContainerRepository _fileContainerRepository;
12-
private readonly FileManagementOptions _options;
12+
protected IFileContainerRepository FileContainerRepository { get; }
13+
protected FileManagementOptions FileManagementOptions { get; }
1314

1415
public FileContainerManager(IFileContainerRepository fileContainerRepository, IOptions<FileManagementOptions> options)
1516
{
16-
_fileContainerRepository = fileContainerRepository;
17-
_options = options.Value;
17+
FileContainerRepository = fileContainerRepository;
18+
FileManagementOptions = options.Value;
19+
}
20+
21+
public virtual async Task<FileContainer> GetByIdAsync(Guid id, CancellationToken cancellationToken = default)
22+
{
23+
return await FileContainerRepository.GetAsync(id, cancellationToken: cancellationToken);
24+
}
25+
26+
public virtual async Task<FileContainer> GetByNameAsync(string name, CancellationToken cancellationToken = default)
27+
{
28+
return await FileContainerRepository.GetByNameAsync(name, cancellationToken);
1829
}
1930

2031
public virtual async Task<bool> IsExistsAsync(FileContainer fileContainer, CancellationToken cancellationToken = default)
2132
{
22-
return await _fileContainerRepository.CheckExistsAsync(fileContainer, cancellationToken);
33+
return await FileContainerRepository.CheckExistsAsync(fileContainer, cancellationToken);
2334
}
2435

2536
public virtual async Task CheckExistsAsync(string name, CancellationToken cancellationToken = default)
2637
{
27-
_ = await _fileContainerRepository.GetByNameAsync(name, cancellationToken);
38+
_ = await FileContainerRepository.GetByNameAsync(name, cancellationToken);
2839
}
2940

3041
public virtual Task<FileContainer> CreateAsync(
@@ -39,15 +50,15 @@ public virtual Task<FileContainer> CreateAsync(
3950
string? prohibitedFileExtensions = null,
4051
bool? autoDeleteBlob = false)
4152
{
42-
var entity = new FileContainer(GuidGenerator.Create(), name, accessMode ?? _options.DefaultContainerAccessMode)
53+
var entity = new FileContainer(GuidGenerator.Create(), name, accessMode ?? FileManagementOptions.DefaultContainerAccessMode)
4354
{
4455
Description = description,
45-
MaximumEachFileSize = maximumEachFileSize ?? _options.DefaultMaximumFileSize,
46-
MaximumFileQuantity = maximumFileQuantity ?? _options.DefaultContainerMaximumFileQuantity,
56+
MaximumEachFileSize = maximumEachFileSize ?? FileManagementOptions.DefaultMaximumFileSize,
57+
MaximumFileQuantity = maximumFileQuantity ?? FileManagementOptions.DefaultContainerMaximumFileQuantity,
4758
AllowAnyFileExtension = allowAnyFileExtension ?? false,
48-
AllowedFileExtensions = allowedFileExtensions ?? string.Join(",", _options.DefaultAllowedFileExtensions ?? new string[0]),
49-
ProhibitedFileExtensions = prohibitedFileExtensions ?? string.Join(",", _options.DefaultProhibitedFileExtensions ?? new string[0]),
50-
OverrideBehavior = overrideBehavior ?? _options.DefaultOverrideBehavior,
59+
AllowedFileExtensions = allowedFileExtensions ?? string.Join(",", FileManagementOptions.DefaultAllowedFileExtensions ?? new string[0]),
60+
ProhibitedFileExtensions = prohibitedFileExtensions ?? string.Join(",", FileManagementOptions.DefaultProhibitedFileExtensions ?? new string[0]),
61+
OverrideBehavior = overrideBehavior ?? FileManagementOptions.DefaultOverrideBehavior,
5162
AutoDeleteBlob = autoDeleteBlob ?? false,
5263
};
5364

modules/file-management/src/Passingwind.Abp.FileManagement.Domain/Files/FileManager.cs

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ namespace Passingwind.Abp.FileManagement.Files;
1515

1616
public class FileManager : DomainService, IFileManager
1717
{
18-
private readonly IFileRepository _fileRepository;
19-
private readonly IFileContainerRepository _fileContainerRepository;
20-
private readonly IBlobContainerFactory _blobContainerFactor;
21-
private readonly IFileBlobNameGenerator _fileBlobNameGenerator;
22-
private readonly IFileHashCalculator _fileHashCalculator;
23-
private readonly IFileMimeTypeProvider _fileMimeTypeProvider;
24-
private readonly IFileUniqueIdGenerator _fileUniqueIdGenerator;
25-
private readonly IFileBlobContainerProvider _fileBlobContainerProvider;
26-
private readonly IFileDuplicateDetectionProvider _fileDuplicateDetectionProvider;
27-
private readonly FileManagementOptions _options;
18+
private IFileRepository FileRepository { get; }
19+
private IFileContainerRepository FileContainerRepository { get; }
20+
private IBlobContainerFactory BlobContainerFactor { get; }
21+
private IFileBlobNameGenerator FileBlobNameGenerator { get; }
22+
private IFileHashCalculator FileHashCalculator { get; }
23+
private IFileMimeTypeProvider FileMimeTypeProvider { get; }
24+
private IFileUniqueIdGenerator FileUniqueIdGenerator { get; }
25+
private IFileBlobContainerProvider FileBlobContainerProvider { get; }
26+
private IFileDuplicateDetectionProvider FileDuplicateDetectionProvider { get; }
27+
private FileManagementOptions FileManagementOptions { get; }
2828

2929
public FileManager(
3030
IFileRepository fileRepository,
@@ -38,19 +38,19 @@ public FileManager(
3838
IFileDuplicateDetectionProvider fileDuplicateDetectionProvider,
3939
IOptions<FileManagementOptions> options)
4040
{
41-
_fileRepository = fileRepository;
42-
_fileContainerRepository = fileContainerRepository;
43-
_blobContainerFactor = blobContainerFactor;
44-
_fileBlobNameGenerator = fileBlobNameGenerator;
45-
_fileHashCalculator = fileHashCalculator;
46-
_fileMimeTypeProvider = fileMimeTypeProvider;
47-
_fileUniqueIdGenerator = fileUniqueIdGenerator;
48-
_fileBlobContainerProvider = fileBlobContainerProvider;
49-
_fileDuplicateDetectionProvider = fileDuplicateDetectionProvider;
50-
_options = options.Value;
41+
FileRepository = fileRepository;
42+
FileContainerRepository = fileContainerRepository;
43+
BlobContainerFactor = blobContainerFactor;
44+
FileBlobNameGenerator = fileBlobNameGenerator;
45+
FileHashCalculator = fileHashCalculator;
46+
FileMimeTypeProvider = fileMimeTypeProvider;
47+
FileUniqueIdGenerator = fileUniqueIdGenerator;
48+
FileBlobContainerProvider = fileBlobContainerProvider;
49+
FileDuplicateDetectionProvider = fileDuplicateDetectionProvider;
50+
FileManagementOptions = options.Value;
5151
}
5252

53-
public async Task<File> FindFileAsync(FileContainer container, string fileName, Guid? parentId, CancellationToken cancellationToken = default)
53+
public virtual async Task<File> FindFileAsync(FileContainer container, string fileName, Guid? parentId, CancellationToken cancellationToken = default)
5454
{
5555
if (container is null)
5656
{
@@ -62,7 +62,7 @@ public async Task<File> FindFileAsync(FileContainer container, string fileName,
6262
throw new ArgumentException($"'{nameof(fileName)}' cannot be null or empty.", nameof(fileName));
6363
}
6464

65-
return await _fileRepository.FirstOrDefaultAsync(x => x.FileName == fileName && x.ParentId == parentId && x.ContainerId == container.Id && !x.IsDirectory);
65+
return await FileRepository.FirstOrDefaultAsync(x => x.FileName == fileName && x.ParentId == parentId && x.ContainerId == container.Id && !x.IsDirectory);
6666
}
6767

6868
public virtual async Task<bool> IsFileExistsAsync(FileContainer container, File file, CancellationToken cancellationToken = default)
@@ -80,7 +80,7 @@ public virtual async Task<bool> IsFileExistsAsync(FileContainer container, File
8080
if (file.IsDirectory)
8181
throw new ArgumentException();
8282

83-
return await _fileDuplicateDetectionProvider.IsExistsAsync(container, file, cancellationToken);
83+
return await FileDuplicateDetectionProvider.IsExistsAsync(container, file, cancellationToken);
8484
}
8585

8686
public virtual async Task<bool> IsDirectoryExistsAsync(FileContainer container, File file, CancellationToken cancellationToken = default)
@@ -98,7 +98,7 @@ public virtual async Task<bool> IsDirectoryExistsAsync(FileContainer container,
9898
if (!file.IsDirectory)
9999
throw new ArgumentException();
100100

101-
return await _fileDuplicateDetectionProvider.IsExistsAsync(container, file, cancellationToken);
101+
return await FileDuplicateDetectionProvider.IsExistsAsync(container, file, cancellationToken);
102102
}
103103

104104
public virtual Task CheckFileExtensionAsync(FileContainer container, File file, CancellationToken cancellationToken = default)
@@ -180,7 +180,7 @@ public virtual async Task CheckFileExistsAsync(FileContainer container, File fil
180180
}
181181
}
182182

183-
public async Task CheckDirectoryExistsAsync(FileContainer container, File entity, CancellationToken cancellationToken = default)
183+
public virtual async Task CheckDirectoryExistsAsync(FileContainer container, File entity, CancellationToken cancellationToken = default)
184184
{
185185
if (container is null)
186186
{
@@ -221,11 +221,11 @@ public virtual async Task<File> CreateFileAsync(FileContainer container, string
221221
throw new ArgumentNullException(nameof(bytes));
222222
}
223223

224-
var hash = await _fileHashCalculator.GetAsync(bytes);
224+
var hash = await FileHashCalculator.GetAsync(bytes);
225225

226226
var fileId = GuidGenerator.Create();
227-
var uniqueId = await _fileUniqueIdGenerator.CreateAsync(container, fileId);
228-
var blobName = await _fileBlobNameGenerator.CreateAsync(container.Id, fileId, uniqueId, fileName, mimeType, bytes.Length, hash);
227+
var uniqueId = await FileUniqueIdGenerator.CreateAsync(container, fileId);
228+
var blobName = await FileBlobNameGenerator.CreateAsync(container.Id, fileId, uniqueId, fileName, mimeType, bytes.Length, hash);
229229

230230
var file = new File(
231231
fileId,
@@ -243,7 +243,7 @@ public virtual async Task<File> CreateFileAsync(FileContainer container, string
243243
return file;
244244
}
245245

246-
public async Task<File> CreateDirectoryAsync(FileContainer container, string name, Guid? parentId, CancellationToken cancellationToken = default)
246+
public virtual async Task<File> CreateDirectoryAsync(FileContainer container, string name, Guid? parentId, CancellationToken cancellationToken = default)
247247
{
248248
if (container is null)
249249
{
@@ -256,8 +256,8 @@ public async Task<File> CreateDirectoryAsync(FileContainer container, string nam
256256
}
257257

258258
var fileId = GuidGenerator.Create();
259-
var uniqueId = await _fileUniqueIdGenerator.CreateAsync(container, fileId);
260-
var blobName = await _fileBlobNameGenerator.CreateAsync(container.Id, fileId, uniqueId, name, string.Empty, 0, string.Empty);
259+
var uniqueId = await FileUniqueIdGenerator.CreateAsync(container, fileId);
260+
var blobName = await FileBlobNameGenerator.CreateAsync(container.Id, fileId, uniqueId, name, string.Empty, 0, string.Empty);
261261

262262
var file = new File(
263263
fileId,
@@ -309,7 +309,7 @@ public virtual async Task<byte[]> GetFileBytesAsync(FileContainer container, Fil
309309
throw new ArgumentNullException(nameof(file));
310310
}
311311

312-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container);
312+
var blobContainer = await FileBlobContainerProvider.GetAsync(container);
313313

314314
return await blobContainer.GetAllBytesOrNullAsync(file.BlobName, cancellationToken);
315315
}
@@ -326,7 +326,7 @@ public virtual async Task<byte[]> GetFileBytesAsync(FileContainer container, Fil
326326
throw new ArgumentNullException(nameof(file));
327327
}
328328

329-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container);
329+
var blobContainer = await FileBlobContainerProvider.GetAsync(container);
330330

331331
return await blobContainer.GetOrNullAsync(file.BlobName, cancellationToken);
332332
}
@@ -348,7 +348,7 @@ public virtual async Task SaveBlobAsync(FileContainer container, File file, Stre
348348
throw new ArgumentNullException(nameof(stream));
349349
}
350350

351-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container);
351+
var blobContainer = await FileBlobContainerProvider.GetAsync(container);
352352

353353
await blobContainer.SaveAsync(file.BlobName, stream, true, cancellationToken);
354354
}
@@ -370,12 +370,12 @@ public virtual async Task SaveBlobAsync(FileContainer container, File file, byte
370370
throw new ArgumentNullException(nameof(bytes));
371371
}
372372

373-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container);
373+
var blobContainer = await FileBlobContainerProvider.GetAsync(container);
374374

375375
await blobContainer.SaveAsync(file.BlobName, bytes, true, cancellationToken);
376376
}
377377

378-
public async Task<File> ChangeFileNameAsync(FileContainer container, File file, string newName, Guid? parentId, CancellationToken cancellationToken = default)
378+
public virtual async Task<File> ChangeFileNameAsync(FileContainer container, File file, string newName, Guid? parentId, CancellationToken cancellationToken = default)
379379
{
380380
if (container == null)
381381
throw new ArgumentNullException(nameof(container));
@@ -392,43 +392,62 @@ public async Task<File> ChangeFileNameAsync(FileContainer container, File file,
392392
file.SetFileName(newName);
393393

394394
if (!file.IsDirectory)
395-
file.UpdateMimeType(_fileMimeTypeProvider.Get(newName));
395+
file.UpdateMimeType(FileMimeTypeProvider.Get(newName));
396396

397397
await CheckFileExtensionAsync(container, file);
398398

399399
return file;
400400
}
401401

402402
[UnitOfWork]
403-
public async Task DeleteAsync(FileContainer container, File file, CancellationToken cancellationToken = default)
403+
public virtual async Task DeleteAsync(FileContainer container, File file, CancellationToken cancellationToken = default)
404404
{
405-
await _fileRepository.DeleteAsync(file);
405+
await FileRepository.DeleteAsync(file);
406406

407407
if (container.AutoDeleteBlob && !file.IsDirectory)
408408
{
409-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container, cancellationToken: cancellationToken);
409+
var blobContainer = await FileBlobContainerProvider.GetAsync(container, cancellationToken: cancellationToken);
410410

411411
await blobContainer.DeleteAsync(file.BlobName, cancellationToken);
412412
}
413413
}
414414

415415
[UnitOfWork]
416-
public async Task ClearContainerFilesAsync(FileContainer container, CancellationToken cancellationToken = default)
416+
public virtual async Task ClearContainerFilesAsync(FileContainer container, CancellationToken cancellationToken = default)
417417
{
418418
// TODO: performance
419419

420-
var files = await _fileRepository.GetListAsync(containerId: container.Id, cancellationToken: cancellationToken);
420+
var files = await FileRepository.GetListAsync(containerId: container.Id, cancellationToken: cancellationToken);
421421

422422
foreach (var file in files)
423423
{
424-
await _fileRepository.DeleteAsync(file);
424+
await FileRepository.DeleteAsync(file);
425425

426426
if (container.AutoDeleteBlob && !file.IsDirectory)
427427
{
428-
var blobContainer = await _fileBlobContainerProvider.GetAsync(container, cancellationToken: cancellationToken);
428+
var blobContainer = await FileBlobContainerProvider.GetAsync(container, cancellationToken: cancellationToken);
429429

430430
await blobContainer.DeleteAsync(file.BlobName, cancellationToken);
431431
}
432432
}
433433
}
434+
435+
public async Task<byte[]> GetFileBytesByFileIdAsync(string containerName, Guid id, CancellationToken cancellationToken = default)
436+
{
437+
var container = await FileContainerRepository.GetByNameAsync(containerName, cancellationToken);
438+
var file = await FileRepository.GetAsync(id, cancellationToken: cancellationToken);
439+
return await GetFileBytesAsync(container, file, cancellationToken);
440+
}
441+
442+
public async Task<Stream?> GetFileSteamByFileIdAsync(string containerName, Guid id, CancellationToken cancellationToken = default)
443+
{
444+
var container = await FileContainerRepository.GetByNameAsync(containerName, cancellationToken);
445+
var file = await FileRepository.GetAsync(id, cancellationToken: cancellationToken);
446+
return await GetFileSteamAsync(container, file, cancellationToken);
447+
}
448+
449+
public async Task<File> GetByIdAsync(string containerName, Guid id, CancellationToken cancellationToken = default)
450+
{
451+
return await FileRepository.GetAsync(id, cancellationToken: cancellationToken);
452+
}
434453
}

0 commit comments

Comments
 (0)