From a254639a5bfe1e53bc520e08093be4444b019820 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 19 Jun 2020 10:47:35 +0200 Subject: [PATCH] Minor fix for flat content. --- .../ConvertContent/ContentConverterFlat.cs | 16 ++++++++++++--- .../Contents/Operations/QueryIdsAsync.cs | 2 +- .../History/NotifoService.cs | 19 ++++++++++++++++-- .../EventSourcing/MongoEventStore.cs | 3 +++ .../ContentConversionFlatTests.cs | 4 +++- frontend/app/shared/state/contents.state.ts | 20 ++++++++++++++----- 6 files changed, 52 insertions(+), 12 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs index aa21f77d2..3d10a06a3 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs @@ -20,7 +20,12 @@ namespace Squidex.Domain.Apps.Core.ConvertContent foreach (var (key, value) in content) { - result[key] = GetFirst(value); + var first = GetFirst(value); + + if (first != null) + { + result[key] = first; + } } return result; @@ -32,7 +37,12 @@ namespace Squidex.Domain.Apps.Core.ConvertContent foreach (var (key, value) in content) { - result[key] = GetFirst(value, fallback); + var first = GetFirst(value, fallback); + + if (first != null) + { + result[key] = first; + } } return result; @@ -40,7 +50,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent private static object? GetFirst(ContentFieldData? fieldData) { - if (fieldData == null) + if (fieldData == null || fieldData.Count == 0) { return null; } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryIdsAsync.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryIdsAsync.cs index dd0c32eae..6a9f1d467 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryIdsAsync.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryIdsAsync.cs @@ -96,7 +96,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations private static string GetSchemaIdField() { - return BsonClassMap.LookupClassMap(typeof(MongoContentEntity)).GetMemberMap(nameof(MongoContentEntity.Id)).ElementName; + return BsonClassMap.LookupClassMap(typeof(MongoContentEntity)).GetMemberMap(nameof(MongoContentEntity.IndexedSchemaId)).ElementName; } } } \ No newline at end of file diff --git a/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs b/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs index d6e052455..7a6e7e248 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Threading.Tasks; +using Grpc.Core; using Microsoft.Extensions.Options; using NodaTime; using Notifo.SDK; @@ -178,7 +179,14 @@ namespace Squidex.Domain.Apps.Entities.History var request = BuildAllowedTopicRequest(contributorAssigned, contributorAssigned.ContributorId); - await client.AddAllowedTopicAsync(request); + try + { + await client.AddAllowedTopicAsync(request); + } + catch (RpcException ex) when (ex.StatusCode == StatusCode.NotFound) + { + break; + } break; } @@ -187,7 +195,14 @@ namespace Squidex.Domain.Apps.Entities.History { var request = BuildAllowedTopicRequest(contributorRemoved, contributorRemoved.ContributorId); - await client.RemoveAllowedTopicAsync(request); + try + { + await client.RemoveAllowedTopicAsync(request); + } + catch (RpcException ex) when (ex.StatusCode == StatusCode.NotFound) + { + break; + } break; } diff --git a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs index 37a512134..92581e357 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs @@ -48,6 +48,9 @@ namespace Squidex.Infrastructure.EventSourcing { return collection.Indexes.CreateManyAsync(new[] { + new CreateIndexModel( + Index + .Ascending(x => x.Timestamp)), new CreateIndexModel( Index .Ascending(x => x.EventStream) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs index 51541e835..f0b061c45 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs @@ -31,7 +31,9 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .AddValue("en", 6)) .AddField("field4", new ContentFieldData() - .AddValue("it", 7)); + .AddValue("it", 7)) + .AddField("field5", + new ContentFieldData()); [Fact] public void Should_return_flatten_value() diff --git a/frontend/app/shared/state/contents.state.ts b/frontend/app/shared/state/contents.state.ts index a4ac300a4..8bb9ae6ee 100644 --- a/frontend/app/shared/state/contents.state.ts +++ b/frontend/app/shared/state/contents.state.ts @@ -115,7 +115,7 @@ export abstract class ContentsStateBase extends State { of(this.snapshot.contents.find(x => x.id === id)).pipe( switchMap(content => { if (!content) { - return this.contentsService.getContent(this.appName, this.schemaId, id).pipe(catchError(() => of(null))); + return this.contentsService.getContent(this.appName, this.schemaName, id).pipe(catchError(() => of(null))); } else { return of(content); } @@ -152,7 +152,7 @@ export abstract class ContentsStateBase extends State { } private loadInternalCore(isReload: boolean) { - if (!this.appName || !this.schemaId) { + if (!this.appName || !this.schemaName) { return empty(); } @@ -167,7 +167,7 @@ export abstract class ContentsStateBase extends State { query.query = this.snapshot.contentsQuery; } - return this.contentsService.getContents(this.appName, this.schemaId, query).pipe( + return this.contentsService.getContents(this.appName, this.schemaName, query).pipe( tap(({ total, items: contents, canCreate, canCreateAndPublish, statuses }) => { if (isReload) { this.dialogs.notifyInfo('Contents reloaded.'); @@ -202,12 +202,12 @@ export abstract class ContentsStateBase extends State { } public loadVersion(content: ContentDto, version: Version): Observable> { - return this.contentsService.getVersionData(this.appName, this.schemaId, content.id, version).pipe( + return this.contentsService.getVersionData(this.appName, this.schemaName, content.id, version).pipe( shareSubscribed(this.dialogs)); } public create(request: any, publish: boolean): Observable { - return this.contentsService.postContent(this.appName, this.schemaId, request, publish).pipe( + return this.contentsService.postContent(this.appName, this.schemaName, request, publish).pipe( tap(payload => { this.dialogs.notifyInfo('Content created successfully.'); @@ -330,6 +330,8 @@ export abstract class ContentsStateBase extends State { } public abstract get schemaId(): string; + + public abstract get schemaName(): string; } @Injectable() @@ -343,6 +345,10 @@ export class ContentsState extends ContentsStateBase { public get schemaId() { return this.schemasState.schemaId; } + + public get schemaName() { + return this.schemasState.schemaName; + } } @Injectable() @@ -358,6 +364,10 @@ export class ManualContentsState extends ContentsStateBase { public get schemaId() { return this.schema.id; } + + public get schemaName() { + return this.schema.name; + } } function buildStatusQueries(statuses: ReadonlyArray | undefined): ReadonlyArray {