From 1458c76c8d09f5027812e55413c8978673565391 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 8 Nov 2023 17:12:53 +0500 Subject: [PATCH 1/8] =?UTF-8?q?=D0=A4=D0=BE=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5?= =?UTF-8?q?=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20(=D1=82=D0=B5=D1=85,=20=D0=B4?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=20=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=D0=B5=2030=20=D0=B4=D0=BD=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BE=D1=82=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IReportService.cs | 8 ++++ .../Repository/FileRepository.cs | 14 +++---- .../Services/ReportService.cs | 41 +++++++++++++++++-- AsbCloudInfrastructure/Startup.cs | 1 + 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 1f4a7d35..de8896b9 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -57,5 +57,13 @@ namespace AsbCloudApp.Services /// /// Task> GetAllReportsByWellAsync(int idWell, CancellationToken token); + + /// + /// Удаление отчетов, с момента загрузки которых прошло n дней + /// + /// период, за который отчеты хранятся на сервере и при превышении которого удаляются + /// + /// + Task DeleteAllOldReportsAsync(int days, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index e75e7691..cafc5649 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -147,17 +147,17 @@ namespace AsbCloudInfrastructure.Repository public async Task> DeleteAsync(IEnumerable ids, CancellationToken token) { var query = dbSetConfigured - .Where(f => ids.Contains(f.Id) && f.IsDeleted); + .Where(f => ids.Contains(f.Id)); - var files = await query.ToListAsync(token); + var files = await query.ToListAsync(token); - var filesDtos = files.Select(x => Convert(x)); + var filesDtos = files.Select(x => Convert(x)); - db.Files.RemoveRange(query); - await db.SaveChangesAsync(token).ConfigureAwait(false); + db.Files.RemoveRange(query); + await db.SaveChangesAsync(token).ConfigureAwait(false); - return filesDtos; - } + return filesDtos; + } public async Task GetByMarkId(int idMark, CancellationToken token) { diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index ed24bc3e..ce9e57c9 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -18,22 +18,39 @@ namespace AsbCloudInfrastructure.Services public class ReportService : IReportService { + public class WorkToDeleteOldReports : Work + { + public WorkToDeleteOldReports() + : base("work to delete reports older than 30 days") + { + Timeout = TimeSpan.FromMinutes(10); + } + + protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) + { + var reportService = services.GetRequiredService(); + await reportService.DeleteAllOldReportsAsync(-30, token); + } + } private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; + private readonly FileService fileService; private readonly IWellService wellService; private readonly BackgroundWorker backgroundWorkerService; public int ReportCategoryId { get; private set; } public ReportService(IAsbCloudDbContext db, - ITelemetryService telemetryService, - IWellService wellService, + ITelemetryService telemetryService, + IWellService wellService, + FileService fileService, BackgroundWorker backgroundWorkerService) { this.db = db; this.wellService = wellService; this.backgroundWorkerService = backgroundWorkerService; this.telemetryService = telemetryService; + this.fileService = fileService; ReportCategoryId = db.FileCategories .AsNoTracking() .First(c => c.Name.Equals("Рапорт")) @@ -69,7 +86,7 @@ namespace AsbCloudInfrastructure.Services progressHandler.Invoke(arg, id); }; generator.Make(reportFileName); - + var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; progressHandler.Invoke(new @@ -186,6 +203,24 @@ namespace AsbCloudInfrastructure.Services return generator; } + + public async Task DeleteAllOldReportsAsync(int days, CancellationToken token) + { + var reports = db.ReportProperties + .Include(r => r.File) + .Where(r => r.File.UploadDate.Date < DateTime.UtcNow.Date.AddDays(days)) + .AsNoTracking(); + + var files = await reports.Select(r => r.IdFile).ToListAsync(token); + if (files.Any()) + { + await fileService.DeleteAsync(files, token); + } + + db.ReportProperties.RemoveRange(reports); + + return await db.SaveChangesAsync(token); + } } } diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 8661c651..be1c461b 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -29,6 +29,7 @@ namespace AsbCloudInfrastructure _ = provider.GetRequiredService>(); var backgroundWorker = provider.GetRequiredService(); + backgroundWorker.Add(TimeSpan.FromDays(1)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(15)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); From 6380f21472f54b8daab29a425c8b1c92472a1993 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 9 Nov 2023 09:31:50 +0500 Subject: [PATCH 2/8] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/ReportService.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index ce9e57c9..b13e82f5 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -214,12 +214,9 @@ namespace AsbCloudInfrastructure.Services var files = await reports.Select(r => r.IdFile).ToListAsync(token); if (files.Any()) { - await fileService.DeleteAsync(files, token); + return await fileService.DeleteAsync(files, token); } - - db.ReportProperties.RemoveRange(reports); - - return await db.SaveChangesAsync(token); + return 0; } } From a60ee7766bfe9ddcb02c688714f8d45c75a18a71 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 9 Nov 2023 10:20:09 +0500 Subject: [PATCH 3/8] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0,=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D1=8F=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/ReportService.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index b13e82f5..cca08fe6 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -206,15 +206,13 @@ namespace AsbCloudInfrastructure.Services public async Task DeleteAllOldReportsAsync(int days, CancellationToken token) { - var reports = db.ReportProperties - .Include(r => r.File) + var fileIds = db.ReportProperties .Where(r => r.File.UploadDate.Date < DateTime.UtcNow.Date.AddDays(days)) - .AsNoTracking(); + .Select(r => r.IdFile); - var files = await reports.Select(r => r.IdFile).ToListAsync(token); - if (files.Any()) + if (fileIds.Any()) { - return await fileService.DeleteAsync(files, token); + return await fileService.DeleteAsync(fileIds, token); } return 0; } From 66c0e6ad65f4d252f78995794865e05c17496d3e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 10 Nov 2023 10:11:36 +0500 Subject: [PATCH 4/8] =?UTF-8?q?=D0=9A=D0=BB=D0=B0=D1=81=D1=81=20WorkToDele?= =?UTF-8?q?teOldReports=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Background/WorkToDeleteOldReports.cs | 23 +++++++++++++++++++ .../Services/ReportService.cs | 14 ----------- AsbCloudInfrastructure/Startup.cs | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs diff --git a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs new file mode 100644 index 00000000..8dc0f422 --- /dev/null +++ b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Services; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Background +{ + public class WorkToDeleteOldReports : Work + { + public WorkToDeleteOldReports() + : base("work to delete reports older than 30 days") + { + Timeout = TimeSpan.FromMinutes(10); + } + + protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) + { + var reportService = services.GetRequiredService(); + await reportService.DeleteAllOldReportsAsync(-30, token); + } + } +} diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index cca08fe6..a1afc26f 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -18,20 +18,6 @@ namespace AsbCloudInfrastructure.Services public class ReportService : IReportService { - public class WorkToDeleteOldReports : Work - { - public WorkToDeleteOldReports() - : base("work to delete reports older than 30 days") - { - Timeout = TimeSpan.FromMinutes(10); - } - - protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) - { - var reportService = services.GetRequiredService(); - await reportService.DeleteAllOldReportsAsync(-30, token); - } - } private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; private readonly FileService fileService; diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index be1c461b..893a3237 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -29,7 +29,7 @@ namespace AsbCloudInfrastructure _ = provider.GetRequiredService>(); var backgroundWorker = provider.GetRequiredService(); - backgroundWorker.Add(TimeSpan.FromDays(1)); + backgroundWorker.Add(TimeSpan.FromDays(1)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(15)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); From de59cb5f852b6488864de18611c23d9eda92123e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 10 Nov 2023 10:11:57 +0500 Subject: [PATCH 5/8] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D1=83=20WorkToDeleteOldReports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Background/WorkToDeleteOldReports.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs index 8dc0f422..0208dd14 100644 --- a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs +++ b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs @@ -6,6 +6,9 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background { + /// + /// Задача по удалению загруженных отчетов + /// public class WorkToDeleteOldReports : Work { public WorkToDeleteOldReports() @@ -14,6 +17,14 @@ namespace AsbCloudInfrastructure.Background Timeout = TimeSpan.FromMinutes(10); } + /// + /// Удаление отчетов, загруженных ранее 30 дней от текущей даты + /// + /// + /// + /// + /// + /// protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { var reportService = services.GetRequiredService(); From 0735526c70460e43d96c6db1a38f538b23ce7fbe Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 10 Nov 2023 15:39:52 +0500 Subject: [PATCH 6/8] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E,=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20lifetime=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=B0=20TimeSpan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IReportService.cs | 4 ++-- AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs | 2 +- AsbCloudInfrastructure/Services/ReportService.cs | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index de8896b9..f5096a78 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -61,9 +61,9 @@ namespace AsbCloudApp.Services /// /// Удаление отчетов, с момента загрузки которых прошло n дней /// - /// период, за который отчеты хранятся на сервере и при превышении которого удаляются + /// период хранения на сервере скачанных отчетов /// /// - Task DeleteAllOldReportsAsync(int days, CancellationToken token); + Task DeleteAllOldReportsAsync(TimeSpan lifetime, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs index 0208dd14..683a7ee6 100644 --- a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs +++ b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs @@ -28,7 +28,7 @@ namespace AsbCloudInfrastructure.Background protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { var reportService = services.GetRequiredService(); - await reportService.DeleteAllOldReportsAsync(-30, token); + await reportService.DeleteAllOldReportsAsync(new TimeSpan(30, 0, 0, 0), token); } } } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index a1afc26f..0b9da1a1 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -190,10 +190,11 @@ namespace AsbCloudInfrastructure.Services return generator; } - public async Task DeleteAllOldReportsAsync(int days, CancellationToken token) + public async Task DeleteAllOldReportsAsync(TimeSpan lifetime, CancellationToken token) { + var lifeTimeStartDate = DateTime.UtcNow.Date.Add(-lifetime); var fileIds = db.ReportProperties - .Where(r => r.File.UploadDate.Date < DateTime.UtcNow.Date.AddDays(days)) + .Where(r => r.File.UploadDate.Date < lifeTimeStartDate) .Select(r => r.IdFile); if (fileIds.Any()) From 39bd3f54e397553b7a6aa652efff47c23735c504 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 10 Nov 2023 15:43:09 +0500 Subject: [PATCH 7/8] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B9=20=D0=BA=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=20DeleteAllOldReportsAsync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IReportService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index f5096a78..85d72020 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -59,9 +59,9 @@ namespace AsbCloudApp.Services Task> GetAllReportsByWellAsync(int idWell, CancellationToken token); /// - /// Удаление отчетов, с момента загрузки которых прошло n дней + /// Удаление отчетов, если превышен их период хранения /// - /// период хранения на сервере скачанных отчетов + /// период хранения отчетов /// /// Task DeleteAllOldReportsAsync(TimeSpan lifetime, CancellationToken token); From c34d6d39f56cfc0f076c87b5c7869354f4cc85e9 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 10 Nov 2023 16:34:15 +0500 Subject: [PATCH 8/8] ReportService.DeleteAllOldReportsAsync(..) optimize EF queries --- .../Background/WorkToDeleteOldReports.cs | 2 +- AsbCloudInfrastructure/Services/ReportService.cs | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs index 683a7ee6..fb49caab 100644 --- a/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs +++ b/AsbCloudInfrastructure/Background/WorkToDeleteOldReports.cs @@ -28,7 +28,7 @@ namespace AsbCloudInfrastructure.Background protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { var reportService = services.GetRequiredService(); - await reportService.DeleteAllOldReportsAsync(new TimeSpan(30, 0, 0, 0), token); + await reportService.DeleteAllOldReportsAsync(TimeSpan.FromDays(30), token); } } } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 0b9da1a1..a4f659f8 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -192,17 +192,13 @@ namespace AsbCloudInfrastructure.Services public async Task DeleteAllOldReportsAsync(TimeSpan lifetime, CancellationToken token) { - var lifeTimeStartDate = DateTime.UtcNow.Date.Add(-lifetime); - var fileIds = db.ReportProperties + var lifeTimeStartDate = DateTime.UtcNow.Date - lifetime; + var fileIds = await db.ReportProperties .Where(r => r.File.UploadDate.Date < lifeTimeStartDate) - .Select(r => r.IdFile); + .Select(r => r.IdFile) + .ToArrayAsync(token); - if (fileIds.Any()) - { - return await fileService.DeleteAsync(fileIds, token); - } - return 0; + return await fileService.DeleteAsync(fileIds, token); } } - }