ClearEvents: used file-scope namespaces
This commit is contained in:
parent
9f670d2b25
commit
b5e4d68550
@ -43,109 +43,108 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace ASC.ClearEvents.Services
|
||||
namespace ASC.ClearEvents.Services;
|
||||
|
||||
[Scope(Additional = typeof(MessagesRepositoryExtension))]
|
||||
public class TimedClearEventsService : IHostedService, IDisposable
|
||||
{
|
||||
[Scope(Additional = typeof(MessagesRepositoryExtension))]
|
||||
public class TimedClearEventsService : IHostedService, IDisposable
|
||||
private readonly ILog _logger;
|
||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||
private Timer _timer = null!;
|
||||
|
||||
public TimedClearEventsService(IOptionsMonitor<ILog> options, IServiceScopeFactory serviceScopeFactory)
|
||||
{
|
||||
private readonly ILog _logger;
|
||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||
private Timer _timer = null!;
|
||||
_logger = options.CurrentValue;
|
||||
_serviceScopeFactory = serviceScopeFactory;
|
||||
}
|
||||
|
||||
public TimedClearEventsService(IOptionsMonitor<ILog> options, IServiceScopeFactory serviceScopeFactory)
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.Info("Timer Clear Events Service running.");
|
||||
|
||||
_timer = new Timer(DeleteOldEvents, null, TimeSpan.Zero,
|
||||
TimeSpan.FromDays(1));
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.Info("Timed Clear Events Service is stopping.");
|
||||
|
||||
_timer?.Change(Timeout.Infinite, 0);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
var handle = new AutoResetEvent(false);
|
||||
|
||||
if ((bool)!(_timer?.Dispose(handle)))
|
||||
throw new Exception("Timer already disposed");
|
||||
|
||||
handle.WaitOne();
|
||||
}
|
||||
|
||||
private void DeleteOldEvents(object state)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger = options.CurrentValue;
|
||||
_serviceScopeFactory = serviceScopeFactory;
|
||||
GetOldEvents(r => r.LoginEvents, "LoginHistoryLifeTime");
|
||||
GetOldEvents(r => r.AuditEvents, "AuditTrailLifeTime");
|
||||
}
|
||||
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Info("Timer Clear Events Service running.");
|
||||
|
||||
_timer = new Timer(DeleteOldEvents, null, TimeSpan.Zero,
|
||||
TimeSpan.FromDays(1));
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.Info("Timed Clear Events Service is stopping.");
|
||||
|
||||
_timer?.Change(Timeout.Infinite, 0);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
var handle = new AutoResetEvent(false);
|
||||
|
||||
if ((bool)!(_timer?.Dispose(handle)))
|
||||
throw new Exception("Timer already disposed");
|
||||
|
||||
handle.WaitOne();
|
||||
}
|
||||
|
||||
private void DeleteOldEvents(object state)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetOldEvents(r => r.LoginEvents, "LoginHistoryLifeTime");
|
||||
GetOldEvents(r => r.AuditEvents, "AuditTrailLifeTime");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex.Message, ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void GetOldEvents<T>(Expression<Func<Messages, DbSet<T>>> func, string settings) where T : MessageEvent
|
||||
{
|
||||
List<T> ids;
|
||||
var compile = func.Compile();
|
||||
do
|
||||
{
|
||||
using var scope = _serviceScopeFactory.CreateScope();
|
||||
using var ef = scope.ServiceProvider.GetService<DbContextManager<Messages>>().Get("messages");
|
||||
var table = compile.Invoke(ef);
|
||||
|
||||
var ae = table
|
||||
.Join(ef.Tenants, r => r.TenantId, r => r.Id, (audit, tenant) => audit)
|
||||
.Select(r => new
|
||||
{
|
||||
r.Id,
|
||||
r.Date,
|
||||
r.TenantId,
|
||||
ef = r
|
||||
})
|
||||
.Where(r => r.Date < DateTime.UtcNow.AddDays(-Convert.ToDouble(
|
||||
ef.WebstudioSettings
|
||||
.Where(a => a.TenantId == r.TenantId && a.Id == TenantAuditSettings.Guid)
|
||||
.Select(r => JsonExtensions.JsonValue(nameof(r.Data).ToLower(), settings))
|
||||
.FirstOrDefault() ?? TenantAuditSettings.MaxLifeTime.ToString())))
|
||||
.Take(1000);
|
||||
|
||||
ids = ae.Select(r => r.ef).ToList();
|
||||
|
||||
if (!ids.Any()) return;
|
||||
|
||||
table.RemoveRange(ids);
|
||||
ef.SaveChanges();
|
||||
|
||||
} while (ids.Any());
|
||||
_logger.Error(ex.Message, ex);
|
||||
}
|
||||
}
|
||||
|
||||
public class Messages : MessagesContext
|
||||
private void GetOldEvents<T>(Expression<Func<Messages, DbSet<T>>> func, string settings) where T : MessageEvent
|
||||
{
|
||||
public DbSet<AuditEvent> AuditEvents { get; }
|
||||
public DbSet<DbTenant> Tenants { get; }
|
||||
public DbSet<DbWebstudioSettings> WebstudioSettings { get; }
|
||||
}
|
||||
|
||||
public class MessagesRepositoryExtension
|
||||
{
|
||||
public static void Register(DIHelper services) => services.TryAdd<DbContextManager<Messages>>();
|
||||
List<T> ids;
|
||||
var compile = func.Compile();
|
||||
do
|
||||
{
|
||||
using var scope = _serviceScopeFactory.CreateScope();
|
||||
using var ef = scope.ServiceProvider.GetService<DbContextManager<Messages>>().Get("messages");
|
||||
var table = compile.Invoke(ef);
|
||||
|
||||
var ae = table
|
||||
.Join(ef.Tenants, r => r.TenantId, r => r.Id, (audit, tenant) => audit)
|
||||
.Select(r => new
|
||||
{
|
||||
r.Id,
|
||||
r.Date,
|
||||
r.TenantId,
|
||||
ef = r
|
||||
})
|
||||
.Where(r => r.Date < DateTime.UtcNow.AddDays(-Convert.ToDouble(
|
||||
ef.WebstudioSettings
|
||||
.Where(a => a.TenantId == r.TenantId && a.Id == TenantAuditSettings.Guid)
|
||||
.Select(r => JsonExtensions.JsonValue(nameof(r.Data).ToLower(), settings))
|
||||
.FirstOrDefault() ?? TenantAuditSettings.MaxLifeTime.ToString())))
|
||||
.Take(1000);
|
||||
|
||||
ids = ae.Select(r => r.ef).ToList();
|
||||
|
||||
if (!ids.Any()) return;
|
||||
|
||||
table.RemoveRange(ids);
|
||||
ef.SaveChanges();
|
||||
|
||||
} while (ids.Any());
|
||||
}
|
||||
}
|
||||
|
||||
public class Messages : MessagesContext
|
||||
{
|
||||
public DbSet<AuditEvent> AuditEvents { get; }
|
||||
public DbSet<DbTenant> Tenants { get; }
|
||||
public DbSet<DbWebstudioSettings> WebstudioSettings { get; }
|
||||
}
|
||||
|
||||
public class MessagesRepositoryExtension
|
||||
{
|
||||
public static void Register(DIHelper services) => services.TryAdd<DbContextManager<Messages>>();
|
||||
}
|
Loading…
Reference in New Issue
Block a user