From 61b307cba00100f2eb06969be5c6c0feeccf9229 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 29 Feb 2020 19:12:32 +0100 Subject: [PATCH] Renamings. --- .../Apps/Plans/ConfigAppPlansProvider.cs | 3 ++- .../{ApiUsagesDto.cs => CallsUsageDtoDto.cs} | 13 +++++------ ...ApiUsageDto.cs => CallsUsagePerDateDto.cs} | 6 ++--- ...eUsageDto.cs => StorageUsagePerDateDto.cs} | 6 ++--- .../Statistics/UsagesController.cs | 9 ++++---- backend/src/Squidex/Config/Web/WebServices.cs | 2 -- .../Plans/ConfigAppLimitsProviderTests.cs | 9 +++++--- .../framework/angular/http/http-extensions.ts | 14 ++++++++---- .../shared/services/usages.service.spec.ts | 20 ++++++++--------- .../app/shared/services/usages.service.ts | 22 +++++++++---------- 10 files changed, 55 insertions(+), 49 deletions(-) rename backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/{ApiUsagesDto.cs => CallsUsageDtoDto.cs} (78%) rename backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/{ApiUsageDto.cs => CallsUsagePerDateDto.cs} (89%) rename backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/{StorageUsageDto.cs => StorageUsagePerDateDto.cs} (86%) 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 6fa554588..c31797bf6 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Plans/ConfigAppPlansProvider.cs @@ -20,7 +20,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans Name = "Infinite", MaxApiCalls = -1, MaxAssetSize = -1, - MaxContributors = -1 + MaxContributors = -1, + BlockingApiCalls = -1 }; private readonly Dictionary plansById = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs similarity index 78% rename from backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs rename to backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs index 780272a5a..1fa2e722c 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs @@ -5,7 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -13,7 +12,7 @@ using Squidex.Infrastructure.UsageTracking; namespace Squidex.Areas.Api.Controllers.Statistics.Models { - public sealed class ApiUsagesDto + public sealed class CallsUsageDtoDto { /// /// The total number of API calls. @@ -39,17 +38,17 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models /// The statistics by date and group. /// [Required] - public Dictionary Details { get; set; } + public Dictionary Details { get; set; } - public static ApiUsagesDto FromStats(long allowedCalls, ApiStatsSummary summary, Dictionary> details) + public static CallsUsageDtoDto FromStats(long allowedCalls, ApiStatsSummary summary, Dictionary> details) { - return new ApiUsagesDto + return new CallsUsageDtoDto { AllowedCalls = allowedCalls, AverageElapsedMs = summary.AverageElapsedMs, TotalBytes = summary.TotalBytes, - TotalCalls = summary.TotalBytes, - Details = details.ToDictionary(x => x.Key, x => x.Value.Select(ApiUsageDto.FromStats).ToArray()) + TotalCalls = summary.TotalCalls, + Details = details.ToDictionary(x => x.Key, x => x.Value.Select(CallsUsagePerDateDto.FromStats).ToArray()) }; } } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsagePerDateDto.cs similarity index 89% rename from backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs rename to backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsagePerDateDto.cs index ca8519950..986b3d123 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsagePerDateDto.cs @@ -10,7 +10,7 @@ using Squidex.Infrastructure.UsageTracking; namespace Squidex.Areas.Api.Controllers.Statistics.Models { - public sealed class ApiUsageDto + public sealed class CallsUsagePerDateDto { /// /// The date when the usage was tracked. @@ -32,9 +32,9 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models /// public double AverageElapsedMs { get; set; } - public static ApiUsageDto FromStats(ApiStats stats) + public static CallsUsagePerDateDto FromStats(ApiStats stats) { - var result = new ApiUsageDto + var result = new CallsUsagePerDateDto { Date = stats.Date, TotalBytes = stats.TotalBytes, diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsagePerDateDto.cs similarity index 86% rename from backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsageDto.cs rename to backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsagePerDateDto.cs index b7258252a..45bce4d85 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsageDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/StorageUsagePerDateDto.cs @@ -10,7 +10,7 @@ using Squidex.Domain.Apps.Entities.Assets; namespace Squidex.Areas.Api.Controllers.Statistics.Models { - public sealed class StorageUsageDto + public sealed class StorageUsagePerDateDto { /// /// The date when the usage was tracked. @@ -27,9 +27,9 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models /// public long TotalSize { get; set; } - public static StorageUsageDto FromStats(AssetStats stats) + public static StorageUsagePerDateDto FromStats(AssetStats stats) { - var result = new StorageUsageDto + var result = new StorageUsagePerDateDto { Date = stats.Date, TotalCount = stats.TotalCount, diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs index b8d731b9b..4740aa854 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs @@ -6,7 +6,6 @@ // ========================================================================== using System; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.DataProtection; @@ -93,7 +92,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics /// [HttpGet] [Route("apps/{app}/usages/calls/{fromDate}/{toDate}/")] - [ProducesResponseType(typeof(ApiUsagesDto), 200)] + [ProducesResponseType(typeof(CallsUsageDtoDto), 200)] [ApiPermission(Permissions.AppCommon)] [ApiCosts(0)] public async Task GetUsages(string app, DateTime fromDate, DateTime toDate) @@ -107,7 +106,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics var (plan, _) = appPlansProvider.GetPlanForApp(App); - var response = ApiUsagesDto.FromStats(plan.MaxApiCalls, summary, details); + var response = CallsUsageDtoDto.FromStats(plan.MaxApiCalls, summary, details); return Ok(response); } @@ -149,7 +148,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics /// [HttpGet] [Route("apps/{app}/usages/storage/{fromDate}/{toDate}/")] - [ProducesResponseType(typeof(StorageUsageDto[]), 200)] + [ProducesResponseType(typeof(StorageUsagePerDateDto[]), 200)] [ApiPermission(Permissions.AppCommon)] [ApiCosts(0)] public async Task GetStorageSizes(string app, DateTime fromDate, DateTime toDate) @@ -161,7 +160,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics var usages = await assetStatsRepository.QueryAsync(AppId, fromDate.Date, toDate.Date); - var models = usages.Select(StorageUsageDto.FromStats).ToArray(); + var models = usages.Select(StorageUsagePerDateDto.FromStats).ToArray(); return Ok(models); } diff --git a/backend/src/Squidex/Config/Web/WebServices.cs b/backend/src/Squidex/Config/Web/WebServices.cs index 3f9a69a1a..76e024145 100644 --- a/backend/src/Squidex/Config/Web/WebServices.cs +++ b/backend/src/Squidex/Config/Web/WebServices.cs @@ -11,8 +11,6 @@ using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Squidex.Areas.Frontend.Middlewares; -using Squidex.Areas.OrleansDashboard.Middlewares; using Squidex.Config.Domain; using Squidex.Domain.Apps.Entities; using Squidex.Infrastructure.Caching; 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 d5fd5a156..05c2e0f4f 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 @@ -22,7 +22,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans Name = "Infinite", MaxApiCalls = -1, MaxAssetSize = -1, - MaxContributors = -1 + MaxContributors = -1, + BlockingApiCalls = -1 }; private static readonly ConfigAppLimitsPlan FreePlan = new ConfigAppLimitsPlan @@ -31,7 +32,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans Name = "Free", MaxApiCalls = 50000, MaxAssetSize = 1024 * 1024 * 10, - MaxContributors = 2 + MaxContributors = 2, + BlockingApiCalls = 50000 }; private static readonly ConfigAppLimitsPlan BasicPlan = new ConfigAppLimitsPlan @@ -42,7 +44,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.Plans MaxAssetSize = 1024 * 1024 * 2, MaxContributors = 5, YearlyCosts = "100€", - YearlyId = "basic_yearly" + YearlyId = "basic_yearly", + BlockingApiCalls = 150000 }; private static readonly ConfigAppLimitsPlan[] Plans = { BasicPlan, FreePlan }; diff --git a/frontend/app/framework/angular/http/http-extensions.ts b/frontend/app/framework/angular/http/http-extensions.ts index 3b19d5b86..a36270172 100644 --- a/frontend/app/framework/angular/http/http-extensions.ts +++ b/frontend/app/framework/angular/http/http-extensions.ts @@ -100,10 +100,16 @@ export const pretifyError = (message: string) => (source: Observable) => errorDto = { message: 'Failed to make the request.', details: [] }; } - if (response.status === 412) { - result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.', [], response); - } else if (response.status !== 500) { - result = new ErrorDto(response.status, errorDto.message, errorDto.details, response); + switch (response.status) { + case 412: + result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.', [], response); + break; + case 429: + result = new ErrorDto(response.status, 'You have exceeded the maximum limit of API calls.', [], response); + break; + case 500: + result = new ErrorDto(response.status, errorDto.message, errorDto.details, response); + break; } } catch (e) { result = new ErrorDto(500, 'Failed to make the request.', [], response); diff --git a/frontend/app/shared/services/usages.service.spec.ts b/frontend/app/shared/services/usages.service.spec.ts index 26c8f2bf0..a7acd3ff0 100644 --- a/frontend/app/shared/services/usages.service.spec.ts +++ b/frontend/app/shared/services/usages.service.spec.ts @@ -10,11 +10,11 @@ import { inject, TestBed } from '@angular/core/testing'; import { ApiUrlConfig, - ApiUsageDto, - ApiUsagesDto, + CallsUsageDto, + CallsUsagePerDateDto, CurrentStorageDto, DateTime, - StorageUsageDto, + StorageUsagePerDateDto, UsagesService } from '@app/shared/internal'; @@ -38,7 +38,7 @@ describe('UsagesService', () => { it('should make get request to get calls usages', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { - let usages: ApiUsagesDto; + let usages: CallsUsageDto; usagesService.getCallsUsages('my-app', DateTime.parseISO_UTC('2017-10-12'), DateTime.parseISO_UTC('2017-10-13')).subscribe(result => { usages = result; @@ -73,10 +73,10 @@ describe('UsagesService', () => { }); expect(usages!).toEqual( - new ApiUsagesDto(100, 1024, 40, 12.4, { + new CallsUsageDto(100, 1024, 40, 12.4, { category1: [ - new ApiUsageDto(DateTime.parseISO_UTC('2017-10-12'), 10, 130, 12.3), - new ApiUsageDto(DateTime.parseISO_UTC('2017-10-13'), 13, 170, 33.3) + new CallsUsagePerDateDto(DateTime.parseISO_UTC('2017-10-12'), 10, 130, 12.3), + new CallsUsagePerDateDto(DateTime.parseISO_UTC('2017-10-13'), 13, 170, 33.3) ] }) ); @@ -85,7 +85,7 @@ describe('UsagesService', () => { it('should make get request to get storage usages', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { - let usages: ReadonlyArray; + let usages: ReadonlyArray; usagesService.getStorageUsages('my-app', DateTime.parseISO_UTC('2017-10-12'), DateTime.parseISO_UTC('2017-10-13')).subscribe(result => { usages = result; @@ -111,8 +111,8 @@ describe('UsagesService', () => { expect(usages!).toEqual( [ - new StorageUsageDto(DateTime.parseISO_UTC('2017-10-12'), 10, 130), - new StorageUsageDto(DateTime.parseISO_UTC('2017-10-13'), 13, 170) + new StorageUsagePerDateDto(DateTime.parseISO_UTC('2017-10-12'), 10, 130), + new StorageUsagePerDateDto(DateTime.parseISO_UTC('2017-10-13'), 13, 170) ]); })); diff --git a/frontend/app/shared/services/usages.service.ts b/frontend/app/shared/services/usages.service.ts index 4bb11fcaa..d3b586559 100644 --- a/frontend/app/shared/services/usages.service.ts +++ b/frontend/app/shared/services/usages.service.ts @@ -16,18 +16,18 @@ import { pretifyError } from '@app/framework'; -export class ApiUsagesDto { +export class CallsUsageDto { constructor( public readonly allowedCalls: number, public readonly totalBytes: number, public readonly totalCalls: number, public readonly averageElapsedMs: number, - public readonly details: { [category: string]: ReadonlyArray } + public readonly details: { [category: string]: ReadonlyArray } ) { } } -export class ApiUsageDto { +export class CallsUsagePerDateDto { constructor( public readonly date: DateTime, public readonly totalBytes: number, @@ -37,7 +37,7 @@ export class ApiUsageDto { } } -export class StorageUsageDto { +export class StorageUsagePerDateDto { constructor( public readonly date: DateTime, public readonly totalCount: number, @@ -82,16 +82,16 @@ export class UsagesService { pretifyError('Failed to load todays storage size. Please reload.')); } - public getCallsUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable { + public getCallsUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable { const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/calls/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`); return this.http.get(url).pipe( map(body => { - const details: { [category: string]: ApiUsageDto[] } = {}; + const details: { [category: string]: CallsUsagePerDateDto[] } = {}; for (let category of Object.keys(body.details)) { details[category] = body.details[category].map((item: any) => - new ApiUsageDto( + new CallsUsagePerDateDto( DateTime.parseISO_UTC(item.date), item.totalBytes, item.totalCalls, @@ -99,10 +99,10 @@ export class UsagesService { } const usages = - new ApiUsagesDto( + new CallsUsageDto( body.allowedCalls, body.totalBytes, - body.totalBytes, + body.totalCalls, body.averageElapsedMs, details); @@ -111,13 +111,13 @@ export class UsagesService { pretifyError('Failed to load calls usage. Please reload.')); } - public getStorageUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable> { + public getStorageUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/storage/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`); return this.http.get(url).pipe( map(body => { const usages = body.map(item => - new StorageUsageDto( + new StorageUsagePerDateDto( DateTime.parseISO_UTC(item.date), item.totalCount, item.totalSize));