diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 13d51301..a83a71d5 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -129,6 +129,12 @@ +
+ +
+ +
+


@@ -261,6 +267,7 @@ private string _smtpusername = string.Empty; private string _smtppassword = string.Empty; private string _smtpsender = string.Empty; + private string _retention = string.Empty; private string _pwaisenabled; private int _pwaappiconfileid = -1; private FileManager _pwaappiconfilemanager; @@ -330,6 +337,7 @@ _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); + _retention = SettingService.GetSetting(settings, "NotificationRetention", "30"); if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { @@ -479,12 +487,13 @@ site = await SiteService.UpdateSiteAsync(site); var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); - SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); - SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); - SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); - SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); - SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); - SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); + settings = SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); + settings = SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); + settings = SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); + settings = SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); + settings = SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); + settings = SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); + settings = SettingService.SetSetting(settings, "NotificationRetention", _retention, true); await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId); if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) diff --git a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs index a73bef98..8eb22a97 100644 --- a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs @@ -31,6 +31,7 @@ namespace Oqtane.Infrastructure var settingRepository = provider.GetRequiredService(); var logRepository = provider.GetRequiredService(); var visitorRepository = provider.GetRequiredService(); + var notificationRepository = provider.GetRequiredService(); // iterate through sites for current tenant List sites = siteRepository.GetSites().ToList(); @@ -51,7 +52,7 @@ namespace Oqtane.Infrastructure } try { - count = logRepository.DeleteLogs(retention); + count = logRepository.DeleteLogs(site.SiteId, retention); log += count.ToString() + " Events Purged
"; } catch (Exception ex) @@ -69,7 +70,7 @@ namespace Oqtane.Infrastructure } try { - count = visitorRepository.DeleteVisitors(retention); + count = visitorRepository.DeleteVisitors(site.SiteId, retention); log += count.ToString() + " Visitors Purged
"; } catch (Exception ex) @@ -77,6 +78,22 @@ namespace Oqtane.Infrastructure 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}
"; + } } return log; diff --git a/Oqtane.Server/Repository/Interfaces/ILogRepository.cs b/Oqtane.Server/Repository/Interfaces/ILogRepository.cs index cc2c8aae..918785f2 100644 --- a/Oqtane.Server/Repository/Interfaces/ILogRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/ILogRepository.cs @@ -8,6 +8,6 @@ namespace Oqtane.Repository IEnumerable GetLogs(int siteId, string level, string function, int rows); Log GetLog(int logId); void AddLog(Log log); - int DeleteLogs(int age); + int DeleteLogs(int siteId, int age); } } diff --git a/Oqtane.Server/Repository/Interfaces/INotificationRepository.cs b/Oqtane.Server/Repository/Interfaces/INotificationRepository.cs index 5dfb81b6..34fb58be 100644 --- a/Oqtane.Server/Repository/Interfaces/INotificationRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/INotificationRepository.cs @@ -11,5 +11,6 @@ namespace Oqtane.Repository Notification GetNotification(int notificationId); Notification GetNotification(int notificationId, bool tracking); void DeleteNotification(int notificationId); + int DeleteNotifications(int siteId, int age); } } diff --git a/Oqtane.Server/Repository/Interfaces/IVisitorRepository.cs b/Oqtane.Server/Repository/Interfaces/IVisitorRepository.cs index d73a02ed..9100e0b8 100644 --- a/Oqtane.Server/Repository/Interfaces/IVisitorRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IVisitorRepository.cs @@ -12,6 +12,6 @@ namespace Oqtane.Repository Visitor GetVisitor(int visitorId); Visitor GetVisitor(int siteId, string IPAddress); void DeleteVisitor(int visitorId); - int DeleteVisitors(int age); + int DeleteVisitors(int siteId, int age); } } diff --git a/Oqtane.Server/Repository/LogRepository.cs b/Oqtane.Server/Repository/LogRepository.cs index 24920d42..8f8363ac 100644 --- a/Oqtane.Server/Repository/LogRepository.cs +++ b/Oqtane.Server/Repository/LogRepository.cs @@ -49,19 +49,19 @@ namespace Oqtane.Repository _db.SaveChanges(); } - public int DeleteLogs(int age) + public int DeleteLogs(int siteId, int age) { // delete logs in batches of 100 records int count = 0; var purgedate = DateTime.UtcNow.AddDays(-age); - var logs = _db.Log.Where(item => item.Level != "Error" && item.LogDate < purgedate) + var logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) .OrderBy(item => item.LogDate).Take(100).ToList(); while (logs.Count > 0) { count += logs.Count; _db.Log.RemoveRange(logs); _db.SaveChanges(); - logs = _db.Log.Where(item => item.Level != "Error" && item.LogDate < purgedate) + logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) .OrderBy(item => item.LogDate).Take(100).ToList(); } return count; diff --git a/Oqtane.Server/Repository/NotificationRepository.cs b/Oqtane.Server/Repository/NotificationRepository.cs index aa05bf17..7596ee94 100644 --- a/Oqtane.Server/Repository/NotificationRepository.cs +++ b/Oqtane.Server/Repository/NotificationRepository.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; @@ -68,6 +69,25 @@ namespace Oqtane.Repository _db.Notification.Remove(notification); _db.SaveChanges(); } + + public int DeleteNotifications(int siteId, int age) + { + // delete notifications in batches of 100 records + int count = 0; + var purgedate = DateTime.UtcNow.AddDays(-age); + var notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) + .OrderBy(item => item.DeliveredOn).Take(100).ToList(); + while (notifications.Count > 0) + { + count += notifications.Count; + _db.Notification.RemoveRange(notifications); + _db.SaveChanges(); + notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) + .OrderBy(item => item.DeliveredOn).Take(100).ToList(); + } + return count; + } + } } diff --git a/Oqtane.Server/Repository/VisitorRepository.cs b/Oqtane.Server/Repository/VisitorRepository.cs index 2f7c10dc..866d61f9 100644 --- a/Oqtane.Server/Repository/VisitorRepository.cs +++ b/Oqtane.Server/Repository/VisitorRepository.cs @@ -53,19 +53,19 @@ namespace Oqtane.Repository _db.SaveChanges(); } - public int DeleteVisitors(int age) + public int DeleteVisitors(int siteId, int age) { // delete visitors in batches of 100 records int count = 0; var purgedate = DateTime.UtcNow.AddDays(-age); - var visitors = _db.Visitor.Where(item => item.Visits <= 1 && item.VisitedOn < purgedate) + var visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) .OrderBy(item => item.VisitedOn).Take(100).ToList(); while (visitors.Count > 0) { count += visitors.Count; _db.Visitor.RemoveRange(visitors); _db.SaveChanges(); - visitors = _db.Visitor.Where(item => item.Visits < 2 && item.VisitedOn < purgedate) + visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) .OrderBy(item => item.VisitedOn).Take(100).ToList(); } return count;