Browse Source

Fixes for app pattern.

pull/208/head
Sebastian Stehle 8 years ago
parent
commit
b35e8a509e
  1. 2
      src/Squidex.Domain.Apps.Core.Model/Apps/AppPattern.cs
  2. 37
      src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs
  3. 26
      src/Squidex.Domain.Apps.Entities/Apps/InitialPatterns.cs
  4. 2
      src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs
  5. 27
      src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs
  6. 7
      src/Squidex/Areas/Api/Controllers/UI/Models/UISettingsDto.cs
  7. 9
      src/Squidex/Areas/Api/Controllers/UI/UIController.cs
  8. 21
      src/Squidex/Config/Domain/WriteServices.cs
  9. 2
      tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppCommandMiddlewareTests.cs
  10. 23
      tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs

2
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));

37
src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs

@ -21,15 +21,29 @@ namespace Squidex.Domain.Apps.Entities.Apps
{
public sealed class AppDomainObject : DomainObjectBase<AppState>
{
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<Guid>(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<Guid> appId)
private static AppCreated CreateInitalEvent(NamedId<Guid> appId, RefToken actor, string name)
{
return new AppCreated { AppId = appId, Actor = actor, Name = name };
}
private static AppPatternAdded CreateInitialPattern(NamedId<Guid> 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<Guid> id)
private static AppLanguageAdded CreateInitialLanguage(NamedId<Guid> 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<Guid> id, SquidexCommand command)
private static AppContributorAssigned CreateInitialOwner(NamedId<Guid> 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()

26
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<Guid, AppPattern>
{
public InitialPatterns()
{
}
public InitialPatterns(Dictionary<Guid, AppPattern> patterns)
: base(patterns)
{
}
}
}

2
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 =

27
src/Squidex/Areas/Api/Controllers/UI/Models/UIRegexSuggestionDto.cs

@ -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
{
/// <summary>
/// The name of the suggestion.
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// The regex pattern.
/// </summary>
[Required]
public string Pattern { get; set; }
}
}

7
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
{
/// <summary>
/// The regex suggestions.
/// </summary>
[Required]
public List<UIRegexSuggestionDto> RegexSuggestions { get; set; }
/// <summary>
/// The type of the map control.
/// </summary>

9
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<UIRegexSuggestionDto>(),
MapType = uiOptions.Map?.Type ?? "OSM",
MapKey = uiOptions.Map?.GoogleMaps?.Key
};

21
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<SchemaDomainObject>()
.AsSelf();
services.AddSingleton<InitialPatterns>(c =>
{
var config = c.GetRequiredService<IOptions<MyUIOptions>>();
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;
});
}
}
}

2
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

23
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]*" })
);
}

Loading…
Cancel
Save