From d2b95b4aea8cb515d7c1a82d4e61b44d0105471b Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Thu, 20 May 2021 15:21:37 +0200 Subject: [PATCH] Revert "some useless shit" This reverts commit 3954f95abc86260c0364a85ef139cdcbef4ba39a. --- zero.Core/ApplicationResolver.cs | 69 ++++++---- zero.Core/Caches/Internal/ApplicationCache.cs | 10 -- .../Caches/Internal/BackofficeUserCache.cs | 19 --- .../Caches/Internal/InternalEntityCache.cs | 119 ------------------ zero.Core/Cultures/CultureResolver.cs | 54 ++++---- .../Database/Indexes/Routes_ForResolver.cs | 19 --- zero.Core/Database/ZeroDocumentSession.cs | 9 +- zero.Core/Database/ZeroStore.cs | 8 -- .../Handlers/IApplicationResolverHandler.cs | 2 +- zero.Core/Routing/Routes.cs | 3 +- zero.Core/Routing/ZeroRoutesTransformer.cs | 6 +- zero.Core/ZeroContext.cs | 8 +- zero.Core/zero.Core.csproj | 1 - zero.Web/Middlewares/ZeroContextMiddleware.cs | 2 - zero.Web/ZeroBuilder.cs | 9 +- 15 files changed, 82 insertions(+), 256 deletions(-) delete mode 100644 zero.Core/Caches/Internal/ApplicationCache.cs delete mode 100644 zero.Core/Caches/Internal/BackofficeUserCache.cs delete mode 100644 zero.Core/Caches/Internal/InternalEntityCache.cs delete mode 100644 zero.Core/Database/Indexes/Routes_ForResolver.cs diff --git a/zero.Core/ApplicationResolver.cs b/zero.Core/ApplicationResolver.cs index 2f92dea3..76989417 100644 --- a/zero.Core/ApplicationResolver.cs +++ b/zero.Core/ApplicationResolver.cs @@ -1,25 +1,26 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.Logging; +using Raven.Client.Documents; +using Raven.Client.Documents.Session; using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using zero.Core.Caches.Internal; using zero.Core.Database; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Handlers; +using zero.Core.Identity; using zero.Core.Options; namespace zero.Core { public class ApplicationResolver : IApplicationResolver { - ApplicationCache _applicationCache; - BackofficeUserCache _backofficeUserCache; + protected IZeroStore Store { get; private set; } protected IZeroOptions Options { get; private set; } @@ -27,12 +28,13 @@ namespace zero.Core protected IHandlerHolder Handler { get; private set; } + private IList Apps { get; set; } + public ApplicationResolver(IZeroStore store, IZeroOptions options, ILogger logger, IHandlerHolder handler = null) { - _applicationCache = new ApplicationCache(store); - _backofficeUserCache = new BackofficeUserCache(store); + Store = store; Options = options; Logger = logger; Handler = handler; @@ -62,7 +64,8 @@ namespace zero.Core if (app == null) { //Logger.LogWarning("Could not resolve application for host {host}", context.Request.Host); - app = _applicationCache.All.FirstOrDefault(); + IList apps = await GetApplications(); + app = apps.FirstOrDefault(); } return app; @@ -72,20 +75,13 @@ namespace zero.Core /// public async Task ResolveFromUser(ClaimsPrincipal user) { - BackofficeUserCache.Result userEntity = GetBackofficeUser(user); - return userEntity != null ? await ResolveFromUser(new BackofficeUser() - { - Id = userEntity.Id, - AppId = userEntity.AppId, - CurrentAppId = userEntity.CurrentAppId, - Claims = userEntity.Claims, - IsSuper = userEntity.IsSuper - }) : null; + BackofficeUser userEntity = await GetBackofficeUser(user); + return await ResolveFromUser(userEntity); } /// - public Task ResolveFromUser(BackofficeUser user) + public async Task ResolveFromUser(BackofficeUser user) { if (user == null) { @@ -116,35 +112,36 @@ namespace zero.Core throw new Exception($"User entity ${user.Id} needs a valid AppId"); } - return Task.FromResult(_applicationCache.ById(appId)); + using IAsyncDocumentSession session = Store.OpenCoreSession(); + return await session.LoadAsync(appId); } /// public async Task ResolveFromRequest(HttpContext context) { - return Handler.Get()?.Resolve(context.Request, _applicationCache.All) ?? await ResolveFromUri(context.Request.GetEncodedUrl()); + return Handler.Get()?.Resolve(context.Request, await GetApplications()) ?? await ResolveFromUri(context.Request.GetEncodedUrl()); } /// - public Task ResolveFromUri(string uriString) + public async Task ResolveFromUri(string uriString) { - return Task.FromResult(ResolveFromUriInternal(new Uri(uriString, UriKind.Absolute), _applicationCache.All)); + return ResolveFromUriInternal(new Uri(uriString, UriKind.Absolute), await GetApplications()); } /// - public Task ResolveFromUri(Uri uri) + public async Task ResolveFromUri(Uri uri) { - return Task.FromResult(ResolveFromUriInternal(uri, _applicationCache.All)); + return ResolveFromUriInternal(uri, await GetApplications()); } /// /// Get matching application from an URI /// - Application ResolveFromUriInternal(Uri uri, IEnumerable apps) + Application ResolveFromUriInternal(Uri uri, IList apps) { foreach (Application app in apps) { @@ -168,13 +165,31 @@ namespace zero.Core } + /// + /// Get all applications to choose from + /// + async Task> GetApplications() + { + if (Apps != null) + { + return Apps; + } + + using IAsyncDocumentSession session = Store.OpenCoreSession(); + Apps = await session.Query().ToListAsync(); + return Apps; + } + + /// /// Get backoffice user from claims principal /// - BackofficeUserCache.Result GetBackofficeUser(ClaimsPrincipal user) + async Task GetBackofficeUser(ClaimsPrincipal user) { string userId = user.FindFirstValue(Constants.Auth.Claims.UserId); - return _backofficeUserCache.ById(userId); + + using IAsyncDocumentSession session = Store.OpenCoreSession(); + return await session.LoadAsync(userId); } } diff --git a/zero.Core/Caches/Internal/ApplicationCache.cs b/zero.Core/Caches/Internal/ApplicationCache.cs deleted file mode 100644 index 4c9d30a9..00000000 --- a/zero.Core/Caches/Internal/ApplicationCache.cs +++ /dev/null @@ -1,10 +0,0 @@ -using zero.Core.Database; -using zero.Core.Entities; - -namespace zero.Core.Caches.Internal -{ - public class ApplicationCache : InternalEntityCache - { - public ApplicationCache(IZeroStore store) : base(store) { } - } -} diff --git a/zero.Core/Caches/Internal/BackofficeUserCache.cs b/zero.Core/Caches/Internal/BackofficeUserCache.cs deleted file mode 100644 index 6ac4e4d4..00000000 --- a/zero.Core/Caches/Internal/BackofficeUserCache.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using zero.Core.Database; -using zero.Core.Entities; - -namespace zero.Core.Caches.Internal -{ - public class BackofficeUserCache : InternalEntityCache - { - public BackofficeUserCache(IZeroStore store) : base(store) { } - - public class Result : ZeroIdEntity - { - public string AppId { get; set; } - public string CurrentAppId { get; set; } - public bool IsSuper { get; set; } - public List Claims { get; set; } = new(); - } - } -} diff --git a/zero.Core/Caches/Internal/InternalEntityCache.cs b/zero.Core/Caches/Internal/InternalEntityCache.cs deleted file mode 100644 index bf51b5e4..00000000 --- a/zero.Core/Caches/Internal/InternalEntityCache.cs +++ /dev/null @@ -1,119 +0,0 @@ -using Raven.Client.Documents; -using Raven.Client.Documents.Changes; -using Raven.Client.Documents.Session; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using zero.Core.Database; -using zero.Core.Entities; -using zero.Core.Extensions; - -namespace zero.Core.Caches.Internal -{ - public abstract class InternalEntityCache : InternalEntityCache, IInternalEntityCache where T : ZeroIdEntity - { - public InternalEntityCache(IZeroStore store, bool isCore = true) : base(store, isCore) { } - } - - public abstract class InternalEntityCache : IInternalEntityCache, IDisposable where T : ZeroIdEntity where TProjection : ZeroIdEntity - { - protected IZeroStore Store { get; private set; } - protected ConcurrentBag _cache = new(); - protected bool _isDirty = true; - protected bool _isCore = true; - IDatabaseChanges _subscription = null; - - - public InternalEntityCache(IZeroStore store, bool isCore = true) - { - Store = store; - - _isCore = isCore; - _subscription = store.Changes(isCore ? store.CoreDatabase : store.ResolvedDatabase); - _subscription - .ForDocumentsInCollection() - .Subscribe(change => Refresh(change)); - } - - /// - public bool IsDirty => _isDirty; - - - /// - public ConcurrentBag All - { - get - { - CheckIntegrity(); - return _cache; - } - } - - - /// - public TProjection ById(string id) - { - if (id.IsNullOrEmpty()) - { - return default; - } - CheckIntegrity(); - return _cache.FirstOrDefault(x => x.Id == id); - } - - - /// - public void Dispose() - { - _subscription?.Dispose(); - } - - - void CheckIntegrity() - { - if (_isDirty || _cache.IsEmpty) - { - Refresh(); - } - } - - - /// - /// Refreshes the application cache - /// - protected virtual void Refresh(DocumentChange change = null) - { - _isDirty = true; - - using IDocumentSession session = Store.OpenSession(_isCore ? Store.CoreDatabase : Store.ResolvedDatabase); - List items = session.Query().ProjectInto().ToList(); - - _cache.Clear(); - - foreach (TProjection item in items) - { - _cache.Add(item); - } - - _isDirty = false; - } - } - - - public interface IInternalEntityCache : IInternalEntityCache where T : ZeroIdEntity { } - - - public interface IInternalEntityCache : IDisposable where T : ZeroIdEntity where TProjection : ZeroIdEntity - { - /// - /// Get all registered items - /// - ConcurrentBag All { get; } - - /// - /// Get a registered items by ID - /// - TProjection ById(string id); - } -} diff --git a/zero.Core/Cultures/CultureResolver.cs b/zero.Core/Cultures/CultureResolver.cs index 57dec5cd..bde2599a 100644 --- a/zero.Core/Cultures/CultureResolver.cs +++ b/zero.Core/Cultures/CultureResolver.cs @@ -1,10 +1,10 @@ using FluentValidation; using Microsoft.Extensions.Logging; using Raven.Client.Documents; +using Raven.Client.Documents.Session; using System; using System.Globalization; using System.Threading.Tasks; -using zero.Core.Database; using zero.Core.Entities; namespace zero.Core.Cultures @@ -13,6 +13,7 @@ namespace zero.Core.Cultures { protected ILogger Logger { get; private set; } + public CultureResolver(ILogger logger) { Logger = logger; @@ -20,32 +21,38 @@ namespace zero.Core.Cultures /// - public CultureInfo DefaultCurrentCulture => CultureInfo.CurrentCulture; - - - /// - public async Task Resolve(IZeroDocumentSession session) + public async Task Resolve(IZeroContext context) { + using IAsyncDocumentSession session = context.Store.OpenAsyncSession(); + // TODO this is just fake, we need to correctly resolve culture here - Language language = await session.Query().FirstOrDefaultAsync(); - if (language == null) + if (context.IsBackofficeRequest) { - Logger.LogWarning("Could not set request culture as there is no available Language stored"); - return CultureInfo.CurrentCulture; - } - try - { - CultureInfo culture = CultureInfo.CreateSpecificCulture(language.Code); - CultureInfo.CurrentCulture = culture; - CultureInfo.CurrentUICulture = culture; - ValidatorOptions.Global.LanguageManager.Culture = culture; } - catch (Exception ex) + else { - Logger.LogError(ex, "Could not create culture from Language code {code}", language.Code); - return CultureInfo.CurrentCulture; + Language language = await session.Query().FirstOrDefaultAsync(); + + if (language == null) + { + Logger.LogWarning("Could not set request culture as there is no available Language stored"); + return CultureInfo.CurrentCulture; + } + + try + { + CultureInfo culture = CultureInfo.CreateSpecificCulture(language.Code); + CultureInfo.CurrentCulture = culture; + CultureInfo.CurrentUICulture = culture; + ValidatorOptions.Global.LanguageManager.Culture = culture; + } + catch (Exception ex) + { + Logger.LogError(ex, "Could not create culture from Language code {code}", language.Code); + return CultureInfo.CurrentCulture; + } } return CultureInfo.CurrentCulture; @@ -55,15 +62,10 @@ namespace zero.Core.Cultures public interface ICultureResolver { - /// - /// Default value for CultureInfo.CurrentCulture - /// - CultureInfo DefaultCurrentCulture { get; } - /// /// Resolves the current application from either the backoffice user (in case it is backoffice request) /// or the domain (in case it is frontend request). /// - Task Resolve(IZeroDocumentSession session); + Task Resolve(IZeroContext context); } } diff --git a/zero.Core/Database/Indexes/Routes_ForResolver.cs b/zero.Core/Database/Indexes/Routes_ForResolver.cs deleted file mode 100644 index ceab4e9c..00000000 --- a/zero.Core/Database/Indexes/Routes_ForResolver.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Raven.Client.Documents.Indexes; -using System.Linq; -using zero.Core.Routing; - -namespace zero.Core.Database.Indexes -{ - public class Routes_ForResolver : AbstractIndexCreationTask - { - public Routes_ForResolver() - { - Map = items => items - .Select(x => new - { - Url = x.Url, - AllowSuffix = x.AllowSuffix - }); - } - } -} diff --git a/zero.Core/Database/ZeroDocumentSession.cs b/zero.Core/Database/ZeroDocumentSession.cs index 413d4d3e..cee602df 100644 --- a/zero.Core/Database/ZeroDocumentSession.cs +++ b/zero.Core/Database/ZeroDocumentSession.cs @@ -4,7 +4,7 @@ using System; namespace zero.Core.Database { - public class ZeroDocumentSession : AsyncDocumentSession, IZeroDocumentSession, IZeroCoreDocumentSession + public class ZeroDocumentSession : AsyncDocumentSession, IZeroDocumentSession { public ZeroDocumentSession(DocumentStore documentStore, Guid id, SessionOptions options) : base(documentStore, id, options) { @@ -12,14 +12,9 @@ namespace zero.Core.Database } } + public interface IZeroDocumentSession : IAsyncDocumentSession { } - - - public interface IZeroCoreDocumentSession : IAsyncDocumentSession - { - - } } diff --git a/zero.Core/Database/ZeroStore.cs b/zero.Core/Database/ZeroStore.cs index 93871ee7..c411bb89 100644 --- a/zero.Core/Database/ZeroStore.cs +++ b/zero.Core/Database/ZeroStore.cs @@ -24,9 +24,6 @@ namespace zero.Core.Database /// public string ResolvedDatabase { get; set; } - /// - public string CoreDatabase => Options.Raven.Database; - /// public IDocumentStore Raven => this; @@ -142,11 +139,6 @@ namespace zero.Core.Database /// string ResolvedDatabase { get; set; } - /// - /// The core database which hosts applications, users and shared resources - /// - string CoreDatabase { get; } - /// /// Get underlying raven document store /// diff --git a/zero.Core/Handlers/IApplicationResolverHandler.cs b/zero.Core/Handlers/IApplicationResolverHandler.cs index 200328d1..f7dc1e98 100644 --- a/zero.Core/Handlers/IApplicationResolverHandler.cs +++ b/zero.Core/Handlers/IApplicationResolverHandler.cs @@ -10,6 +10,6 @@ namespace zero.Core.Handlers { public interface IApplicationResolverHandler : IHandler { - Application Resolve(HttpRequest request, IEnumerable applications); + Application Resolve(HttpRequest request, IList applications); } } diff --git a/zero.Core/Routing/Routes.cs b/zero.Core/Routing/Routes.cs index b5b880ec..65ed7bcf 100644 --- a/zero.Core/Routing/Routes.cs +++ b/zero.Core/Routing/Routes.cs @@ -9,7 +9,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Database; -using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Options; @@ -139,7 +138,7 @@ namespace zero.Core.Routing min -= 1; } - IList routes = await session.Query() + IList routes = await session.Query() .Where(x => (!x.AllowSuffix && x.Url == path) || (x.AllowSuffix && x.Url.In(parts))) .Include("References[].Id") .Include("Dependencies") diff --git a/zero.Core/Routing/ZeroRoutesTransformer.cs b/zero.Core/Routing/ZeroRoutesTransformer.cs index a13e85fd..68eac401 100644 --- a/zero.Core/Routing/ZeroRoutesTransformer.cs +++ b/zero.Core/Routing/ZeroRoutesTransformer.cs @@ -9,19 +9,15 @@ namespace zero.Core.Routing public class ZeroRoutesTransformer : DynamicRouteValueTransformer { IRoutes Routes; - IZeroContext Context; - public ZeroRoutesTransformer(IRoutes routes, IZeroContext context) + public ZeroRoutesTransformer(IRoutes routes) { Routes = routes; - Context = context; } public override async ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values) { - Console.WriteLine("ZeroRoutesTransformer"); - await Context.Resolve(httpContext); IResolvedRoute route = await Routes.ResolveUrl(httpContext); if (route == null) diff --git a/zero.Core/ZeroContext.cs b/zero.Core/ZeroContext.cs index 4bff95b8..acc9e746 100644 --- a/zero.Core/ZeroContext.cs +++ b/zero.Core/ZeroContext.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; +using Raven.Client.Documents.Session; using System.Security.Claims; using System.Threading.Tasks; using zero.Core.Cultures; @@ -41,16 +42,19 @@ namespace zero.Core protected IApplicationResolver AppResolver { get; private set; } + protected ICultureResolver CultureResolver { get; private set; } + protected ILogger Logger { get; private set; } private bool _resolved = false; - public ZeroContext(IZeroOptions options, IApplicationResolver appResolver, ILogger logger, IZeroStore store) + public ZeroContext(IZeroOptions options, IApplicationResolver appResolver, ICultureResolver cultureResolver, ILogger logger, IZeroStore store) { Options = options; AppResolver = appResolver; + CultureResolver = cultureResolver; Logger = logger; Store = store; } @@ -96,7 +100,7 @@ namespace zero.Core Store.ResolvedDatabase = Application.Database; // set current culture - //await CultureResolver.Resolve(this); + await CultureResolver.Resolve(this); // resolve request route if (IsBackofficeRequest is false && context.Request.RouteValues.TryGetValue("zero.route", out object route)) diff --git a/zero.Core/zero.Core.csproj b/zero.Core/zero.Core.csproj index 1f10698e..a3553078 100644 --- a/zero.Core/zero.Core.csproj +++ b/zero.Core/zero.Core.csproj @@ -30,7 +30,6 @@ - diff --git a/zero.Web/Middlewares/ZeroContextMiddleware.cs b/zero.Web/Middlewares/ZeroContextMiddleware.cs index 74a8fb44..3d2f15a9 100644 --- a/zero.Web/Middlewares/ZeroContextMiddleware.cs +++ b/zero.Web/Middlewares/ZeroContextMiddleware.cs @@ -1,5 +1,4 @@ using Microsoft.AspNetCore.Http; -using System; using System.Threading.Tasks; using zero.Core; @@ -16,7 +15,6 @@ namespace zero.Web.Middlewares public async Task Invoke(HttpContext httpContext, IZeroContext zeroContext) { - Console.WriteLine("ZeroContextMiddleware"); await zeroContext.Resolve(httpContext); await Next(httpContext); } diff --git a/zero.Web/ZeroBuilder.cs b/zero.Web/ZeroBuilder.cs index 4124da13..2433ea7a 100644 --- a/zero.Web/ZeroBuilder.cs +++ b/zero.Web/ZeroBuilder.cs @@ -175,19 +175,12 @@ namespace zero.Web }); - Services.AddScoped(services => + Services.AddScoped(services => { var session = services.GetRequiredService()!.OpenAsyncSession(); session.Advanced.WaitForIndexesAfterSaveChanges(); return session as ZeroDocumentSession; }); - - Services.AddScoped(services => - { - var session = services.GetRequiredService()!.OpenCoreSession(); - session.Advanced.WaitForIndexesAfterSaveChanges(); - return session as ZeroDocumentSession; - }); }