diff --git a/Oqtane.Client/Modules/Admin/Logs/Detail.razor b/Oqtane.Client/Modules/Admin/Logs/Detail.razor
new file mode 100644
index 00000000..5ab4658f
--- /dev/null
+++ b/Oqtane.Client/Modules/Admin/Logs/Detail.razor
@@ -0,0 +1,179 @@
+@namespace Oqtane.Modules.Admin.Logs
+@inherits ModuleBase
+@inject NavigationManager NavigationManager
+@inject ILogService LogService
+@inject IPageService PageService
+@inject IPageModuleService PageModuleService
+@inject IUserService UserService
+
+
+Cancel
+
+@code {
+ public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } }
+
+ int logid;
+ string logdate = "";
+ string category = "";
+ string level = "";
+ string pagename = "";
+ string moduletitle = "";
+ string username = "";
+ string url = "";
+ string template = "";
+ string message = "";
+ string exception = "";
+ string properties = "";
+ string server = "";
+
+ protected override async Task OnInitializedAsync()
+ {
+ try
+ {
+ logid = Int32.Parse(PageState.QueryString["id"]);
+ Log log = await LogService.GetLogAsync(logid);
+ if (log != null)
+ {
+ logdate = log.LogDate.ToString();
+ category = log.Category;
+ level = log.Level;
+ if (log.PageId != null)
+ {
+ Page page = await PageService.GetPageAsync(log.PageId.Value);
+ if (page != null)
+ {
+ pagename = page.Name;
+ }
+ }
+ if (log.PageId != null && log.ModuleId != null)
+ {
+ PageModule pagemodule = await PageModuleService.GetPageModuleAsync(log.PageId.Value, log.ModuleId.Value);
+ if (pagemodule != null)
+ {
+ moduletitle = pagemodule.Title;
+ }
+ }
+ if (log.UserId != null)
+ {
+ User user = await UserService.GetUserAsync(log.UserId.Value, PageState.Site.SiteId);
+ if (user != null)
+ {
+ username = user.Username;
+ }
+ }
+ url = log.Url;
+ template = log.MessageTemplate;
+ message = log.Message;
+ exception = log.Exception;
+ properties = log.Properties;
+ server = log.Server;
+ }
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Loading Log {LogId} {Error}", logid, ex.Message);
+ AddModuleMessage("Error Loading Log", MessageType.Error);
+ }
+ }
+}
diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor
index c564d23e..309a4c87 100644
--- a/Oqtane.Client/Modules/Admin/Logs/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor
@@ -8,20 +8,36 @@
}
else
{
+
+
+
+
+
+
Date |
- Level |
- Url |
Category |
- Message |
+ Level |
+ |
@context.LogDate |
- @context.Level |
- @context.Url |
@context.Category |
- @context.Message |
+ @context.Level |
+ |
}
@@ -29,10 +45,50 @@ else
@code {
public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } }
+ string level = "-";
+ string rows = "50";
List Logs;
protected override async Task OnInitializedAsync()
{
- Logs = await LogService.GetLogsAsync(PageState.Site.SiteId);
+ try
+ {
+ Logs = await LogService.GetLogsAsync(PageState.Site.SiteId, ((level == "-") ? "" : level), int.Parse(rows));
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
+ AddModuleMessage("Error Loading Logs", MessageType.Error);
+ }
+ }
+
+ private async void LevelChanged(ChangeEventArgs e)
+ {
+ try
+ {
+ level = (string)e.Value;
+ Logs = await LogService.GetLogsAsync(PageState.Site.SiteId, ((level == "-") ? "" : level), int.Parse(rows));
+ StateHasChanged();
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
+ AddModuleMessage("Error Loading Logs", MessageType.Error);
+ }
+ }
+
+ private async void RowsChanged(ChangeEventArgs e)
+ {
+ try
+ {
+ rows = (string)e.Value;
+ Logs = await LogService.GetLogsAsync(PageState.Site.SiteId, ((level == "-") ? "" : level), int.Parse(rows));
+ StateHasChanged();
+ }
+ catch (Exception ex)
+ {
+ await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
+ AddModuleMessage("Error Loading Logs", MessageType.Error);
+ }
}
}
\ No newline at end of file
diff --git a/Oqtane.Client/Services/Interfaces/ILogService.cs b/Oqtane.Client/Services/Interfaces/ILogService.cs
index 0e5361ea..733c2a60 100644
--- a/Oqtane.Client/Services/Interfaces/ILogService.cs
+++ b/Oqtane.Client/Services/Interfaces/ILogService.cs
@@ -8,7 +8,8 @@ namespace Oqtane.Services
{
public interface ILogService
{
- Task> GetLogsAsync(int SiteId);
+ Task> GetLogsAsync(int SiteId, string Level, int Rows);
+ Task GetLogAsync(int LogId);
Task Log(int? PageId, int? ModuleId, int? UserId, string component, LogLevel level, Exception exception, string message, params object[] args);
}
}
diff --git a/Oqtane.Client/Services/Interfaces/IPageModuleService.cs b/Oqtane.Client/Services/Interfaces/IPageModuleService.cs
index ec184550..d758508d 100644
--- a/Oqtane.Client/Services/Interfaces/IPageModuleService.cs
+++ b/Oqtane.Client/Services/Interfaces/IPageModuleService.cs
@@ -8,6 +8,7 @@ namespace Oqtane.Services
{
Task> GetPageModulesAsync();
Task GetPageModuleAsync(int PageModuleId);
+ Task GetPageModuleAsync(int PageId, int ModuleId);
Task AddPageModuleAsync(PageModule PageModule);
Task UpdatePageModuleAsync(PageModule PageModule);
Task UpdatePageModuleOrderAsync(int PageId, string Pane);
diff --git a/Oqtane.Client/Services/LogService.cs b/Oqtane.Client/Services/LogService.cs
index 92cf9589..0fd8828e 100644
--- a/Oqtane.Client/Services/LogService.cs
+++ b/Oqtane.Client/Services/LogService.cs
@@ -27,9 +27,14 @@ namespace Oqtane.Services
get { return CreateApiUrl(sitestate.Alias, NavigationManager.Uri, "Log"); }
}
- public async Task> GetLogsAsync(int SiteId)
+ public async Task> GetLogsAsync(int SiteId, string Level, int Rows)
{
- return await http.GetJsonAsync>(apiurl + "?siteid=" + SiteId.ToString());
+ return await http.GetJsonAsync>(apiurl + "?siteid=" + SiteId.ToString() + "&level=" + Level + "&rows=" + Rows.ToString());
+ }
+
+ public async Task GetLogAsync(int LogId)
+ {
+ return await http.GetJsonAsync(apiurl + "/" + LogId.ToString());
}
public async Task Log(int? PageId, int? ModuleId, int? UserId, string category, LogLevel level, Exception exception, string message, params object[] args)
diff --git a/Oqtane.Client/Services/PageModuleService.cs b/Oqtane.Client/Services/PageModuleService.cs
index cb20faed..99ad9629 100644
--- a/Oqtane.Client/Services/PageModuleService.cs
+++ b/Oqtane.Client/Services/PageModuleService.cs
@@ -36,6 +36,11 @@ namespace Oqtane.Services
return await http.GetJsonAsync(apiurl + "/" + PageModuleId.ToString());
}
+ public async Task GetPageModuleAsync(int PageId, int ModuleId)
+ {
+ return await http.GetJsonAsync(apiurl + "/" + PageId.ToString() + "/" + ModuleId.ToString());
+ }
+
public async Task AddPageModuleAsync(PageModule PageModule)
{
return await http.PostJsonAsync(apiurl, PageModule);
diff --git a/Oqtane.Server/Controllers/LogController.cs b/Oqtane.Server/Controllers/LogController.cs
index c04dd8fc..e8575c8b 100644
--- a/Oqtane.Server/Controllers/LogController.cs
+++ b/Oqtane.Server/Controllers/LogController.cs
@@ -3,6 +3,8 @@ using Oqtane.Models;
using System.Collections.Generic;
using Oqtane.Repository;
using Oqtane.Infrastructure;
+using Microsoft.AspNetCore.Authorization;
+using Oqtane.Shared;
namespace Oqtane.Controllers
{
@@ -19,11 +21,20 @@ namespace Oqtane.Controllers
this.Logs = Logs;
}
- // GET: api/?siteid=x
+ // GET: api/?siteid=x&level=y
[HttpGet]
- public IEnumerable Get(string siteid)
+ [Authorize(Roles = Constants.AdminRole)]
+ public IEnumerable Get(string siteid, string level, string rows)
{
- return Logs.GetLogs(int.Parse(siteid));
+ return Logs.GetLogs(int.Parse(siteid), level, int.Parse(rows));
+ }
+
+ // GET api//5
+ [HttpGet("{id}")]
+ [Authorize(Roles = Constants.AdminRole)]
+ public Log Get(int id)
+ {
+ return Logs.GetLog(id);
}
// POST api/
diff --git a/Oqtane.Server/Controllers/PageModuleController.cs b/Oqtane.Server/Controllers/PageModuleController.cs
index d156a1d2..87341192 100644
--- a/Oqtane.Server/Controllers/PageModuleController.cs
+++ b/Oqtane.Server/Controllers/PageModuleController.cs
@@ -37,6 +37,13 @@ namespace Oqtane.Controllers
return PageModules.GetPageModule(id);
}
+ // GET: api//pageid/moduleid
+ [HttpGet("{pageid}/{moduleid}")]
+ public PageModule Get(int pageid, int moduleid)
+ {
+ return PageModules.GetPageModule(pageid, moduleid);
+ }
+
// POST api/
[HttpPost]
[Authorize(Roles = Constants.AdminRole)]
diff --git a/Oqtane.Server/Controllers/TenantController.cs b/Oqtane.Server/Controllers/TenantController.cs
index 22400722..ff7843f4 100644
--- a/Oqtane.Server/Controllers/TenantController.cs
+++ b/Oqtane.Server/Controllers/TenantController.cs
@@ -22,6 +22,7 @@ namespace Oqtane.Controllers
// GET: api/
[HttpGet]
+ [Authorize(Roles = Constants.HostRole)]
public IEnumerable Get()
{
return Tenants.GetTenants();
@@ -29,6 +30,7 @@ namespace Oqtane.Controllers
// GET api//5
[HttpGet("{id}")]
+ [Authorize(Roles = Constants.HostRole)]
public Tenant Get(int id)
{
return Tenants.GetTenant(id);
diff --git a/Oqtane.Server/Repository/Interfaces/ILogRepository.cs b/Oqtane.Server/Repository/Interfaces/ILogRepository.cs
index 159fe2b6..3bb38f9f 100644
--- a/Oqtane.Server/Repository/Interfaces/ILogRepository.cs
+++ b/Oqtane.Server/Repository/Interfaces/ILogRepository.cs
@@ -5,7 +5,8 @@ namespace Oqtane.Repository
{
public interface ILogRepository
{
+ IEnumerable GetLogs(int SiteId, string Level, int Rows);
+ Log GetLog(int LogId);
void AddLog(Log Log);
- IEnumerable GetLogs(int SiteId);
}
}
diff --git a/Oqtane.Server/Repository/Interfaces/IPageModuleRepository.cs b/Oqtane.Server/Repository/Interfaces/IPageModuleRepository.cs
index 42b46dc0..dc5f1d50 100644
--- a/Oqtane.Server/Repository/Interfaces/IPageModuleRepository.cs
+++ b/Oqtane.Server/Repository/Interfaces/IPageModuleRepository.cs
@@ -10,6 +10,7 @@ namespace Oqtane.Repository
PageModule AddPageModule(PageModule PageModule);
PageModule UpdatePageModule(PageModule PageModule);
PageModule GetPageModule(int PageModuleId);
+ PageModule GetPageModule(int PageId, int ModuleId);
void DeletePageModule(int PageModuleId);
}
}
diff --git a/Oqtane.Server/Repository/LogRepository.cs b/Oqtane.Server/Repository/LogRepository.cs
index 295d7049..b98fa99b 100644
--- a/Oqtane.Server/Repository/LogRepository.cs
+++ b/Oqtane.Server/Repository/LogRepository.cs
@@ -14,15 +14,29 @@ namespace Oqtane.Repository
db = context;
}
+ public IEnumerable GetLogs(int SiteId, string Level, int Rows)
+ {
+ if (Level == null)
+ {
+ return db.Log.Where(item => item.SiteId == SiteId).
+ OrderByDescending(item => item.LogDate).Take(Rows);
+ }
+ else
+ {
+ return db.Log.Where(item => item.SiteId == SiteId && item.Level == Level)
+ .OrderByDescending(item => item.LogDate).Take(Rows);
+ }
+ }
+
+ public Log GetLog(int LogId)
+ {
+ return db.Log.Find(LogId);
+ }
+
public void AddLog(Log Log)
{
db.Log.Add(Log);
db.SaveChanges();
}
-
- public IEnumerable GetLogs(int SiteId)
- {
- return db.Log.Where(item => item.SiteId == SiteId).OrderByDescending(item=> item.LogDate).Take(50);
- }
}
}
diff --git a/Oqtane.Server/Repository/PageModuleRepository.cs b/Oqtane.Server/Repository/PageModuleRepository.cs
index 66d3a0d5..92ebb732 100644
--- a/Oqtane.Server/Repository/PageModuleRepository.cs
+++ b/Oqtane.Server/Repository/PageModuleRepository.cs
@@ -62,6 +62,18 @@ namespace Oqtane.Repository
return pagemodule;
}
+ public PageModule GetPageModule(int PageId, int ModuleId)
+ {
+ PageModule pagemodule = db.PageModule.Include(item => item.Module) // eager load modules
+ .SingleOrDefault(item => item.PageId == PageId && item.ModuleId == ModuleId);
+ if (pagemodule != null)
+ {
+ IEnumerable permissions = Permissions.GetPermissions("Module", pagemodule.ModuleId);
+ pagemodule.Module.Permissions = Permissions.EncodePermissions(pagemodule.ModuleId, permissions);
+ }
+ return pagemodule;
+ }
+
public void DeletePageModule(int PageModuleId)
{
PageModule PageModule = db.PageModule.Find(PageModuleId);