diff --git a/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs b/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs new file mode 100644 index 000000000..6ed716f5d --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs @@ -0,0 +1,14 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Entities.Assets +{ + public sealed class AssetOptions + { + public int MaxResults { get; set; } = 100; + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Assets/AssetQueryService.cs b/src/Squidex.Domain.Apps.Entities/Assets/AssetQueryService.cs index e706b3dcd..763603162 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/AssetQueryService.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/AssetQueryService.cs @@ -22,18 +22,19 @@ namespace Squidex.Domain.Apps.Entities.Assets { public sealed class AssetQueryService : IAssetQueryService { - private const int MaxResults = 200; private readonly ITagService tagService; private readonly IAssetRepository assetRepository; + private readonly AssetOptions options; - public AssetQueryService(ITagService tagService, IAssetRepository assetRepository) + public AssetQueryService(ITagService tagService, IAssetRepository assetRepository, AssetOptions options) { Guard.NotNull(tagService, nameof(tagService)); + Guard.NotNull(options, nameof(options)); Guard.NotNull(assetRepository, nameof(assetRepository)); - this.tagService = tagService; - this.assetRepository = assetRepository; + this.options = options; + this.tagService = tagService; } public async Task FindAssetAsync(QueryContext context, Guid id) @@ -97,9 +98,9 @@ namespace Squidex.Domain.Apps.Entities.Assets result.Sort.Add(new SortNode(new List { "lastModified" }, SortOrder.Descending)); } - if (result.Take > MaxResults) + if (result.Take > options.MaxResults) { - result.Take = MaxResults; + result.Take = options.MaxResults; } return result; diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs new file mode 100644 index 000000000..0174a2808 --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs @@ -0,0 +1,14 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Entities.Contents +{ + public sealed class ContentOptions + { + public int MaxResults { get; set; } = 100; + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs index b871e62c1..f3c6fa07b 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs @@ -28,7 +28,6 @@ namespace Squidex.Domain.Apps.Entities.Contents { public sealed class ContentQueryService : IContentQueryService { - private const int MaxResults = 200; private static readonly Status[] StatusAll = { Status.Archived, Status.Draft, Status.Published }; private static readonly Status[] StatusArchived = { Status.Archived }; private static readonly Status[] StatusPublished = { Status.Published }; @@ -37,6 +36,7 @@ namespace Squidex.Domain.Apps.Entities.Contents private readonly IContentVersionLoader contentVersionLoader; private readonly IAppProvider appProvider; private readonly IScriptEngine scriptEngine; + private readonly ContentOptions options; private readonly EdmModelBuilder modelBuilder; public ContentQueryService( @@ -44,18 +44,21 @@ namespace Squidex.Domain.Apps.Entities.Contents IContentRepository contentRepository, IContentVersionLoader contentVersionLoader, IScriptEngine scriptEngine, + ContentOptions options, EdmModelBuilder modelBuilder) { Guard.NotNull(appProvider, nameof(appProvider)); Guard.NotNull(contentRepository, nameof(contentRepository)); Guard.NotNull(contentVersionLoader, nameof(contentVersionLoader)); Guard.NotNull(modelBuilder, nameof(modelBuilder)); + Guard.NotNull(options, nameof(options)); Guard.NotNull(scriptEngine, nameof(scriptEngine)); this.appProvider = appProvider; this.contentRepository = contentRepository; this.contentVersionLoader = contentVersionLoader; this.modelBuilder = modelBuilder; + this.options = options; this.scriptEngine = scriptEngine; } @@ -214,9 +217,9 @@ namespace Squidex.Domain.Apps.Entities.Contents result.Sort.Add(new SortNode(new List { "lastModified" }, SortOrder.Descending)); } - if (result.Take > MaxResults) + if (result.Take > options.MaxResults) { - result.Take = MaxResults; + result.Take = options.MaxResults; } return result; diff --git a/src/Squidex/AppServices.cs b/src/Squidex/AppServices.cs index 99d77a706..3e5cc0f53 100644 --- a/src/Squidex/AppServices.cs +++ b/src/Squidex/AppServices.cs @@ -14,6 +14,8 @@ using Squidex.Config; using Squidex.Config.Authentication; using Squidex.Config.Domain; using Squidex.Config.Web; +using Squidex.Domain.Apps.Entities.Assets; +using Squidex.Domain.Apps.Entities.Contents; using Squidex.Extensions.Actions.Twitter; using Squidex.Infrastructure.Commands; @@ -44,9 +46,12 @@ namespace Squidex services.AddMySwaggerSettings(); services.AddMySubscriptionServices(config); + services.Configure( + config.GetSection("contents")); + services.Configure( + config.GetSection("assets")); services.Configure( config.GetSection("mode")); - services.Configure( config.GetSection("twitter")); diff --git a/src/Squidex/Config/Domain/EntitiesServices.cs b/src/Squidex/Config/Domain/EntitiesServices.cs index 739b068f9..b3f72de7c 100644 --- a/src/Squidex/Config/Domain/EntitiesServices.cs +++ b/src/Squidex/Config/Domain/EntitiesServices.cs @@ -65,9 +65,15 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As(); + services.AddSingletonAs(c => c.GetRequiredService>().Value) + .AsSelf(); + services.AddSingletonAs() .As(); + services.AddSingletonAs(c => c.GetRequiredService>().Value) + .AsSelf(); + services.AddSingletonAs() .As(); diff --git a/src/Squidex/appsettings.json b/src/Squidex/appsettings.json index 3a874eab0..f9c32ef61 100644 --- a/src/Squidex/appsettings.json +++ b/src/Squidex/appsettings.json @@ -63,6 +63,24 @@ "maxItemsForSurrogateKeys": 200 }, + "content": { + /* + * The maximum number of items to return for each query. + * + * Warning: Use pagination and not large number of items. + */ + "maxResults": 200 + }, + + "assets": { + /* + * The maximum number of items to return for each query. + * + * Warning: Use pagination and not large number of items. + */ + "maxResults": 200 + }, + "logging": { /* * Setting the flag to true, enables well formatteds json logs. diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs index a86074e09..516f2ca7b 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs @@ -49,7 +49,7 @@ namespace Squidex.Domain.Apps.Entities.Assets ["id3"] = "name3" }); - sut = new AssetQueryService(tagService, assetRepository); + sut = new AssetQueryService(tagService, assetRepository, new AssetOptions()); } [Fact] diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs index ea3bb5259..1f9015252 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs @@ -60,7 +60,7 @@ namespace Squidex.Domain.Apps.Entities.Contents context = new ContentQueryContext(QueryContext.Create(app, user)); - sut = new ContentQueryService(appProvider, contentRepository, contentVersionLoader, scriptEngine, modelBuilder); + sut = new ContentQueryService(appProvider, contentRepository, contentVersionLoader, scriptEngine, new ContentOptions(), modelBuilder); } [Fact]