From 434cc9497eebd2ec9ae0ff93b6571a6a2d705a9d Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Fri, 4 Dec 2020 13:18:12 +0100 Subject: [PATCH] pageType handler --- zero.Core/Api/BackofficeApi.cs | 10 ------ zero.Core/Api/PagesApi.cs | 34 +++++++++++------- .../Entities/Messages/EntityMessageBase.cs | 14 -------- zero.Core/Entities/Messages/EntityMessages.cs | 24 ------------- zero.Core/Entities/Pages/PageType.cs | 27 +------------- zero.Core/Handlers/IPageCreationHandler.cs | 15 -------- zero.Core/Handlers/IPageTypeHandler.cs | 12 +++++++ zero.Core/Options/PageOptions.cs | 16 +++------ .../App/pages/pages/overlays/create.vue | 36 ++++++++++--------- zero.Web/Defaults/ZeroBackofficePlugin.cs | 2 +- 10 files changed, 59 insertions(+), 131 deletions(-) delete mode 100644 zero.Core/Entities/Messages/EntityMessageBase.cs delete mode 100644 zero.Core/Entities/Messages/EntityMessages.cs delete mode 100644 zero.Core/Handlers/IPageCreationHandler.cs create mode 100644 zero.Core/Handlers/IPageTypeHandler.cs diff --git a/zero.Core/Api/BackofficeApi.cs b/zero.Core/Api/BackofficeApi.cs index be8d437b..401d5ee1 100644 --- a/zero.Core/Api/BackofficeApi.cs +++ b/zero.Core/Api/BackofficeApi.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using zero.Core.Attributes; using zero.Core.Database; using zero.Core.Entities; -using zero.Core.Entities.Messages; using zero.Core.Extensions; using zero.Core.Utils; @@ -175,15 +174,6 @@ namespace zero.Core.Api meta?.Invoke(session.Advanced.GetMetadataFor(model)); - await Backoffice.Messages.Publish(new EntitySavedMessage() - { - Id = model.Id, - IsCreate = isCreate, - IsDelete = false, - Model = model, - Session = session - }); - await session.SaveChangesAsync(); return EntityResult.Success(model); diff --git a/zero.Core/Api/PagesApi.cs b/zero.Core/Api/PagesApi.cs index 3e2c93ad..1b3ad61a 100644 --- a/zero.Core/Api/PagesApi.cs +++ b/zero.Core/Api/PagesApi.cs @@ -54,8 +54,6 @@ namespace zero.Core.Api model.PageTypeAlias = type.Alias; model.ParentId = parentId; // TODO validate if type is allowed and if parentid is allowed - Handler.Get()?.OnCreate(model); - return Task.FromResult(model); } catch @@ -92,26 +90,36 @@ namespace zero.Core.Api public async Task> GetAllowedPageTypes(string parentId = null) { IEnumerable types = Options.Pages.GetAllItems(); + List parents = new(); - if (parentId.IsNullOrEmpty()) + using IAsyncDocumentSession session = Store.OpenAsyncSession(); + + if (!parentId.IsNullOrEmpty()) { - return types.Where(x => x.AllowAsRoot || x.OnlyAtRoot).ToList(); + Pages_ByHierarchy.Result result = await session.Query() + .ProjectInto() + .Include(x => x.Id) + .Include(x => x.Path.Select(p => p.Id)) + .FirstOrDefaultAsync(x => x.Id == parentId); + + if (result != null) + { + List ids = result.Path.Select(x => x.Id).ToList(); + ids.Add(result.Id); + parents = (await session.LoadAsync(ids)).Select(x => x.Value).Reverse().ToList(); + } } - Page page = await GetById(parentId); - PageType pageType = page != null ? types.FirstOrDefault(x => x.Alias == page.PageTypeAlias) : null; + IPageTypeHandler handler = Handler.Get(); - if (pageType == null) + // if there is no registered handler we just allow all page types + if (handler == null) { - return new List(); + return types.ToList(); } - if (pageType.AllowAllChildrenTypes) - { - return types.Where(x => !x.OnlyAtRoot).ToList(); - } - return types.Where(x => !x.OnlyAtRoot && pageType.AllowedChildrenTypes.Contains(x.Alias)).ToList(); + return handler.GetAllowedPageTypes(Backoffice.Context.Application, types, parents)?.ToList() ?? new(); } diff --git a/zero.Core/Entities/Messages/EntityMessageBase.cs b/zero.Core/Entities/Messages/EntityMessageBase.cs deleted file mode 100644 index 7bfe21bb..00000000 --- a/zero.Core/Entities/Messages/EntityMessageBase.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Raven.Client.Documents.Session; -using zero.Core.Messages; - -namespace zero.Core.Entities.Messages -{ - public abstract class EntityMessageBase : IMessage - { - public IAsyncDocumentSession Session { get; set; } - - public string Id { get; set; } - - public T Model { get; set; } - } -} diff --git a/zero.Core/Entities/Messages/EntityMessages.cs b/zero.Core/Entities/Messages/EntityMessages.cs deleted file mode 100644 index 130da7f1..00000000 --- a/zero.Core/Entities/Messages/EntityMessages.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace zero.Core.Entities.Messages -{ - public class EntityCreatedMessage : EntityMessageBase - { - - } - - public class EntityUpdatedMessage : EntityMessageBase - { - - } - - public class EntityDeletedMessage : EntityMessageBase - { - - } - - public class EntitySavedMessage : EntityMessageBase - { - public bool IsCreate { get; set; } - - public bool IsDelete { get; set; } - } -} diff --git a/zero.Core/Entities/Pages/PageType.cs b/zero.Core/Entities/Pages/PageType.cs index 67828bf5..d651d3f4 100644 --- a/zero.Core/Entities/Pages/PageType.cs +++ b/zero.Core/Entities/Pages/PageType.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace zero.Core.Entities { @@ -42,26 +41,6 @@ namespace zero.Core.Entities /// public string Icon { get; set; } - /// - /// Whether this page type can be used as a website entry point - /// - public bool AllowAsRoot { get; set; } - - /// - /// This page type is only allowed at the root level (ignoring other properties) - /// - public bool OnlyAtRoot { get; set; } - - /// - /// Whether all page types can be created as children of this type - /// - public bool AllowAllChildrenTypes { get; set; } - - /// - /// Page types which are allowed as children - /// - public List AllowedChildrenTypes { get; set; } = new List(); - public PageType(Type type) { @@ -75,11 +54,7 @@ namespace zero.Core.Entities Alias = model.Alias, Name = model.Name, Description = model.Description, - Icon = model.Icon, - AllowAllChildrenTypes = model.AllowAllChildrenTypes, - AllowedChildrenTypes = model.AllowedChildrenTypes, - AllowAsRoot = model.AllowAsRoot, - OnlyAtRoot = model.OnlyAtRoot + Icon = model.Icon }; } } diff --git a/zero.Core/Handlers/IPageCreationHandler.cs b/zero.Core/Handlers/IPageCreationHandler.cs deleted file mode 100644 index 795f0e69..00000000 --- a/zero.Core/Handlers/IPageCreationHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Http; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using zero.Core.Entities; - -namespace zero.Core.Handlers -{ - public interface IPageCreationHandler : IHandler - { - void OnCreate(IPage page); - } -} diff --git a/zero.Core/Handlers/IPageTypeHandler.cs b/zero.Core/Handlers/IPageTypeHandler.cs new file mode 100644 index 00000000..d5819332 --- /dev/null +++ b/zero.Core/Handlers/IPageTypeHandler.cs @@ -0,0 +1,12 @@ +using Raven.Client.Documents.Session; +using System.Collections.Generic; +using System.Threading.Tasks; +using zero.Core.Entities; + +namespace zero.Core.Handlers +{ + public interface IPageTypeHandler : IHandler + { + IEnumerable GetAllowedPageTypes(IApplication application, IEnumerable registeredTypes, IEnumerable parents); + } +} diff --git a/zero.Core/Options/PageOptions.cs b/zero.Core/Options/PageOptions.cs index f8d759d6..4a4fb223 100644 --- a/zero.Core/Options/PageOptions.cs +++ b/zero.Core/Options/PageOptions.cs @@ -18,34 +18,26 @@ namespace zero.Core.Options } - public void Add(string alias, string name, string description, string icon, bool allowAsRoot = false, bool allowAllChildrenTypes = false, List allowedChildrenTypes = null, bool onlyAtRoot = false) where T : Page, new() + public void Add(string alias, string name, string description, string icon) where T : Page, new() { Items.Add(new PageType(typeof(T)) { Alias = alias, Name = name, Description = description, - Icon = icon, - AllowAsRoot = allowAsRoot, - AllowAllChildrenTypes = allowAllChildrenTypes, - AllowedChildrenTypes = allowedChildrenTypes ?? new List(), - OnlyAtRoot = onlyAtRoot + Icon = icon }); } - public void Add(Type type, string alias, string name, string description, string icon, bool allowAsRoot = false, bool allowAllChildrenTypes = false, List allowedChildrenTypes = null, bool onlyAtRoot = false) + public void Add(Type type, string alias, string name, string description, string icon) { Items.Add(new PageType(type) { Alias = alias, Name = name, Description = description, - Icon = icon, - AllowAsRoot = allowAsRoot, - AllowAllChildrenTypes = allowAllChildrenTypes, - AllowedChildrenTypes = allowedChildrenTypes ?? new List(), - OnlyAtRoot = onlyAtRoot + Icon = icon }); } } diff --git a/zero.Web.UI/App/pages/pages/overlays/create.vue b/zero.Web.UI/App/pages/pages/overlays/create.vue index 5c8a5dd5..c58e7b79 100644 --- a/zero.Web.UI/App/pages/pages/overlays/create.vue +++ b/zero.Web.UI/App/pages/pages/overlays/create.vue @@ -1,21 +1,23 @@  @@ -52,6 +54,8 @@ mounted() { + this.loading = true; + PagesApi.getAllowedPageTypes(this.model.parentId).then(response => { this.pageTypes = response; diff --git a/zero.Web/Defaults/ZeroBackofficePlugin.cs b/zero.Web/Defaults/ZeroBackofficePlugin.cs index 23c6fd53..50d9d17e 100644 --- a/zero.Web/Defaults/ZeroBackofficePlugin.cs +++ b/zero.Web/Defaults/ZeroBackofficePlugin.cs @@ -43,7 +43,7 @@ namespace zero.Web.Defaults zero.Permissions.AddCollection(); zero.Permissions.AddCollection(); - zero.Pages.Add(Constants.Pages.FolderAlias, "@page.folder.name", "@page.folder.description", "fth-folder", true, true); + zero.Pages.Add(Constants.Pages.FolderAlias, "@page.folder.name", "@page.folder.description", "fth-folder"); }