replace Task.Run() logic in SiteService with async SiteRepository methods
This commit is contained in:
parent
e2182344a2
commit
e7157a8528
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user