Browse Source

Plan fixes.

pull/492/head
Sebastian 7 years ago
parent
commit
4181a2c6c2
  1. 4
      backend/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs
  2. 24
      backend/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs
  3. 4
      backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs
  4. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
  5. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
  6. 2
      backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
  7. 2
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
  8. 4
      backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs
  9. 16
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs
  10. 2
      backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs
  11. 6
      frontend/app/shared/state/plans.state.ts

4
backend/src/Squidex.Domain.Apps.Entities/Apps/Services/IAppPlansProvider.cs

@ -21,8 +21,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Services
IAppLimitsPlan? GetPlan(string? planId); IAppLimitsPlan? GetPlan(string? planId);
IAppLimitsPlan GetPlanForApp(IAppEntity app);
IAppLimitsPlan GetFreePlan(); IAppLimitsPlan GetFreePlan();
(IAppLimitsPlan Plan, string PlanId) GetPlanForApp(IAppEntity app);
} }
} }

24
backend/src/Squidex.Domain.Apps.Entities/Apps/Services/Implementations/ConfigAppPlansProvider.cs

@ -57,13 +57,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Services.Implementations
return plansById.GetOrDefault(planId ?? string.Empty); return plansById.GetOrDefault(planId ?? string.Empty);
} }
public IAppLimitsPlan GetPlanForApp(IAppEntity app)
{
Guard.NotNull(app);
return GetPlanCore(app.Plan?.PlanId);
}
public IAppLimitsPlan GetFreePlan() public IAppLimitsPlan GetFreePlan()
{ {
return GetPlanCore(plansList.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.Costs))?.Id); return GetPlanCore(plansList.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.Costs))?.Id);
@ -90,6 +83,23 @@ namespace Squidex.Domain.Apps.Entities.Apps.Services.Implementations
return null; return null;
} }
public (IAppLimitsPlan Plan, string PlanId) GetPlanForApp(IAppEntity app)
{
Guard.NotNull(app);
var planId = app.Plan?.PlanId;
var plan = GetPlanCore(planId);
if (plan.YearlyId != null && plan.YearlyId == planId)
{
return (plan, plan.YearlyId);
}
else
{
return (plan, plan.Id);
}
}
private ConfigAppLimitsPlan GetPlanCore(string? planId) private ConfigAppLimitsPlan GetPlanCore(string? planId)
{ {
return plansById.GetOrDefault(planId ?? string.Empty) ?? plansById.Values.FirstOrDefault() ?? Infinite; return plansById.GetOrDefault(planId ?? string.Empty) ?? plansById.Values.FirstOrDefault() ?? Infinite;

4
backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs

@ -69,11 +69,11 @@ namespace Squidex.Web.Pipeline
{ {
using (Profiler.Trace("CheckUsage")) using (Profiler.Trace("CheckUsage"))
{ {
var plan = appPlansProvider.GetPlanForApp(app); var (plan, _) = appPlansProvider.GetPlanForApp(app);
var usage = await usageTracker.GetMonthlyCallsAsync(appId, DateTime.Today); var usage = await usageTracker.GetMonthlyCallsAsync(appId, DateTime.Today);
if (plan?.MaxApiCalls >= 0 && usage > plan.MaxApiCalls * 1.1) if (plan.MaxApiCalls >= 0 && usage > plan.MaxApiCalls * 1.1)
{ {
context.Result = new StatusCodeResult(429); context.Result = new StatusCodeResult(429);
return; return;

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs

@ -139,7 +139,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
PlanUpgrade = plans.GetPlanUpgradeForApp(app)?.Name; PlanUpgrade = plans.GetPlanUpgradeForApp(app)?.Name;
} }
PlanName = plans.GetPlanForApp(app).Name; PlanName = plans.GetPlanForApp(app).Plan.Name;
} }
private void SetImage(IAppEntity app, ApiController controller) private void SetImage(IAppEntity app, ApiController controller)

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs

@ -59,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
private void WithPlan(IAppEntity app, IAppPlansProvider plans) private void WithPlan(IAppEntity app, IAppPlansProvider plans)
{ {
MaxContributors = plans.GetPlanForApp(app).MaxContributors; MaxContributors = plans.GetPlanForApp(app).Plan.MaxContributors;
} }
private void WithInvited(bool isInvited) private void WithInvited(bool isInvited)

2
backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs

@ -296,7 +296,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
throw new ValidationException("Cannot create asset.", error); throw new ValidationException("Cannot create asset.", error);
} }
var plan = appPlansProvider.GetPlanForApp(App); var (plan, _) = appPlansProvider.GetPlanForApp(App);
var currentSize = await assetStatsRepository.GetTotalSizeAsync(AppId); var currentSize = await assetStatsRepository.GetTotalSizeAsync(AppId);

2
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs

@ -37,7 +37,7 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
public static AppPlansDto FromApp(IAppEntity app, IAppPlansProvider plans, bool hasPortal) public static AppPlansDto FromApp(IAppEntity app, IAppPlansProvider plans, bool hasPortal)
{ {
var planId = plans.GetPlanForApp(app).Id; var (_, planId) = plans.GetPlanForApp(app);
var response = new AppPlansDto var response = new AppPlansDto
{ {

4
backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs

@ -97,7 +97,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics
{ {
var count = await usageTracker.GetMonthlyCallsAsync(AppId.ToString(), DateTime.Today); var count = await usageTracker.GetMonthlyCallsAsync(AppId.ToString(), DateTime.Today);
var plan = appPlansProvider.GetPlanForApp(App); var (plan, _) = appPlansProvider.GetPlanForApp(App);
var response = new CurrentCallsDto { Count = count, MaxAllowed = plan.MaxApiCalls }; var response = new CurrentCallsDto { Count = count, MaxAllowed = plan.MaxApiCalls };
@ -151,7 +151,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics
{ {
var size = await assetStatsRepository.GetTotalSizeAsync(AppId); var size = await assetStatsRepository.GetTotalSizeAsync(AppId);
var plan = appPlansProvider.GetPlanForApp(App); var (plan, _) = appPlansProvider.GetPlanForApp(App);
var response = new CurrentStorageDto { Size = size, MaxAllowed = plan.MaxAssetSize }; var response = new CurrentStorageDto { Size = size, MaxAllowed = plan.MaxAssetSize };

16
backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Billing/ConfigAppLimitsProviderTests.cs

@ -63,9 +63,9 @@ namespace Squidex.Domain.Apps.Entities.Apps.Billing
{ {
var sut = new ConfigAppPlansProvider(Enumerable.Empty<ConfigAppLimitsPlan>()); var sut = new ConfigAppPlansProvider(Enumerable.Empty<ConfigAppLimitsPlan>());
var plan = sut.GetPlanForApp(CreateApp(planId)); var result = sut.GetPlanForApp(CreateApp(planId));
plan.Should().BeEquivalentTo(InfinitePlan); result.Should().BeEquivalentTo((InfinitePlan, "infinite"));
} }
[Fact] [Fact]
@ -93,9 +93,9 @@ namespace Squidex.Domain.Apps.Entities.Apps.Billing
{ {
var sut = new ConfigAppPlansProvider(Plans); var sut = new ConfigAppPlansProvider(Plans);
var plan = sut.GetPlanForApp(CreateApp("basic")); var result = sut.GetPlanForApp(CreateApp("basic"));
plan.Should().BeEquivalentTo(BasicPlan); result.Should().BeEquivalentTo((BasicPlan, "basic"));
} }
[Fact] [Fact]
@ -103,9 +103,9 @@ namespace Squidex.Domain.Apps.Entities.Apps.Billing
{ {
var sut = new ConfigAppPlansProvider(Plans); var sut = new ConfigAppPlansProvider(Plans);
var plan = sut.GetPlanForApp(CreateApp("basic_yearly")); var result = sut.GetPlanForApp(CreateApp("basic_yearly"));
plan.Should().BeEquivalentTo(BasicPlan); result.Should().BeEquivalentTo((BasicPlan, "basic_yearly"));
} }
[Fact] [Fact]
@ -113,9 +113,9 @@ namespace Squidex.Domain.Apps.Entities.Apps.Billing
{ {
var sut = new ConfigAppPlansProvider(Plans); var sut = new ConfigAppPlansProvider(Plans);
var plan = sut.GetPlanForApp(CreateApp("enterprise")); var result = sut.GetPlanForApp(CreateApp("enterprise"));
plan.Should().BeEquivalentTo(FreePlan); result.Should().BeEquivalentTo((FreePlan, "free"));
} }
[Fact] [Fact]

2
backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs

@ -55,7 +55,7 @@ namespace Squidex.Web.Pipeline
.Returns(appPlan); .Returns(appPlan);
A.CallTo(() => appPlansProvider.GetPlanForApp(appEntity)) A.CallTo(() => appPlansProvider.GetPlanForApp(appEntity))
.Returns(appPlan); .Returns((appPlan, "free"));
A.CallTo(() => appPlan.MaxApiCalls) A.CallTo(() => appPlan.MaxApiCalls)
.ReturnsLazily(x => apiCallsMax); .ReturnsLazily(x => apiCallsMax);

6
frontend/app/shared/state/plans.state.ts

@ -134,7 +134,11 @@ export class PlansState extends State<Snapshot> {
} }
private createPlan(plan: PlanDto, id: string) { private createPlan(plan: PlanDto, id: string) {
return { plan, isYearlySelected: plan.yearlyId === id, isSelected: plan.id === id }; return {
plan,
isSelected: plan.id === id,
isYearlySelected: plan.yearlyId === id
};
} }
private get appName() { private get appName() {

Loading…
Cancel
Save