EF: AuditEvent. fix Remove Old Event

This commit is contained in:
pavelbannov 2019-12-18 15:24:22 +03:00
parent f61fb897ac
commit fe378e1eef
2 changed files with 19 additions and 25 deletions

View File

@ -1,4 +1,5 @@
using ASC.Core.Common.EF.Model; 
using ASC.Core.Common.EF.Model;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -14,6 +15,7 @@ namespace ASC.Core.Common.EF.Context
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.AddDbFunction();
modelBuilder.AddWebstudioSettings(); modelBuilder.AddWebstudioSettings();
} }
} }

View File

@ -27,11 +27,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Threading; using System.Threading;
using ASC.Common.Data; using ASC.Common.Data;
using ASC.Common.Data.Sql;
using ASC.Common.Data.Sql.Expressions;
using ASC.Common.Logging; using ASC.Common.Logging;
using ASC.Core.Common.EF; using ASC.Core.Common.EF;
using ASC.Core.Common.EF.Context; using ASC.Core.Common.EF.Context;
@ -274,8 +273,8 @@ namespace ASC.MessagingSystem.DbSender
{ {
try try
{ {
//GetOldEvents(LoginEventsTable, "LoginHistoryLifeTime"); GetOldEvents(r => r.LoginEvents, "LoginHistoryLifeTime");
//GetOldEvents(AuditEventsTable, "AuditTrailLifeTime"); GetOldEvents(r => r.AuditEvents, "AuditTrailLifeTime");
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -283,44 +282,37 @@ namespace ASC.MessagingSystem.DbSender
} }
} }
private void GetOldEvents(string table, string settings) private void GetOldEvents<T>(Expression<Func<MessagesContext, DbSet<T>>> func, string settings) where T : MessageEvent
{ {
var sqlQueryLimit = string.Format("(IFNULL((SELECT JSON_EXTRACT(`Data`, '$.{0}') from webstudio_settings where tt.id = TenantID and id='{1}'), {2})) as tout", settings, TenantAuditSettings.Guid, TenantAuditSettings.MaxLifeTime); List<T> ids;
var query = new SqlQuery(table + " t1") var compile = func.Compile();
.Select("t1.id")
.Select(sqlQueryLimit)
.Select("t1.`date` AS dout")
.InnerJoin("tenants_tenants tt", Exp.EqColumns("tt.id", "t1.tenant_id"))
.Having(Exp.Sql("dout < ADDDATE(UTC_DATE(), INTERVAL -tout DAY)"))
.SetMaxResults(1000);
List<AuditEvent> ids;
do do
{ {
using var scope = ServiceProvider.CreateScope(); using var scope = ServiceProvider.CreateScope();
using var ef = scope.ServiceProvider.GetService<DbContextManager<MessagesContext>>().Get("messages"); using var ef = scope.ServiceProvider.GetService<DbContextManager<MessagesContext>>().Get("messages");
var table = compile.Invoke(ef);
var ae = ef.AuditEvents var ae = table
.Join(ef.Tenants, r => r.TenantId, r => r.Id, (audit, tenant) => audit) .Join(ef.Tenants, r => r.TenantId, r => r.Id, (audit, tenant) => audit)
.Select(r => new .Select(r => new
{ {
r.Id, r.Id,
r.Date, r.Date,
settings = ef.WebstudioSettings r.TenantId,
.Where(a => a.TenantId == r.TenantId && a.Id == TenantAuditSettings.Guid)
.Select(r => r.Data)
.FirstOrDefault(),
ef = r ef = r
}) })
//.Where(r => r.Date < DateTime.UtcNow.AddDays(-r.settings.RootElement.GetProperty(settings).GetInt32())) .Where(r => r.Date < DateTime.UtcNow.AddDays(
ef.WebstudioSettings
.Where(a => a.TenantId == r.TenantId && a.Id == TenantAuditSettings.Guid)
.Select(r => Convert.ToDouble(JsonExtensions.JsonValue(nameof(r.Data).ToLower(), settings) ?? TenantAuditSettings.MaxLifeTime.ToString()))
.FirstOrDefault()))
.Take(1000); .Take(1000);
ids = ae.ToList().Select(r => r.ef).ToList(); ids = ae.Select(r => r.ef).ToList();
if (!ids.Any()) return; if (!ids.Any()) return;
//ef.AuditEvents.RemoveRange(ids); table.RemoveRange(ids);
ef.SaveChanges(); ef.SaveChanges();
} while (ids.Any()); } while (ids.Any());