diff --git a/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs b/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs index 6f442a622..d5c0a2539 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs @@ -6,6 +6,7 @@ // ========================================================================== using System.Threading.Tasks; +using Squidex.Domain.Apps.Entities.Apps.Services; using Squidex.Domain.Apps.Entities.History; using Squidex.Domain.Apps.Events.Apps; using Squidex.Infrastructure; @@ -16,9 +17,13 @@ namespace Squidex.Domain.Apps.Entities.Apps { public class AppHistoryEventsCreator : HistoryEventsCreatorBase { - public AppHistoryEventsCreator(TypeNameRegistry typeNameRegistry) + private readonly IAppPlansProvider appPlansProvider; + + public AppHistoryEventsCreator(TypeNameRegistry typeNameRegistry, IAppPlansProvider appPlansProvider) : base(typeNameRegistry) { + Guard.NotNull(appPlansProvider, nameof(appPlansProvider)); + AddEventMessage("AppContributorAssignedEvent", "assigned {user:[Contributor]} as {[Role]}"); @@ -75,6 +80,7 @@ namespace Squidex.Domain.Apps.Entities.Apps AddEventMessage( "updated role {[Name]}"); + this.appPlansProvider = appPlansProvider; } protected Task On(AppContributorRemoved @event) @@ -209,7 +215,7 @@ namespace Squidex.Domain.Apps.Entities.Apps return Task.FromResult( ForEvent(@event, channel) - .AddParameter("Plan", @event.PlanId ?? "free")); + .AddParameter("Plan", @event.PlanId ?? appPlansProvider.GetFreePlan()?.Id ?? "free")); } protected Task On(AppRoleDeleted @event) diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs b/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs index 71b046241..cd4fb8b03 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs @@ -22,5 +22,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Services IAppLimitsPlan GetPlanForApp(IAppEntity app); IAppLimitsPlan GetPlan(string planId); + + IAppLimitsPlan GetFreePlan(); } } diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs b/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs index 83bd9d196..3da2ae205 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs @@ -64,6 +64,11 @@ namespace Squidex.Domain.Apps.Entities.Apps.Services.Implementations return GetPlanCore(planId); } + public IAppLimitsPlan GetFreePlan() + { + return GetPlanCore(plansList.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.Costs))?.Id); + } + public IAppLimitsPlan GetPlanUpgradeForApp(IAppEntity app) { Guard.NotNull(app, nameof(app)); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs index 899a35c7a..429010e10 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs @@ -68,6 +68,26 @@ namespace Squidex.Domain.Apps.Entities.Apps.Billing plan.Should().BeEquivalentTo(InfinitePlan); } + [Fact] + public void Should_return_free_plan() + { + var sut = new ConfigAppPlansProvider(Plans); + + var plan = sut.GetFreePlan(); + + plan.Should().BeEquivalentTo(FreePlan); + } + + [Fact] + public void Should_return_infinite_plan_for_free_plan_if_not_found() + { + var sut = new ConfigAppPlansProvider(Enumerable.Empty()); + + var plan = sut.GetFreePlan(); + + plan.Should().NotBeNull(); + } + [Fact] public void Should_return_fitting_app_plan() {