From e26a6170db52e9b6985c0e598ae9c91c41e01d21 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 14:03:17 +0200 Subject: [PATCH] Bson serializer. --- .../Contents/Status2.cs | 4 +- .../Contents/MongoContentRepository.cs | 5 ++ .../Contents/StatusSerializer.cs | 39 ++++++++++++++ .../Contents/MongoDb/StatusSerializerTests.cs | 51 +++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Entities.MongoDb/Contents/StatusSerializer.cs create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/StatusSerializerTests.cs diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs index c8cbea8dd..3e684bbe7 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs @@ -25,12 +25,12 @@ namespace Squidex.Domain.Apps.Core.Contents public override bool Equals(object obj) { - return base.Equals(obj); + return obj is Status2 status && Equals(status); } public bool Equals(Status2 other) { - throw new NotImplementedException(); + return Name.Equals(other.Name); } public override int GetHashCode() diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 5c3d3a616..d28d8078d 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -36,6 +36,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents private readonly string typeContentDeleted; private readonly MongoContentCollection contents; + static MongoContentRepository() + { + StatusSerializer.Register(); + } + public MongoContentRepository(IMongoDatabase database, IAppProvider appProvider, IJsonSerializer serializer, ITextIndexer indexer, TypeNameRegistry typeNameRegistry) { Guard.NotNull(appProvider, nameof(appProvider)); diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/StatusSerializer.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/StatusSerializer.cs new file mode 100644 index 000000000..0b9bf91f0 --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/StatusSerializer.cs @@ -0,0 +1,39 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Threading; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; +using Squidex.Domain.Apps.Core.Contents; + +namespace Squidex.Domain.Apps.Entities.MongoDb.Contents +{ + public sealed class StatusSerializer : SerializerBase + { + private static volatile int isRegistered; + + public static void Register() + { + if (Interlocked.Increment(ref isRegistered) == 1) + { + BsonSerializer.RegisterSerializer(new StatusSerializer()); + } + } + + public override Status2 Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var value = context.Reader.ReadString(); + + return new Status2(value); + } + + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Status2 value) + { + context.Writer.WriteString(value.Name); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/StatusSerializerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/StatusSerializerTests.cs new file mode 100644 index 000000000..ce50fc208 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/StatusSerializerTests.cs @@ -0,0 +1,51 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using MongoDB.Bson; +using MongoDB.Bson.IO; +using MongoDB.Bson.Serialization; +using Squidex.Domain.Apps.Core.Contents; +using Squidex.Domain.Apps.Entities.MongoDb.Contents; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Contents.MongoDb +{ + public sealed class StatusSerializerTests + { + private sealed class TestObject + { + public Status2 Status { get; set; } + } + + [Fact] + public void Should_serialize_and_deserialize_status() + { + StatusSerializer.Register(); + + var source = new TestObject + { + Status = new Status2("Published") + }; + + var document = new BsonDocument(); + + using (var writer = new BsonDocumentWriter(document)) + { + BsonSerializer.Serialize(writer, source); + + writer.Flush(); + } + + using (var reader = new BsonDocumentReader(document)) + { + var result = BsonSerializer.Deserialize(reader); + + Assert.Equal(source.Status, result.Status); + } + } + } +}