replace Task.Run() logic in SiteService with async SiteRepository methods

This commit is contained in:
sbwalker 2024-02-27 15:12:48 -05:00
parent e2182344a2
commit e7157a8528
4 changed files with 99 additions and 31 deletions

View File

@ -2,6 +2,8 @@ using Microsoft.Extensions.Caching.Memory;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Oqtane.Extensions namespace Oqtane.Extensions
{ {
@ -19,23 +21,45 @@ namespace Oqtane.Extensions
if (track) if (track)
{ {
// track the cache key TrackCacheKey(cache, key);
List<string> cachekeys;
if (!cache.TryGetValue(_cachekeys, out cachekeys))
{
cachekeys = new List<string>();
}
if (!cachekeys.Contains(key))
{
cachekeys.Add(key);
cache.Set(_cachekeys, cachekeys, new MemoryCacheEntryOptions { Priority = CacheItemPriority.NeverRemove });
}
} }
} }
return (TItem)result; return (TItem)result;
} }
public static async Task<TItem> GetOrCreateAsync<TItem>(this IMemoryCache cache, string key, Func<ICacheEntry, Task<TItem>> factory, bool track)
{
if (!cache.TryGetValue(key, out object result))
{
using ICacheEntry entry = cache.CreateEntry(key);
result = await factory(entry).ConfigureAwait(false);
entry.Value = result;
if (track)
{
TrackCacheKey(cache, key);
}
}
return (TItem)result;
}
private static void TrackCacheKey(IMemoryCache cache, string key)
{
// track the cache key
List<string> cachekeys;
if (!cache.TryGetValue(_cachekeys, out cachekeys))
{
cachekeys = new List<string>();
}
if (!cachekeys.Contains(key))
{
cachekeys.Add(key);
cache.Set(_cachekeys, cachekeys, new MemoryCacheEntryOptions { Priority = CacheItemPriority.NeverRemove });
}
}
public static void Remove(this IMemoryCache cache, string key, bool track) public static void Remove(this IMemoryCache cache, string key, bool track)
{ {
List<string> cachekeys; List<string> cachekeys;

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Oqtane.Models; using Oqtane.Models;
namespace Oqtane.Repository namespace Oqtane.Repository
@ -6,11 +7,17 @@ namespace Oqtane.Repository
public interface ISiteRepository public interface ISiteRepository
{ {
IEnumerable<Site> GetSites(); IEnumerable<Site> GetSites();
Task<IEnumerable<Site>> GetSitesAsync();
Site AddSite(Site site); Site AddSite(Site site);
Task<Site> AddSiteAsync(Site site);
Site UpdateSite(Site site); Site UpdateSite(Site site);
Task<Site> UpdateSiteAsync(Site site);
Site GetSite(int siteId); Site GetSite(int siteId);
Task<Site> GetSiteAsync(int siteId);
Site GetSite(int siteId, bool tracking); Site GetSite(int siteId, bool tracking);
Task<Site> GetSiteAsync(int siteId, bool tracking);
void DeleteSite(int siteId); void DeleteSite(int siteId);
Task DeleteSiteAsync(int siteId);
void InitializeSite(Alias alias); void InitializeSite(Alias alias);
void CreatePages(Site site, List<PageTemplate> pageTemplates, Alias alias); void CreatePages(Site site, List<PageTemplate> pageTemplates, Alias alias);
} }

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -52,17 +53,29 @@ namespace Oqtane.Repository
public IEnumerable<Site> GetSites() public IEnumerable<Site> GetSites()
{ {
return _db.Site; return _db.Site.OrderBy(item => item.Name);
}
public async Task<IEnumerable<Site>> GetSitesAsync()
{
return await _db.Site.OrderBy(item => item.Name).ToListAsync();
} }
public Site AddSite(Site site) public Site AddSite(Site site)
{ {
site.SiteGuid = System.Guid.NewGuid().ToString(); site.SiteGuid = Guid.NewGuid().ToString();
_db.Site.Add(site); _db.Site.Add(site);
_db.SaveChanges(); _db.SaveChanges();
CreateSite(site); CreateSite(site);
return site; return site;
} }
public async Task<Site> AddSiteAsync(Site site)
{
site.SiteGuid = Guid.NewGuid().ToString();
_db.Site.Add(site);
await _db.SaveChangesAsync();
CreateSite(site);
return site;
}
public Site UpdateSite(Site site) public Site UpdateSite(Site site)
{ {
@ -70,11 +83,21 @@ namespace Oqtane.Repository
_db.SaveChanges(); _db.SaveChanges();
return site; return site;
} }
public async Task<Site> UpdateSiteAsync(Site site)
{
_db.Entry(site).State = EntityState.Modified;
await _db.SaveChangesAsync();
return site;
}
public Site GetSite(int siteId) public Site GetSite(int siteId)
{ {
return GetSite(siteId, true); return GetSite(siteId, true);
} }
public async Task<Site> GetSiteAsync(int siteId)
{
return await GetSiteAsync(siteId, true);
}
public Site GetSite(int siteId, bool tracking) public Site GetSite(int siteId, bool tracking)
{ {
@ -87,6 +110,17 @@ namespace Oqtane.Repository
return _db.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId); return _db.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId);
} }
} }
public async Task<Site> GetSiteAsync(int siteId, bool tracking)
{
if (tracking)
{
return await _db.Site.FindAsync(siteId);
}
else
{
return await _db.Site.AsNoTracking().FirstOrDefaultAsync(item => item.SiteId == siteId);
}
}
public void DeleteSite(int siteId) public void DeleteSite(int siteId)
{ {
@ -94,6 +128,12 @@ namespace Oqtane.Repository
_db.Site.Remove(site); _db.Site.Remove(site);
_db.SaveChanges(); _db.SaveChanges();
} }
public async Task DeleteSiteAsync(int siteId)
{
var site = await _db.Site.FindAsync(siteId);
_db.Site.Remove(site);
_db.SaveChanges();
}
public void InitializeSite(Alias alias) public void InitializeSite(Alias alias)
{ {

View File

@ -55,37 +55,35 @@ namespace Oqtane.Services
List<Site> sites = new List<Site>(); List<Site> sites = new List<Site>();
if (_accessor.HttpContext.User.IsInRole(RoleNames.Host)) if (_accessor.HttpContext.User.IsInRole(RoleNames.Host))
{ {
sites = _sites.GetSites().OrderBy(item => item.Name).ToList(); sites = (await _sites.GetSitesAsync()).ToList();
} }
return await Task.Run(() => sites); return sites;
} }
public async Task<Site> GetSiteAsync(int siteId) public async Task<Site> GetSiteAsync(int siteId)
{ {
Site site = null;
if (!_accessor.HttpContext.User.Identity.IsAuthenticated) if (!_accessor.HttpContext.User.Identity.IsAuthenticated)
{ {
site = _cache.GetOrCreate($"site:{_accessor.HttpContext.GetAlias().SiteKey}", entry => return await _cache.GetOrCreateAsync($"site:{_accessor.HttpContext.GetAlias().SiteKey}", async entry =>
{ {
entry.SlidingExpiration = TimeSpan.FromMinutes(30); entry.SlidingExpiration = TimeSpan.FromMinutes(30);
return GetSite(siteId); return await GetSite(siteId);
}, true); }, true);
} }
else // authenticated - cached per user else // authenticated - cached per user
{ {
site = _cache.GetOrCreate($"site:{_accessor.HttpContext.GetAlias().SiteKey}:{_accessor.HttpContext.User.UserId}", entry => return await _cache.GetOrCreateAsync($"site:{_accessor.HttpContext.GetAlias().SiteKey}:{_accessor.HttpContext.User.UserId}", async entry =>
{ {
entry.SlidingExpiration = TimeSpan.FromMinutes(30); entry.SlidingExpiration = TimeSpan.FromMinutes(30);
return GetSite(siteId); return await GetSite(siteId);
}, true); }, true);
} }
return await Task.Run(() => site);
} }
private Site GetSite(int siteid) private async Task<Site> GetSite(int siteid)
{ {
var alias = _tenantManager.GetAlias(); var alias = _tenantManager.GetAlias();
var site = _sites.GetSite(siteid); var site = await _sites.GetSiteAsync(siteid);
if (site != null && site.SiteId == alias.SiteId) if (site != null && site.SiteId == alias.SiteId)
{ {
// site settings // site settings
@ -184,7 +182,7 @@ namespace Oqtane.Services
{ {
if (_accessor.HttpContext.User.IsInRole(RoleNames.Host)) if (_accessor.HttpContext.User.IsInRole(RoleNames.Host))
{ {
site = _sites.AddSite(site); site = await _sites.AddSiteAsync(site);
_syncManager.AddSyncEvent(_tenantManager.GetAlias(), EntityNames.Site, site.SiteId, SyncEventActions.Create); _syncManager.AddSyncEvent(_tenantManager.GetAlias(), EntityNames.Site, site.SiteId, SyncEventActions.Create);
_logger.Log(site.SiteId, LogLevel.Information, this, LogFunction.Create, "Site Added {Site}", site); _logger.Log(site.SiteId, LogLevel.Information, this, LogFunction.Create, "Site Added {Site}", site);
} }
@ -192,7 +190,7 @@ namespace Oqtane.Services
{ {
site = null; site = null;
} }
return await Task.Run(() => site); return site;
} }
public async Task<Site> UpdateSiteAsync(Site site) public async Task<Site> UpdateSiteAsync(Site site)
@ -200,10 +198,10 @@ namespace Oqtane.Services
if (_accessor.HttpContext.User.IsInRole(RoleNames.Admin)) if (_accessor.HttpContext.User.IsInRole(RoleNames.Admin))
{ {
var alias = _tenantManager.GetAlias(); var alias = _tenantManager.GetAlias();
var current = _sites.GetSite(site.SiteId, false); var current = await _sites.GetSiteAsync(site.SiteId, false);
if (site.SiteId == alias.SiteId && site.TenantId == alias.TenantId && current != null) if (site.SiteId == alias.SiteId && site.TenantId == alias.TenantId && current != null)
{ {
site = _sites.UpdateSite(site); site = await _sites.UpdateSiteAsync(site);
_syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Update); _syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Update);
string action = SyncEventActions.Refresh; string action = SyncEventActions.Refresh;
if (current.RenderMode != site.RenderMode || current.Runtime != site.Runtime) if (current.RenderMode != site.RenderMode || current.Runtime != site.Runtime)
@ -223,7 +221,7 @@ namespace Oqtane.Services
{ {
site = null; site = null;
} }
return await Task.Run(() => site); return site;
} }
public async Task DeleteSiteAsync(int siteId) public async Task DeleteSiteAsync(int siteId)
@ -231,10 +229,10 @@ namespace Oqtane.Services
if (_accessor.HttpContext.User.IsInRole(RoleNames.Host)) if (_accessor.HttpContext.User.IsInRole(RoleNames.Host))
{ {
var alias = _tenantManager.GetAlias(); var alias = _tenantManager.GetAlias();
var site = _sites.GetSite(siteId); var site = await _sites.GetSiteAsync(siteId);
if (site != null && site.SiteId == alias.SiteId) if (site != null && site.SiteId == alias.SiteId)
{ {
_sites.DeleteSite(siteId); await _sites.DeleteSiteAsync(siteId);
_syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Delete); _syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Delete);
_logger.Log(siteId, LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", siteId); _logger.Log(siteId, LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", siteId);
} }
@ -243,7 +241,6 @@ namespace Oqtane.Services
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Site Delete Attempt {SiteId}", siteId); _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Site Delete Attempt {SiteId}", siteId);
} }
} }
await Task.CompletedTask;
} }
private static List<Page> GetPagesHierarchy(List<Page> pages) private static List<Page> GetPagesHierarchy(List<Page> pages)