From ebea1703bb58c8e32ba7786e081462a85e9bd2fc Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 20 Oct 2020 11:37:53 +0200 Subject: [PATCH] Fix for free plan. --- .../Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs | 4 ++-- .../Apps/Guards/GuardAppContributors.cs | 4 ++-- .../Apps/Plans/ConfigAppLimitsPlan.cs | 2 ++ .../Apps/Plans/ConfigAppPlansProvider.cs | 7 +++++-- .../Apps/Plans/ConfigAppLimitsProviderTests.cs | 6 ++++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs index b1351b07b..cb0e1f3bb 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs @@ -306,9 +306,9 @@ namespace Squidex.Domain.Apps.Entities.Apps } } - private IAppLimitsPlan? GetPlan() + private IAppLimitsPlan GetPlan() { - return appPlansProvider.GetPlan(Snapshot.Plan?.PlanId); + return appPlansProvider.GetPlanForApp(Snapshot).Plan; } public void Create(CreateApp command) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppContributors.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppContributors.cs index ad1d43d3b..bcab9abfa 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppContributors.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppContributors.cs @@ -20,7 +20,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards { public static class GuardAppContributors { - public static Task CanAssign(AppContributors contributors, Roles roles, AssignContributor command, IUserResolver users, IAppLimitsPlan? plan) + public static Task CanAssign(AppContributors contributors, Roles roles, AssignContributor command, IUserResolver users, IAppLimitsPlan plan) { Guard.NotNull(command, nameof(command)); @@ -53,7 +53,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards if (!contributors.TryGetValue(command.ContributorId, out _)) { - if (plan != null && plan.MaxContributors > 0 && contributors.Count >= plan.MaxContributors) + if (plan.MaxContributors > 0 && contributors.Count >= plan.MaxContributors) { e(T.Get("apps.contributors.maxReached")); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppLimitsPlan.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppLimitsPlan.cs index 47746bf96..8a7e149b3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppLimitsPlan.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppLimitsPlan.cs @@ -33,6 +33,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans public int MaxContributors { get; set; } + public bool IsFree { get; set; } + public ConfigAppLimitsPlan Clone() { return (ConfigAppLimitsPlan)MemberwiseClone(); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs index cdcb4bbed..65aecd1b5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs @@ -26,6 +26,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans private readonly Dictionary plansById = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly List plansList = new List(); + private readonly ConfigAppLimitsPlan freePlan; public ConfigAppPlansProvider(IEnumerable config) { @@ -41,6 +42,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans plansById[plan.YearlyId] = plan; } } + + freePlan = plansList.FirstOrDefault(x => x.IsFree) ?? Infinite; } public IEnumerable GetAvailablePlans() @@ -60,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans public IAppLimitsPlan GetFreePlan() { - return GetPlanCore(plansList.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.Costs))?.Id); + return freePlan; } public IAppLimitsPlan? GetPlanUpgradeForApp(IAppEntity app) @@ -103,7 +106,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans private ConfigAppLimitsPlan GetPlanCore(string? planId) { - return plansById.GetOrDefault(planId ?? string.Empty) ?? plansById.Values.FirstOrDefault() ?? Infinite; + return plansById.GetOrDefault(planId ?? string.Empty) ?? freePlan; } } } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Plans/ConfigAppLimitsProviderTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Plans/ConfigAppLimitsProviderTests.cs index 05c2e0f4f..0995a0da6 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Plans/ConfigAppLimitsProviderTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Plans/ConfigAppLimitsProviderTests.cs @@ -33,7 +33,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans MaxApiCalls = 50000, MaxAssetSize = 1024 * 1024 * 10, MaxContributors = 2, - BlockingApiCalls = 50000 + BlockingApiCalls = 50000, + IsFree = true }; private static readonly ConfigAppLimitsPlan BasicPlan = new ConfigAppLimitsPlan @@ -45,7 +46,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans MaxContributors = 5, YearlyCosts = "100€", YearlyId = "basic_yearly", - BlockingApiCalls = 150000 + BlockingApiCalls = 150000, + IsFree = false }; private static readonly ConfigAppLimitsPlan[] Plans = { BasicPlan, FreePlan };