modify #4099 - fix localization and use Delete rather than Clear in API methods for consistency with rest of framework

This commit is contained in:
sbwalker 2024-04-04 11:58:05 -04:00
parent 160b3ff655
commit 7b95db4d13
7 changed files with 20 additions and 32 deletions

View File

@ -87,7 +87,7 @@ else
</div> </div>
<br /> <br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button> <button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
<ActionDialog Header="Clear Logs" Message="@Localizer["Confirm.ClearLogs"]" Action="ClearLogs" Class="btn btn-secondary" OnClick="@(async () => await ClearLogs())" ResourceKey="ClearLogs" /> <ActionDialog Header="Delete Log Events" Message="Are You Sure You Wish To Delete All Log Events?" Action="DeleteLogs" Class="btn btn-danger" OnClick="@(async () => await DeleteLogs())" ResourceKey="DeleteLogs" />
</TabPanel> </TabPanel>
</TabStrip> </TabStrip>
} }
@ -231,18 +231,18 @@ else
} }
} }
private async Task ClearLogs() private async Task DeleteLogs()
{ {
try try
{ {
await LogService.ClearLogsAsync(PageState.Site.SiteId); await LogService.DeleteLogsAsync(PageState.Site.SiteId);
await GetLogs(); await GetLogs();
StateHasChanged(); StateHasChanged();
} }
catch (Exception ex) catch (Exception ex)
{ {
await logger.LogError(ex, "Error Clearing Logs {Error}", ex.Message); await logger.LogError(ex, "Error Deleting Logs {Error}", ex.Message);
AddModuleMessage(Localizer["Error.ClearLogs"], MessageType.Error); AddModuleMessage(Localizer["Error.DeleteLogs"], MessageType.Error);
} }
} }

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
@ -210,13 +210,16 @@
<data name="Success.SaveSiteSettings" xml:space="preserve"> <data name="Success.SaveSiteSettings" xml:space="preserve">
<value>Settings Saved Successfully</value> <value>Settings Saved Successfully</value>
</data> </data>
<data name="ClearLogs.Text" xml:space="preserve"> <data name="DeleteLogs.Header" xml:space="preserve">
<value>Clear Logs</value> <value>Clear Events</value>
</data> </data>
<data name="Confirm.ClearLogs" xml:space="preserve"> <data name="DeleteLogs.Message" xml:space="preserve">
<value>Are you sure you wish to clear all the logs?</value> <value>Are You Sure You Wish To Remove All Log Events?</value>
</data> </data>
<data name="Error.ClearLogs" xml:space="preserve"> <data name="DeleteLogs.Text" xml:space="preserve">
<value>Error Clearing Logs</value> <value>Clear Events</value>
</data>
<data name="Error.DeleteLogs" xml:space="preserve">
<value>Error Deleting Log Events</value>
</data> </data>
</root> </root>

View File

@ -34,7 +34,7 @@ namespace Oqtane.Services
/// </summary> /// </summary>
/// <param name="siteId"></param> /// <param name="siteId"></param>
/// <returns></returns> /// <returns></returns>
Task ClearLogsAsync(int siteId); Task DeleteLogsAsync(int siteId);
/// <summary> /// <summary>
/// Creates a new log entry /// Creates a new log entry

View File

@ -35,7 +35,7 @@ namespace Oqtane.Services
return await GetJsonAsync<Log>($"{Apiurl}/{logId}"); return await GetJsonAsync<Log>($"{Apiurl}/{logId}");
} }
public async Task ClearLogsAsync(int siteId) public async Task DeleteLogsAsync(int siteId)
{ {
await DeleteAsync($"{Apiurl}?siteid={siteId}"); await DeleteAsync($"{Apiurl}?siteid={siteId}");
} }

View File

@ -83,7 +83,7 @@ namespace Oqtane.Controllers
{ {
if (int.TryParse(siteId, out int parsedSiteId) && parsedSiteId == _alias.SiteId) if (int.TryParse(siteId, out int parsedSiteId) && parsedSiteId == _alias.SiteId)
{ {
_logs.ClearLogs(parsedSiteId); _logs.DeleteLogs(parsedSiteId, 0); // specifying zero for age results in all logs being deleted
} }
else else
{ {

View File

@ -9,6 +9,5 @@ namespace Oqtane.Repository
Log GetLog(int logId); Log GetLog(int logId);
void AddLog(Log log); void AddLog(Log log);
int DeleteLogs(int siteId, int age); int DeleteLogs(int siteId, int age);
void ClearLogs(int siteId);
} }
} }

View File

@ -59,31 +59,17 @@ namespace Oqtane.Repository
// delete logs in batches of 100 records // delete logs in batches of 100 records
var count = 0; var count = 0;
var purgedate = DateTime.UtcNow.AddDays(-age); var purgedate = DateTime.UtcNow.AddDays(-age);
var logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) var logs = db.Log.Where(item => item.SiteId == siteId && item.LogDate < purgedate)
.OrderBy(item => item.LogDate).Take(100).ToList(); .OrderBy(item => item.LogDate).Take(100).ToList();
while (logs.Count > 0) while (logs.Count > 0)
{ {
count += logs.Count; count += logs.Count;
db.Log.RemoveRange(logs); db.Log.RemoveRange(logs);
db.SaveChanges(); db.SaveChanges();
logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) logs = db.Log.Where(item => item.SiteId == siteId && item.LogDate < purgedate)
.OrderBy(item => item.LogDate).Take(100).ToList(); .OrderBy(item => item.LogDate).Take(100).ToList();
} }
return count; return count;
} }
public void ClearLogs(int siteId)
{
using var db = _dbContextFactory.CreateDbContext();
var getLogsForDelete = () => db.Log.Where(item => item.SiteId == siteId).Take(100).ToList();
// delete logs in batches of 100 records
var logs = getLogsForDelete();
while (logs.Count > 0)
{
db.Log.RemoveRange(logs);
db.SaveChanges();
logs = getLogsForDelete();
}
}
} }
} }