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;