using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Oqtane.Models; using Oqtane.Repository; using Oqtane.Shared; namespace Oqtane.Infrastructure { public class PurgeJob : HostedServiceBase { // JobType = "Oqtane.Infrastructure.PurgeJob, Oqtane.Server" public PurgeJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) { Name = "Purge Job"; Frequency = "d"; // daily Interval = 1; StartDate = DateTime.ParseExact("03:00", "H:mm", null, System.Globalization.DateTimeStyles.AssumeLocal).ToUniversalTime(); // 3 AM IsEnabled = true; } // job is executed for each tenant in installation public override string ExecuteJob(IServiceProvider provider) { string log = ""; // get services var siteRepository = provider.GetRequiredService(); var settingRepository = provider.GetRequiredService(); var logRepository = provider.GetRequiredService(); var visitorRepository = provider.GetRequiredService(); var notificationRepository = provider.GetRequiredService(); var urlMappingRepository = provider.GetRequiredService(); var installationManager = provider.GetRequiredService(); // iterate through sites for current tenant List sites = siteRepository.GetSites().ToList(); foreach (Site site in sites) { log += "
Processing Site: " + site.Name + "
"; int retention; int count; // get site settings Dictionary settings = GetSettings(settingRepository.GetSettings(EntityNames.Site, site.SiteId).ToList()); // purge event log retention = 30; // 30 days if (settings.ContainsKey("LogRetention") && !string.IsNullOrEmpty(settings["LogRetention"])) { retention = int.Parse(settings["LogRetention"]); } try { count = logRepository.DeleteLogs(site.SiteId, retention); log += count.ToString() + " Events Purged
"; } catch (Exception ex) { log += $"Error Purging Events - {ex.Message}
"; } // purge visitors if (site.VisitorTracking) { retention = 30; // 30 days if (settings.ContainsKey("VisitorRetention") && !string.IsNullOrEmpty(settings["VisitorRetention"])) { retention = int.Parse(settings["VisitorRetention"]); } try { count = visitorRepository.DeleteVisitors(site.SiteId, retention); log += count.ToString() + " Visitors Purged
"; } catch (Exception ex) { log += $"Error Purging Visitors - {ex.Message}
"; } } // purge notifications retention = 30; // 30 days if (settings.ContainsKey("NotificationRetention") && !string.IsNullOrEmpty(settings["NotificationRetention"])) { retention = int.Parse(settings["NotificationRetention"]); } try { count = notificationRepository.DeleteNotifications(site.SiteId, retention); log += count.ToString() + " Notifications Purged
"; } catch (Exception ex) { log += $"Error Purging Notifications - {ex.Message}
"; } // purge broken urls retention = 30; // 30 days if (settings.ContainsKey("UrlMappingRetention") && !string.IsNullOrEmpty(settings["UrlMappingRetention"])) { retention = int.Parse(settings["UrlMappingRetention"]); } try { count = urlMappingRepository.DeleteUrlMappings(site.SiteId, retention); log += count.ToString() + " Broken Urls Purged
"; } catch (Exception ex) { log += $"Error Purging Broken Urls - {ex.Message}
"; } } // register assemblies try { var assemblies = installationManager.RegisterAssemblies(); log += "
" + assemblies.ToString() + " Assemblies Registered
"; } catch (Exception ex) { log += $"
Error Registering Assemblies - {ex.Message}
"; } return log; } private Dictionary GetSettings(List settings) { Dictionary dictionary = new Dictionary(); foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList()) { dictionary.Add(setting.SettingName, setting.SettingValue); } return dictionary; } } }