From b35e8a509e19027b6600a28dbe709964dd597854 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sun, 17 Dec 2017 13:48:21 +0100 Subject: [PATCH] Fixes for app pattern. --- .../Apps/AppPattern.cs | 2 +- .../Apps/AppDomainObject.cs | 37 ++++++++++++++----- .../Apps/InitialPatterns.cs | 26 +++++++++++++ .../Controllers/Apps/AppPatternsController.cs | 2 +- .../UI/Models/UIRegexSuggestionDto.cs | 27 -------------- .../Controllers/UI/Models/UISettingsDto.cs | 7 ---- .../Areas/Api/Controllers/UI/UIController.cs | 9 ----- src/Squidex/Config/Domain/WriteServices.cs | 21 +++++++++++ .../Apps/AppCommandMiddlewareTests.cs | 2 +- .../Apps/AppDomainObjectTests.cs | 23 +++++++++--- 10 files changed, 96 insertions(+), 60 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Entities/Apps/InitialPatterns.cs delete mode 100644 src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/AppPattern.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/AppPattern.cs index cfd0e6e8e..62fec4af0 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/AppPattern.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/AppPattern.cs @@ -32,7 +32,7 @@ namespace Squidex.Domain.Apps.Core.Apps get { return message; } } - public AppPattern(string name, string pattern, string message) + public AppPattern(string name, string pattern, string message = null) { Guard.NotNullOrEmpty(name, nameof(name)); Guard.NotNullOrEmpty(pattern, nameof(pattern)); diff --git a/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs b/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs index 6aae7ccfe..0a9ca47a3 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs @@ -21,15 +21,29 @@ namespace Squidex.Domain.Apps.Entities.Apps { public sealed class AppDomainObject : DomainObjectBase { + private readonly InitialPatterns initialPatterns; + + public AppDomainObject(InitialPatterns initialPatterns) + { + Guard.NotNull(initialPatterns, nameof(initialPatterns)); + + this.initialPatterns = initialPatterns; + } + public AppDomainObject Create(CreateApp command) { ThrowIfCreated(); var appId = new NamedId(command.AppId, command.Name); - RaiseEvent(SimpleMapper.Map(command, CreateInitalEvent(appId))); - RaiseEvent(SimpleMapper.Map(command, CreateInitialOwner(appId, command))); - RaiseEvent(SimpleMapper.Map(command, CreateInitialLanguage(appId))); + RaiseEvent(CreateInitalEvent(appId, command.Actor, command.Name)); + RaiseEvent(CreateInitialOwner(appId, command.Actor)); + RaiseEvent(CreateInitialLanguage(appId, command.Actor)); + + foreach (var pattern in initialPatterns) + { + RaiseEvent(CreateInitialPattern(appId, command.Actor, pattern.Key, pattern.Value)); + } return this; } @@ -160,19 +174,24 @@ namespace Squidex.Domain.Apps.Entities.Apps RaiseEvent(Envelope.Create(@event)); } - private static AppCreated CreateInitalEvent(NamedId appId) + private static AppCreated CreateInitalEvent(NamedId appId, RefToken actor, string name) + { + return new AppCreated { AppId = appId, Actor = actor, Name = name }; + } + + private static AppPatternAdded CreateInitialPattern(NamedId appId, RefToken actor, Guid id, AppPattern p) { - return new AppCreated { AppId = appId }; + return new AppPatternAdded { AppId = appId, Actor = actor, Id = id, Name = p.Name, Pattern = p.Pattern, Message = p.Message }; } - private static AppLanguageAdded CreateInitialLanguage(NamedId id) + private static AppLanguageAdded CreateInitialLanguage(NamedId appId, RefToken actor) { - return new AppLanguageAdded { AppId = id, Language = Language.EN }; + return new AppLanguageAdded { AppId = appId, Actor = actor, Language = Language.EN }; } - private static AppContributorAssigned CreateInitialOwner(NamedId id, SquidexCommand command) + private static AppContributorAssigned CreateInitialOwner(NamedId appId, RefToken actor) { - return new AppContributorAssigned { AppId = id, ContributorId = command.Actor.Identifier, Permission = AppContributorPermission.Owner }; + return new AppContributorAssigned { AppId = appId, Actor = actor, ContributorId = actor.Identifier, Permission = AppContributorPermission.Owner }; } private void ThrowIfNotCreated() diff --git a/src/Squidex.Domain.Apps.Entities/Apps/InitialPatterns.cs b/src/Squidex.Domain.Apps.Entities/Apps/InitialPatterns.cs new file mode 100644 index 000000000..eed1ca02b --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Apps/InitialPatterns.cs @@ -0,0 +1,26 @@ +// ========================================================================== +// InitialPatterns.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.Collections.Generic; +using Squidex.Domain.Apps.Core.Apps; + +namespace Squidex.Domain.Apps.Entities.Apps +{ + public sealed class InitialPatterns : Dictionary + { + public InitialPatterns() + { + } + + public InitialPatterns(Dictionary patterns) + : base(patterns) + { + } + } +} diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs index 934a07ce5..6dff37ad9 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs @@ -48,7 +48,7 @@ namespace Squidex.Areas.Api.Controllers.Apps [HttpGet] [Route("apps/{app}/patterns/")] [ProducesResponseType(typeof(AppPatternDto[]), 200)] - [ApiCosts(1)] + [ApiCosts(0)] public IActionResult GetPatterns(string app) { var response = diff --git a/src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs b/src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs deleted file mode 100644 index 363c86758..000000000 --- a/src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs +++ /dev/null @@ -1,27 +0,0 @@ -// ========================================================================== -// UIRegexSuggestionDto.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System.ComponentModel.DataAnnotations; - -namespace Squidex.Areas.Api.Controllers.UI.Models -{ - public sealed class UIRegexSuggestionDto - { - /// - /// The name of the suggestion. - /// - [Required] - public string Name { get; set; } - - /// - /// The regex pattern. - /// - [Required] - public string Pattern { get; set; } - } -} diff --git a/src/Squidex/Areas/Api/Controllers/UI/Models/UISettingsDto.cs b/src/Squidex/Areas/Api/Controllers/UI/Models/UISettingsDto.cs index c110d7517..7f6306615 100644 --- a/src/Squidex/Areas/Api/Controllers/UI/Models/UISettingsDto.cs +++ b/src/Squidex/Areas/Api/Controllers/UI/Models/UISettingsDto.cs @@ -6,19 +6,12 @@ // All rights reserved. // ========================================================================== -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace Squidex.Areas.Api.Controllers.UI.Models { public sealed class UISettingsDto { - /// - /// The regex suggestions. - /// - [Required] - public List RegexSuggestions { get; set; } - /// /// The type of the map control. /// diff --git a/src/Squidex/Areas/Api/Controllers/UI/UIController.cs b/src/Squidex/Areas/Api/Controllers/UI/UIController.cs index 17a3dbc52..441da2aac 100644 --- a/src/Squidex/Areas/Api/Controllers/UI/UIController.cs +++ b/src/Squidex/Areas/Api/Controllers/UI/UIController.cs @@ -6,8 +6,6 @@ // All rights reserved. // ========================================================================== -using System.Collections.Generic; -using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using NSwag.Annotations; @@ -44,13 +42,6 @@ namespace Squidex.Areas.Api.Controllers.UI { var dto = new UISettingsDto { - RegexSuggestions = - uiOptions.RegexSuggestions? - .Where(x => - !string.IsNullOrWhiteSpace(x.Key) && - !string.IsNullOrWhiteSpace(x.Value)) - .Select(x => new UIRegexSuggestionDto { Name = x.Key, Pattern = x.Value }).ToList() - ?? new List(), MapType = uiOptions.Map?.Type ?? "OSM", MapKey = uiOptions.Map?.GoogleMaps?.Key }; diff --git a/src/Squidex/Config/Domain/WriteServices.cs b/src/Squidex/Config/Domain/WriteServices.cs index 524c3e121..1762078fd 100644 --- a/src/Squidex/Config/Domain/WriteServices.cs +++ b/src/Squidex/Config/Domain/WriteServices.cs @@ -6,8 +6,11 @@ // All rights reserved. // ========================================================================== +using System; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Migrate_01; +using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Scripting; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Assets; @@ -78,6 +81,24 @@ namespace Squidex.Config.Domain services.AddTransientAs() .AsSelf(); + + services.AddSingleton(c => + { + var config = c.GetRequiredService>(); + + var result = new InitialPatterns(); + + foreach (var pattern in config.Value.RegexSuggestions) + { + if (!string.IsNullOrWhiteSpace(pattern.Key) && + !string.IsNullOrWhiteSpace(pattern.Value)) + { + result[Guid.NewGuid()] = new AppPattern(pattern.Key, pattern.Value); + } + } + + return result; + }); } } } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppCommandMiddlewareTests.cs index b07f64b1a..ef62c44b1 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppCommandMiddlewareTests.cs @@ -30,7 +30,7 @@ namespace Squidex.Domain.Apps.Entities.Apps private readonly string contributorId = Guid.NewGuid().ToString(); private readonly string clientName = "client"; private readonly Guid patternId = Guid.NewGuid(); - private readonly AppDomainObject app = new AppDomainObject(); + private readonly AppDomainObject app = new AppDomainObject(new InitialPatterns()); private readonly AppCommandMiddleware sut; protected override Guid Id diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs index d192ed65f..2a964de5c 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs @@ -25,7 +25,7 @@ namespace Squidex.Domain.Apps.Entities.Apps private readonly string clientNewName = "My Client"; private readonly string planId = "premium"; private readonly Guid patternId = Guid.NewGuid(); - private readonly AppDomainObject sut = new AppDomainObject(); + private readonly AppDomainObject sut = new AppDomainObject(new InitialPatterns()); protected override Guid Id { @@ -46,15 +46,28 @@ namespace Squidex.Domain.Apps.Entities.Apps [Fact] public void Create_should_specify_name_and_owner() { - sut.Create(CreateCommand(new CreateApp { Name = AppName, Actor = User, AppId = AppId })); + var id1 = Guid.NewGuid(); + var id2 = Guid.NewGuid(); - Assert.Equal(AppName, sut.State.Name); + var initialPatterns = new InitialPatterns + { + { id1, new AppPattern("Number", "[0-9]") }, + { id2, new AppPattern("Numbers", "[0-9]*") } + }; - sut.GetUncomittedEvents() + var app = new AppDomainObject(initialPatterns); + + app.Create(CreateCommand(new CreateApp { Name = AppName, Actor = User, AppId = AppId })); + + Assert.Equal(AppName, app.State.Name); + + app.GetUncomittedEvents() .ShouldHaveSameEvents( CreateEvent(new AppCreated { Name = AppName }), CreateEvent(new AppContributorAssigned { ContributorId = User.Identifier, Permission = AppContributorPermission.Owner }), - CreateEvent(new AppLanguageAdded { Language = Language.EN }) + CreateEvent(new AppLanguageAdded { Language = Language.EN }), + CreateEvent(new AppPatternAdded { Id = id1, Name = "Number", Pattern = "[0-9]" }), + CreateEvent(new AppPatternAdded { Id = id2, Name = "Numbers", Pattern = "[0-9]*" }) ); }