Browse Source

Extra event for plan reset.

pull/361/head
Sebastian Stehle 7 years ago
parent
commit
7dfdd2262e
  1. 13
      src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs
  2. 28
      src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs
  3. 5
      src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs
  4. 4
      src/Squidex.Domain.Apps.Events/Apps/AppPlanChanged.cs
  5. 16
      src/Squidex.Domain.Apps.Events/Apps/AppPlanReset.cs
  6. 34
      tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppGrainTests.cs
  7. 33
      tools/Migrate_01/OldEvents/AppPlanChangedOld.cs

13
src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs

@ -200,10 +200,12 @@ namespace Squidex.Domain.Apps.Entities.Apps
{ {
if (result is PlanResetResult) if (result is PlanResetResult)
{ {
c.PlanId = null; ResetPlan(c);
}
else
{
ChangePlan(c);
} }
ChangePlan(c);
} }
return result; return result;
@ -306,6 +308,11 @@ namespace Squidex.Domain.Apps.Entities.Apps
RaiseEvent(SimpleMapper.Map(command, new AppPlanChanged())); RaiseEvent(SimpleMapper.Map(command, new AppPlanChanged()));
} }
public void ResetPlan(ChangePlan command)
{
RaiseEvent(SimpleMapper.Map(command, new AppPlanReset()));
}
public void AddPattern(AddPattern command) public void AddPattern(AddPattern command)
{ {
RaiseEvent(SimpleMapper.Map(command, new AppPatternAdded())); RaiseEvent(SimpleMapper.Map(command, new AppPatternAdded()));

28
src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs

@ -17,13 +17,9 @@ namespace Squidex.Domain.Apps.Entities.Apps
{ {
public class AppHistoryEventsCreator : HistoryEventsCreatorBase public class AppHistoryEventsCreator : HistoryEventsCreatorBase
{ {
private readonly IAppPlansProvider appPlansProvider; public AppHistoryEventsCreator(TypeNameRegistry typeNameRegistry)
public AppHistoryEventsCreator(TypeNameRegistry typeNameRegistry, IAppPlansProvider appPlansProvider)
: base(typeNameRegistry) : base(typeNameRegistry)
{ {
Guard.NotNull(appPlansProvider, nameof(appPlansProvider));
AddEventMessage("AppContributorAssignedEvent", AddEventMessage("AppContributorAssignedEvent",
"assigned {user:[Contributor]} as {[Role]}"); "assigned {user:[Contributor]} as {[Role]}");
@ -51,6 +47,9 @@ namespace Squidex.Domain.Apps.Entities.Apps
AddEventMessage<AppPlanChanged>( AddEventMessage<AppPlanChanged>(
"changed plan to {[Plan]}"); "changed plan to {[Plan]}");
AddEventMessage<AppPlanReset>(
"resetted plan");
AddEventMessage<AppLanguageAdded>( AddEventMessage<AppLanguageAdded>(
"added language {[Language]}"); "added language {[Language]}");
@ -80,7 +79,6 @@ namespace Squidex.Domain.Apps.Entities.Apps
AddEventMessage<AppRoleUpdated>( AddEventMessage<AppRoleUpdated>(
"updated role {[Name]}"); "updated role {[Name]}");
this.appPlansProvider = appPlansProvider;
} }
protected Task<HistoryEvent> On(AppContributorRemoved @event) protected Task<HistoryEvent> On(AppContributorRemoved @event)
@ -209,22 +207,30 @@ namespace Squidex.Domain.Apps.Entities.Apps
.AddParameter("Name", @event.Name)); .AddParameter("Name", @event.Name));
} }
protected Task<HistoryEvent> On(AppRoleDeleted @event)
{
const string channel = "settings.roles";
return Task.FromResult(
ForEvent(@event, channel)
.AddParameter("Name", @event.Name));
}
protected Task<HistoryEvent> On(AppPlanChanged @event) protected Task<HistoryEvent> On(AppPlanChanged @event)
{ {
const string channel = "settings.plan"; const string channel = "settings.plan";
return Task.FromResult( return Task.FromResult(
ForEvent(@event, channel) ForEvent(@event, channel)
.AddParameter("Plan", @event.PlanId ?? appPlansProvider.GetFreePlan()?.Id ?? "free")); .AddParameter("Plan", @event.PlanId));
} }
protected Task<HistoryEvent> On(AppRoleDeleted @event) protected Task<HistoryEvent> On(AppPlanReset @event)
{ {
const string channel = "settings.roles"; const string channel = "settings.plan";
return Task.FromResult( return Task.FromResult(
ForEvent(@event, channel) ForEvent(@event, channel));
.AddParameter("Name", @event.Name));
} }
protected override Task<HistoryEvent> CreateEventCoreAsync(Envelope<IEvent> @event) protected override Task<HistoryEvent> CreateEventCoreAsync(Envelope<IEvent> @event)

5
src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs

@ -57,6 +57,11 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
Plan = AppPlan.Build(@event.Actor, @event.PlanId); Plan = AppPlan.Build(@event.Actor, @event.PlanId);
} }
protected void On(AppPlanReset @event)
{
Plan = null;
}
protected void On(AppContributorAssigned @event) protected void On(AppContributorAssigned @event)
{ {
Contributors = Contributors.Assign(@event.ContributorId, @event.Role); Contributors = Contributors.Assign(@event.ContributorId, @event.Role);

4
src/Squidex.Domain.Apps.Events/Apps/AppPlanChanged.cs

@ -5,11 +5,11 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing;
namespace Squidex.Domain.Apps.Events.Apps namespace Squidex.Domain.Apps.Events.Apps
{ {
[TypeName("AppPlanChanged")] [EventType(nameof(AppPlanChanged))]
public sealed class AppPlanChanged : AppEvent public sealed class AppPlanChanged : AppEvent
{ {
public string PlanId { get; set; } public string PlanId { get; set; }

16
src/Squidex.Domain.Apps.Events/Apps/AppPlanReset.cs

@ -0,0 +1,16 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure.EventSourcing;
namespace Squidex.Domain.Apps.Events.Apps
{
[EventType(nameof(AppPlanReset))]
public sealed class AppPlanReset : AppEvent
{
}
}

34
tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppGrainTests.cs

@ -33,7 +33,8 @@ namespace Squidex.Domain.Apps.Entities.Apps
private readonly string clientId = "client"; private readonly string clientId = "client";
private readonly string clientNewName = "My Client"; private readonly string clientNewName = "My Client";
private readonly string roleName = "My Role"; private readonly string roleName = "My Role";
private readonly string planId = "premium"; private readonly string planIdPaid = "premium";
private readonly string planIdFree = "free";
private readonly AppGrain sut; private readonly AppGrain sut;
private readonly Guid patternId1 = Guid.NewGuid(); private readonly Guid patternId1 = Guid.NewGuid();
private readonly Guid patternId2 = Guid.NewGuid(); private readonly Guid patternId2 = Guid.NewGuid();
@ -96,9 +97,9 @@ namespace Squidex.Domain.Apps.Entities.Apps
[Fact] [Fact]
public async Task ChangePlan_should_create_events_and_update_state() public async Task ChangePlan_should_create_events_and_update_state()
{ {
var command = new ChangePlan { PlanId = planId }; var command = new ChangePlan { PlanId = planIdPaid };
A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planId)) A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planIdPaid))
.Returns(new PlanChangedResult()); .Returns(new PlanChangedResult());
await ExecuteCreateAsync(); await ExecuteCreateAsync();
@ -107,23 +108,27 @@ namespace Squidex.Domain.Apps.Entities.Apps
Assert.True(result.Value is PlanChangedResult); Assert.True(result.Value is PlanChangedResult);
Assert.Equal(planId, sut.Snapshot.Plan.PlanId); Assert.Equal(planIdPaid, sut.Snapshot.Plan.PlanId);
LastEvents LastEvents
.ShouldHaveSameEvents( .ShouldHaveSameEvents(
CreateEvent(new AppPlanChanged { PlanId = planId }) CreateEvent(new AppPlanChanged { PlanId = planIdPaid })
); );
} }
[Fact] [Fact]
public async Task ChangePlan_should_reset_plan_for_reset_plan() public async Task ChangePlan_should_reset_plan_for_reset_plan()
{ {
var command = new ChangePlan { PlanId = planId }; var command = new ChangePlan { PlanId = planIdFree };
A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planId)) A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planIdPaid))
.Returns(new PlanChangedResult());
A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planIdFree))
.Returns(new PlanResetResult()); .Returns(new PlanResetResult());
await ExecuteCreateAsync(); await ExecuteCreateAsync();
await ExecuteChangePlanAsync();
var result = await sut.ExecuteAsync(CreateCommand(command)); var result = await sut.ExecuteAsync(CreateCommand(command));
@ -133,16 +138,16 @@ namespace Squidex.Domain.Apps.Entities.Apps
LastEvents LastEvents
.ShouldHaveSameEvents( .ShouldHaveSameEvents(
CreateEvent(new AppPlanChanged { PlanId = null }) CreateEvent(new AppPlanReset())
); );
} }
[Fact] [Fact]
public async Task ChangePlan_should_not_make_update_for_redirect_result() public async Task ChangePlan_should_not_make_update_for_redirect_result()
{ {
var command = new ChangePlan { PlanId = planId }; var command = new ChangePlan { PlanId = planIdPaid };
A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planId)) A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planIdPaid))
.Returns(new RedirectToCheckoutResult(new Uri("http://squidex.io"))); .Returns(new RedirectToCheckoutResult(new Uri("http://squidex.io")));
await ExecuteCreateAsync(); await ExecuteCreateAsync();
@ -157,7 +162,7 @@ namespace Squidex.Domain.Apps.Entities.Apps
[Fact] [Fact]
public async Task ChangePlan_should_not_call_billing_manager_for_callback() public async Task ChangePlan_should_not_call_billing_manager_for_callback()
{ {
var command = new ChangePlan { PlanId = planId, FromCallback = true }; var command = new ChangePlan { PlanId = planIdPaid, FromCallback = true };
await ExecuteCreateAsync(); await ExecuteCreateAsync();
@ -165,7 +170,7 @@ namespace Squidex.Domain.Apps.Entities.Apps
result.ShouldBeEquivalent(new EntitySavedResult(5)); result.ShouldBeEquivalent(new EntitySavedResult(5));
A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planId)) A.CallTo(() => appPlansBillingManager.ChangePlanAsync(User.Identifier, AppId, AppName, planIdPaid))
.MustNotHaveHappened(); .MustNotHaveHappened();
} }
@ -511,6 +516,11 @@ namespace Squidex.Domain.Apps.Entities.Apps
return sut.ExecuteAsync(CreateCommand(new AddLanguage { Language = language })); return sut.ExecuteAsync(CreateCommand(new AddLanguage { Language = language }));
} }
private Task ExecuteChangePlanAsync()
{
return sut.ExecuteAsync(CreateCommand(new ChangePlan { PlanId = planIdPaid }));
}
private Task ExecuteArchiveAsync() private Task ExecuteArchiveAsync()
{ {
return sut.ExecuteAsync(CreateCommand(new ArchiveApp())); return sut.ExecuteAsync(CreateCommand(new ArchiveApp()));

33
tools/Migrate_01/OldEvents/AppPlanChangedOld.cs

@ -0,0 +1,33 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Events;
using Squidex.Domain.Apps.Events.Apps;
using Squidex.Infrastructure;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Reflection;
namespace Migrate_01.OldEvents
{
[TypeName("AppPlanChanged")]
public sealed class AppPlanChangedOld : AppEvent, IMigrated<IEvent>
{
public string PlanId { get; set; }
public IEvent Migrate()
{
if (!string.IsNullOrWhiteSpace(PlanId))
{
return SimpleMapper.Map(this, new AppPlanChanged());
}
else
{
return SimpleMapper.Map(this, new AppPlanReset());
}
}
}
}
Loading…
Cancel
Save