using av_motion_api.Data;
using av_motion_api.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
namespace av_motion_api.Services
{
public class UserDeletionService : IHostedService, IDisposable
{
private readonly IServiceProvider _serviceProvider;
private readonly IOptionsMonitor<DeletionSettings> _settings;
private Timer _timer;
public UserDeletionService(IServiceProvider serviceProvider, IOptionsMonitor<DeletionSettings> settings)
{
_serviceProvider = serviceProvider;
_settings = settings;
}
public Task StartAsync(CancellationToken cancellationToken)
{
ScheduleDeletionTask();
_settings.OnChange(settings => ScheduleDeletionTask());
return Task.CompletedTask;
}
private void ScheduleDeletionTask()
{
var interval = GetTimeSpan(_settings.CurrentValue.DeletionTimeValue, _settings.CurrentValue.DeletionTimeUnit);
_timer = new Timer(DeleteDeactivatedUsers, null, TimeSpan.Zero, interval);
}
private void DeleteDeactivatedUsers(object state)
{
using (var scope = _serviceProvider.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<User>>();
var deletionThreshold = DateTime.UtcNow.Subtract(GetTimeSpan(_settings.CurrentValue.DeletionTimeValue, _settings.CurrentValue.DeletionTimeUnit));
var usersToDelete = context.Users
.Where(u => u.User_Status_ID == 2 && u.DeactivatedAt < deletionThreshold)
.ToList();
foreach (var user in usersToDelete)
{
userManager.DeleteAsync(user).Wait();
}
context.SaveChanges();
}
}
private TimeSpan GetTimeSpan(int value, string unit)
{
return unit.ToLower() switch
{
"minutes" => TimeSpan.FromMinutes(value),
"hours" => TimeSpan.FromHours(value),
"days" => TimeSpan.FromDays(value),
"weeks" => TimeSpan.FromDays(value * 7),
"months" => TimeSpan.FromDays(value * 30), // Approximation
"years" => TimeSpan.FromDays(value * 365), // Approximation
_ => TimeSpan.FromMinutes(value),
};
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter