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