diff --git a/zero.Core/Api/PagesApi.cs b/zero.Core/Api/PagesApi.cs index b594bcf3..e2992b8f 100644 --- a/zero.Core/Api/PagesApi.cs +++ b/zero.Core/Api/PagesApi.cs @@ -1,4 +1,5 @@ using FluentValidation; +using Microsoft.Extensions.Logging; using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; @@ -9,6 +10,7 @@ using System.Threading.Tasks; using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; +using zero.Core.Handlers; using zero.Core.Options; namespace zero.Core.Api @@ -20,12 +22,48 @@ namespace zero.Core.Api protected IZeroOptions Options { get; private set; } protected IRecycleBinApi RecycleBinApi { get; private set; } - - public PagesApi(IZeroOptions options, IBackofficeStore store, IRecycleBinApi recycleBinApi) : base(store) + protected ILogger Logger { get; private set; } + + protected IHandlerHolder Handler { get; private set; } + + + public PagesApi(IZeroOptions options, IBackofficeStore store, IRecycleBinApi recycleBinApi, ILogger logger, IHandlerHolder handler) : base(store) { Options = options; RecycleBinApi = recycleBinApi; + Logger = logger; + Handler = handler; + } + + + /// + public Task GetEmpty(string pageType, string parentId = null) + { + PageType type = GetPageType(pageType); + + if (type == null) + { + return Task.FromResult(null); + } + + try + { + IPage model = Activator.CreateInstance(type.ContentType) as IPage; + + 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 + { + Logger.LogWarning("Could not create page with type {type}", type); + } + + return Task.FromResult(null); } @@ -359,6 +397,11 @@ namespace zero.Core.Api public interface IPagesApi { + /// + /// Get a new empty page with the specified type + /// + public Task GetEmpty(string pageType, string parentId = null); + /// /// Get page by Id /// diff --git a/zero.Core/Api/Safenames.cs b/zero.Core/Api/Safenames.cs index b4ab06cd..1da0deea 100644 --- a/zero.Core/Api/Safenames.cs +++ b/zero.Core/Api/Safenames.cs @@ -40,6 +40,15 @@ namespace zero.Core.Api } + /// + /// Converts a term to a safe alias (suitable for URLs) + /// + public static string Alias(object value) + { + return Generate(value?.ToString(), Scope.Url); + } + + /// /// /// diff --git a/zero.Core/Handlers/IPageCreationHandler.cs b/zero.Core/Handlers/IPageCreationHandler.cs new file mode 100644 index 00000000..795f0e69 --- /dev/null +++ b/zero.Core/Handlers/IPageCreationHandler.cs @@ -0,0 +1,15 @@ +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.Web/Controllers/PagesController.cs b/zero.Web/Controllers/PagesController.cs index 45e714e4..bede767d 100644 --- a/zero.Web/Controllers/PagesController.cs +++ b/zero.Web/Controllers/PagesController.cs @@ -50,15 +50,9 @@ namespace zero.Web.Controllers } - public EditModel GetEmpty([FromQuery] string type, [FromQuery] string parent = null) + public async Task> GetEmpty([FromQuery] string type, [FromQuery] string parent = null) { - PageType pageType = Api.GetPageType(type); - IPage model = Activator.CreateInstance(pageType.ContentType) as IPage; - - model.PageTypeAlias = type; - model.ParentId = parent; - - return Edit(model); + return Edit(await Api.GetEmpty(type, parent)); } diff --git a/zero.Web/Controllers/ZeroController.cs b/zero.Web/Controllers/ZeroController.cs index 8043b00d..cbe43c0a 100644 --- a/zero.Web/Controllers/ZeroController.cs +++ b/zero.Web/Controllers/ZeroController.cs @@ -1,8 +1,10 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; +using zero.Core.Api; using zero.Core.Entities; using zero.Core.Routing; +using Microsoft.Extensions.DependencyInjection; namespace zero.Web.Controllers { @@ -21,10 +23,7 @@ namespace zero.Web.Controllers public override void OnActionExecuting(ActionExecutingContext filterContext) { - if (filterContext.RouteData.Values.TryGetValue("zero.app", out object app)) - { - Application = (IApplication)app; - } + Application = filterContext.HttpContext.RequestServices.GetService()?.App; if (filterContext.RouteData.Values.TryGetValue("zero.route", out object route)) {