From 9e735959f24a433a5f1812d0185e985eb2567f34 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 17 Jun 2019 22:42:20 +0200 Subject: [PATCH] Everything saved. --- Squidex.ruleset | 1 + .../Contents/MongoContentRepository.cs | 1 - .../Contents/Visitors/FilterFactory.cs | 6 +- .../Contents/ContentQueryService.cs | 49 ++---------- .../Contents/StatusForApi.cs | 2 +- .../Contents/StatusForFrontend.cs | 16 ---- .../QueryContext.cs | 19 +---- .../Contents/ContentQueryServiceTests.cs | 76 +++++++------------ .../TestHelpers/AExtensions.cs | 5 ++ 9 files changed, 47 insertions(+), 128 deletions(-) delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/StatusForFrontend.cs diff --git a/Squidex.ruleset b/Squidex.ruleset index 055510070..5aae5da01 100644 --- a/Squidex.ruleset +++ b/Squidex.ruleset @@ -63,6 +63,7 @@ + diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 5dd3020e7..5c3d3a616 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -64,7 +64,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents { Guard.NotNull(app, nameof(app)); Guard.NotNull(schema, nameof(schema)); - Guard.NotNull(status, nameof(status)); Guard.NotNull(query, nameof(query)); using (Profiler.TraceMethod("QueryAsyncByQuery")) diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs index bbed5d51f..1dd0b1500 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs @@ -162,7 +162,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors } filters.Add(Filter.Ne(x => x.IsDeleted, true)); - filters.Add(Filter.In(x => x.Status, status)); + + if (status != null) + { + filters.Add(Filter.In(x => x.Status, status)); + } if (ids != null && ids.Count > 0) { diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs index f51138b5e..5d93788fe 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs @@ -33,10 +33,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { public sealed class ContentQueryService : IContentQueryService { - private static readonly Status[] StatusAll = { Status.Archived, Status.Draft, Status.Published }; - private static readonly Status[] StatusArchived = { Status.Archived }; private static readonly Status[] StatusPublishedOnly = { Status.Published }; - private static readonly Status[] StatusPublishedDraft = { Status.Published, Status.Draft }; private readonly IContentRepository contentRepository; private readonly IContentVersionLoader contentVersionLoader; private readonly IAppProvider appProvider; @@ -93,7 +90,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var isVersioned = version > EtagVersion.Empty; - var status = GetFindStatus(context); + var status = GetStatus(context); var content = isVersioned ? @@ -119,7 +116,7 @@ namespace Squidex.Domain.Apps.Entities.Contents using (Profiler.TraceMethod()) { - var status = GetQueryStatus(context); + var status = GetStatus(context); IResultList contents; @@ -145,7 +142,7 @@ namespace Squidex.Domain.Apps.Entities.Contents using (Profiler.TraceMethod()) { - var status = GetQueryStatus(context); + var status = GetStatus(context); List result; @@ -217,7 +214,7 @@ namespace Squidex.Domain.Apps.Entities.Contents result.Data = result.Data.ConvertName2Name(schema.SchemaDef, converters); } - if (result.DataDraft != null && (context.ApiStatus == StatusForApi.PublishedDraft || context.IsFrontendClient)) + if (result.DataDraft != null && (context.ApiStatus == StatusForApi.All || context.IsFrontendClient)) { result.DataDraft = result.DataDraft.ConvertName2Name(schema.SchemaDef, converters); } @@ -340,15 +337,11 @@ namespace Squidex.Domain.Apps.Entities.Contents return permissions.Allows(permission); } - private static Status[] GetFindStatus(QueryContext context) + private static Status[] GetStatus(QueryContext context) { - if (context.IsFrontendClient) + if (context.IsFrontendClient || context.ApiStatus == StatusForApi.All) { - return StatusAll; - } - else if (context.ApiStatus == StatusForApi.PublishedDraft) - { - return StatusPublishedDraft; + return null; } else { @@ -356,32 +349,6 @@ namespace Squidex.Domain.Apps.Entities.Contents } } - private static Status[] GetQueryStatus(QueryContext context) - { - if (context.IsFrontendClient) - { - switch (context.FrontendStatus) - { - case StatusForFrontend.Archived: - return StatusArchived; - case StatusForFrontend.PublishedOnly: - return StatusPublishedOnly; - default: - return StatusPublishedDraft; - } - } - else - { - switch (context.ApiStatus) - { - case StatusForApi.PublishedDraft: - return StatusPublishedDraft; - default: - return StatusPublishedOnly; - } - } - } - private Task> QueryAsync(QueryContext context, IReadOnlyList ids, Status[] status) { return contentRepository.QueryAsync(context.App, status, new HashSet(ids), ShouldIncludeDraft(context)); @@ -409,7 +376,7 @@ namespace Squidex.Domain.Apps.Entities.Contents private static bool ShouldIncludeDraft(QueryContext context) { - return context.ApiStatus == StatusForApi.PublishedDraft || context.IsFrontendClient; + return context.ApiStatus == StatusForApi.All || context.IsFrontendClient; } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/StatusForApi.cs b/src/Squidex.Domain.Apps.Entities/Contents/StatusForApi.cs index 4d17ea6a6..e58b4c098 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/StatusForApi.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/StatusForApi.cs @@ -10,6 +10,6 @@ namespace Squidex.Domain.Apps.Entities.Contents public enum StatusForApi { PublishedOnly, - PublishedDraft, + All, } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/StatusForFrontend.cs b/src/Squidex.Domain.Apps.Entities/Contents/StatusForFrontend.cs deleted file mode 100644 index b29257b0c..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/StatusForFrontend.cs +++ /dev/null @@ -1,16 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -namespace Squidex.Domain.Apps.Entities.Contents -{ - public enum StatusForFrontend - { - PublishedDraft, - PublishedOnly, - Archived - } -} diff --git a/src/Squidex.Domain.Apps.Entities/QueryContext.cs b/src/Squidex.Domain.Apps.Entities/QueryContext.cs index c6c552be9..094e56e3d 100644 --- a/src/Squidex.Domain.Apps.Entities/QueryContext.cs +++ b/src/Squidex.Domain.Apps.Entities/QueryContext.cs @@ -27,8 +27,6 @@ namespace Squidex.Domain.Apps.Entities public StatusForApi ApiStatus { get; private set; } - public StatusForFrontend FrontendStatus { get; private set; } - public IReadOnlyCollection AssetUrlsToResolve { get; private set; } public IReadOnlyCollection Languages { get; private set; } @@ -49,7 +47,7 @@ namespace Squidex.Domain.Apps.Entities public QueryContext WithUnpublished(bool unpublished) { - return WithApiStatus(unpublished ? StatusForApi.PublishedDraft : StatusForApi.PublishedOnly); + return WithApiStatus(unpublished ? StatusForApi.All : StatusForApi.PublishedOnly); } public QueryContext WithApiStatus(StatusForApi status) @@ -57,21 +55,6 @@ namespace Squidex.Domain.Apps.Entities return Clone(c => c.ApiStatus = status); } - public QueryContext WithFrontendStatus(StatusForFrontend status) - { - return Clone(c => c.FrontendStatus = status); - } - - public QueryContext WithFrontendStatus(string status) - { - if (status != null && Enum.TryParse(status, out var result)) - { - return WithFrontendStatus(result); - } - - return this; - } - public QueryContext WithAssetUrlsToResolve(IEnumerable fieldNames) { if (fieldNames != null) diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs index b0e29dabd..9ca83efa0 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentQueryServiceTests.cs @@ -54,6 +54,12 @@ namespace Squidex.Domain.Apps.Entities.Contents private readonly QueryContext context; private readonly ContentQueryService sut; + public static IEnumerable ApiStatusTests = new[] + { + new object[] { StatusForApi.PublishedOnly, 0, new[] { Status.Published } }, + new object[] { StatusForApi.All, 1, null } + }; + public ContentQueryServiceTests() { user = new ClaimsPrincipal(identity); @@ -187,31 +193,17 @@ namespace Squidex.Domain.Apps.Entities.Contents await Assert.ThrowsAsync(async () => await sut.FindContentAsync(ctx, schemaId.Name, contentId)); } - public static IEnumerable SingleDataFrontend = new[] - { - new object[] { StatusForFrontend.PublishedOnly, new[] { Status.Archived, Status.Draft, Status.Published } }, - new object[] { StatusForFrontend.PublishedDraft, new[] { Status.Archived, Status.Draft, Status.Published } }, - new object[] { StatusForFrontend.Archived, new[] { Status.Archived, Status.Draft, Status.Published } }, - }; - - public static IEnumerable SingleDataApi = new[] - { - new object[] { StatusForApi.PublishedOnly, 0, new[] { Status.Published } }, - new object[] { StatusForApi.PublishedDraft, 1, new[] { Status.Published, Status.Draft } } - }; - - [Theory] - [MemberData(nameof(SingleDataFrontend))] - public async Task Should_return_single_content_for_frontend_without_transform(StatusForFrontend request, Status[] status) + [Fact] + public async Task Should_return_single_content_for_frontend_without_transform() { var content = CreateContent(contentId); SetupClaims(isFrontend: true); SetupSchemaFound(); SetupScripting(contentId); - SetupContent(status, content, includeDraft: true); + SetupContent(null, content, includeDraft: true); - var ctx = context.WithFrontendStatus(request); + var ctx = context; var result = await sut.FindContentAsync(ctx, schemaId.Name, contentId); @@ -223,7 +215,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } [Theory] - [MemberData(nameof(SingleDataApi))] + [MemberData(nameof(ApiStatusTests))] public async Task Should_return_single_content_for_api_with_transform(StatusForApi request, int includeDraft, Status[] status) { var content = CreateContent(contentId); @@ -275,9 +267,8 @@ namespace Squidex.Domain.Apps.Entities.Contents await Assert.ThrowsAsync(() => sut.QueryAsync(ctx, schemaId.Name, Q.Empty)); } - [Theory] - [MemberData(nameof(ManyDataFrontend))] - public async Task Should_query_contents_by_query_for_frontend_without_transform(StatusForFrontend request, Status[] status) + [Fact] + public async Task Should_query_contents_by_query_for_frontend_without_transform() { const int count = 5, total = 200; @@ -286,9 +277,9 @@ namespace Squidex.Domain.Apps.Entities.Contents SetupClaims(isFrontend: true); SetupSchemaFound(); SetupScripting(contentId); - SetupContents(status, count, total, content, inDraft: true, includeDraft: true); + SetupContents(null, count, total, content, inDraft: true, includeDraft: true); - var ctx = context.WithFrontendStatus(request); + var ctx = context; var result = await sut.QueryAsync(ctx, schemaId.Name, Q.Empty); @@ -302,7 +293,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } [Theory] - [MemberData(nameof(ManyDataApi))] + [MemberData(nameof(ApiStatusTests))] public async Task Should_query_contents_by_query_for_api_and_transform(StatusForApi request, int includeDraft, Status[] status) { const int count = 5, total = 200; @@ -338,22 +329,8 @@ namespace Squidex.Domain.Apps.Entities.Contents await Assert.ThrowsAsync(() => sut.QueryAsync(context, schemaId.Name, query)); } - public static IEnumerable ManyDataFrontend = new[] - { - new object[] { StatusForFrontend.PublishedOnly, new[] { Status.Published } }, - new object[] { StatusForFrontend.PublishedDraft, new[] { Status.Published, Status.Draft } }, - new object[] { StatusForFrontend.Archived, new[] { Status.Archived } } - }; - - public static IEnumerable ManyDataApi = new[] - { - new object[] { StatusForApi.PublishedOnly, 0, new[] { Status.Published } }, - new object[] { StatusForApi.PublishedDraft, 1, new[] { Status.Published, Status.Draft } } - }; - - [Theory] - [MemberData(nameof(ManyDataFrontend))] - public async Task Should_query_contents_by_id_for_frontend_and_transform(StatusForFrontend request, Status[] status) + [Fact] + public async Task Should_query_contents_by_id_for_frontend_and_transform() { const int count = 5, total = 200; @@ -362,9 +339,9 @@ namespace Squidex.Domain.Apps.Entities.Contents SetupClaims(isFrontend: true); SetupSchemaFound(); SetupScripting(ids.ToArray()); - SetupContents(status, total, ids, includeDraft: true); + SetupContents(null, total, ids, includeDraft: true); - var ctx = context.WithFrontendStatus(request); + var ctx = context; var result = await sut.QueryAsync(ctx, schemaId.Name, Q.Empty.WithIds(ids)); @@ -376,7 +353,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } [Theory] - [MemberData(nameof(ManyDataApi))] + [MemberData(nameof(ApiStatusTests))] public async Task Should_query_contents_by_id_for_api_and_transform(StatusForApi request, int includeDraft, Status[] status) { const int count = 5, total = 200; @@ -399,9 +376,8 @@ namespace Squidex.Domain.Apps.Entities.Contents .MustHaveHappened(count, Times.Exactly); } - [Theory] - [MemberData(nameof(ManyDataFrontend))] - public async Task Should_query_all_contents_by_id_for_frontend_and_transform(StatusForFrontend request, Status[] status) + [Fact] + public async Task Should_query_all_contents_by_id_for_frontend_and_transform() { const int count = 5; @@ -410,9 +386,9 @@ namespace Squidex.Domain.Apps.Entities.Contents SetupClaims(isFrontend: true); SetupSchemaFound(); SetupScripting(ids.ToArray()); - SetupContents(status, ids, includeDraft: true); + SetupContents(null, ids, includeDraft: true); - var ctx = context.WithFrontendStatus(request); + var ctx = context; var result = await sut.QueryAsync(ctx, ids); @@ -423,7 +399,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } [Theory] - [MemberData(nameof(ManyDataApi))] + [MemberData(nameof(ApiStatusTests))] public async Task Should_query_all_contents_by_id_for_api_and_transform(StatusForApi request, int includeDraft, Status[] status) { const int count = 5; diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AExtensions.cs b/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AExtensions.cs index ba4628463..e038caead 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AExtensions.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AExtensions.cs @@ -19,6 +19,11 @@ namespace Squidex.Domain.Apps.Entities.TestHelpers public static T[] Is(this INegatableArgumentConstraintManager that, params T[] values) { + if (values == null) + { + return that.IsNull(); + } + return that.IsSameSequenceAs(values); } }