diff --git a/.gitignore b/.gitignore index 0a8e0559ee40f980c98cf9af85ceef89e5cdc385..c524fb9e6a76f62d010c6ea470ea1966e71452a7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ .vs obj bin +StaticFiles diff --git a/Tsi1.Api/Tsi1.Api/Startup.cs b/Tsi1.Api/Tsi1.Api/Startup.cs index 55f7de4a151c1a5658bba8cda2ba0f6c569f4dd8..b4f76b7dec3f433980490adc5cf5a8e6439fd24c 100644 --- a/Tsi1.Api/Tsi1.Api/Startup.cs +++ b/Tsi1.Api/Tsi1.Api/Startup.cs @@ -68,7 +68,7 @@ namespace Tsi1.Api services.AddSingleton<IJwtAuthManager, JwtAuthManager>(); services.AddHostedService<JwtRefreshTokenCache>(); services.AddHostedService<JwtVerificationCodeCache>(); - services.AddHostedService<FileCleanerService>(); + services.AddHostedService<FileCleaner>(); services.AddSingleton<IMessageService, MessageService>(); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleaner.cs b/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleaner.cs new file mode 100644 index 0000000000000000000000000000000000000000..7a5df1102adad587acc45fa417539d77993de5fa --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleaner.cs @@ -0,0 +1,54 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Tsi1.BusinessLayer.Interfaces; + +namespace Tsi1.BusinessLayer.HostedServices +{ + public class FileCleaner : IHostedService, IDisposable + { + private Timer _timer; + private readonly IServiceScopeFactory _serviceScopeFactory; + + public FileCleaner(IServiceScopeFactory serviceScopeFactory) + { + _serviceScopeFactory = serviceScopeFactory; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromDays(1)); + return Task.CompletedTask; + } + + private async void DoWork(object state) + { + using (var scope = _serviceScopeFactory.CreateScope()) + { + var fileService = scope.ServiceProvider.GetRequiredService<IFileService>(); + var dbFileNames = await fileService.GetFileNames(); + var fsFiles = fileService.GetPhysicalFiles(); + + var filesToDelete = fsFiles.Except(dbFileNames); + foreach (var file in filesToDelete) + { + fileService.DeleteFile(file); + } + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + _timer?.Change(Timeout.Infinite, 0); + return Task.CompletedTask; + } + + public void Dispose() + { + _timer?.Dispose(); + } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleanerService.cs b/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleanerService.cs deleted file mode 100644 index 0a95d33dacd68f459f355c1ad2a75c12e0caa878..0000000000000000000000000000000000000000 --- a/Tsi1.Api/Tsi1.BusinessLayer/HostedServices/FileCleanerService.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Tsi1.BusinessLayer.Interfaces; - -namespace Tsi1.BusinessLayer.HostedServices -{ - public class FileCleanerService : IHostedService, IDisposable - { - private Timer _timer; - private readonly IFileService _fileService; - - public FileCleanerService(IFileService fileService) - { - _fileService = fileService; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - private void DoWork(object state) - { - - } - - public Task StopAsync(CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public void Dispose() - { - _timer?.Dispose(); - } - } -} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IFileService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IFileService.cs index fce0c43ab62d1ecbc8bff98a6292ccf1b320cb2e..c0392df3d36d9d1f8f0e6af98659f92b49b1d438 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IFileService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IFileService.cs @@ -14,5 +14,6 @@ namespace Tsi1.BusinessLayer.Interfaces Task<List<string>> GetFileNames(); ServiceResult<bool> DeleteFile(string filePath); bool ExistFile(string relativePath); + List<string> GetPhysicalFiles(); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs index 2fd8e7295993c8a9c6fd911da30a4d3590f99501..304ed2561ed50cb60bb7683252d89a6320204638 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs @@ -19,9 +19,7 @@ namespace Tsi1.BusinessLayer.Services public class FileService : IFileService { private readonly Tsi1Context _context; - private readonly IMapper _mapper; - private readonly string _path; public FileService(Tsi1Context context, IMapper mapper, IHostingEnvironment hostingEnvironment) @@ -108,21 +106,22 @@ namespace Tsi1.BusinessLayer.Services return System.IO.File.Exists(path); } + public async Task<List<string>> GetFileNames() + { + return await _context.Files.Select(x => x.Path).ToListAsync(); + } + + public List<string> GetPhysicalFiles() + { + return Directory.GetFiles(_path, "*", SearchOption.AllDirectories).ToList(); + } + private string GenerateFileName(IFormFile file) { var ext = file.FileName.Split(".").Last(); var fileName = Guid.NewGuid().ToString(); - return fileName + "." + ext; } - public async Task<List<string>> GetFileNames() - { - var fileNames = await _context.Files.Select(x => Path.GetFileName(x.Path)).ToListAsync(); - - fileNames.RemoveAll(x => x.Length == 0); - - return fileNames; - } } }