diff --git a/src/Squidex.Domain.Apps.Events/Schemas/Utils/SchemaEventDispatcher.cs b/src/Squidex.Domain.Apps.Events/Schemas/Utils/SchemaEventDispatcher.cs index e6f71cc01..924048c21 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/Utils/SchemaEventDispatcher.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/Utils/SchemaEventDispatcher.cs @@ -62,7 +62,17 @@ namespace Squidex.Domain.Apps.Events.Schemas.Utils Partitioning.Language : Partitioning.Invariant; - return schema.AddField(registry.CreateField(@event.FieldId.Id, @event.Name, partitioning, @event.Properties)); + var fieldId = @event.FieldId.Id; + var field = registry.CreateField(fieldId, @event.Name, partitioning, @event.Properties); + + if (schema.FieldsById.ContainsKey(fieldId)) + { + return schema.UpdateField(fieldId, f => field); + } + else + { + return schema.AddField(field); + } } public static Schema Dispatch(FieldUpdated @event, Schema schema) diff --git a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonConverter.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonConverter.cs index 4dd3edf55..829066da0 100644 --- a/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonConverter.cs +++ b/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonConverter.cs @@ -68,14 +68,34 @@ namespace Squidex.Infrastructure.MongoDb public static BsonValue ToBson(this JToken source) { - switch (source) + switch (source.Type) { - case JObject jObject: - return jObject.ToBson(); - case JArray jArray: - return jArray.ToBson(); - case JValue jValue: - return BsonValue.Create(jValue.Value); + case JTokenType.Object: + return ((JObject)source).ToBson(); + case JTokenType.Array: + return ((JArray)source).ToBson(); + case JTokenType.Integer: + return BsonValue.Create(((JValue)source).Value); + case JTokenType.Float: + return BsonValue.Create(((JValue)source).Value); + case JTokenType.String: + return BsonValue.Create(((JValue)source).Value); + case JTokenType.Boolean: + return BsonValue.Create(((JValue)source).Value); + case JTokenType.Null: + return BsonNull.Value; + case JTokenType.Undefined: + return BsonUndefined.Value; + case JTokenType.Date: + return BsonValue.Create(((JValue)source).Value.ToString()); + case JTokenType.Bytes: + return BsonValue.Create(((JValue)source).Value); + case JTokenType.Guid: + return BsonValue.Create(((JValue)source).Value.ToString()); + case JTokenType.Uri: + return BsonValue.Create(((JValue)source).Value.ToString()); + case JTokenType.TimeSpan: + return BsonValue.Create(((JValue)source).Value.ToString()); } throw new NotSupportedException($"Cannot convert {source.GetType()} to Bson."); @@ -103,8 +123,12 @@ namespace Squidex.Infrastructure.MongoDb return new JValue(source.AsInt64); case BsonType.Decimal128: return new JValue(source.AsDecimal); + case BsonType.Binary: + return new JValue(source.AsBsonBinaryData.Bytes); case BsonType.Null: return JValue.CreateNull(); + case BsonType.Undefined: + return JValue.CreateUndefined(); } throw new NotSupportedException($"Cannot convert {source.GetType()} to Json."); diff --git a/src/Squidex/Controllers/UI/Account/AccountController.cs b/src/Squidex/Controllers/UI/Account/AccountController.cs index a46cc8802..2785404b4 100644 --- a/src/Squidex/Controllers/UI/Account/AccountController.cs +++ b/src/Squidex/Controllers/UI/Account/AccountController.cs @@ -112,7 +112,7 @@ namespace Squidex.Controllers.UI.Account if (string.IsNullOrWhiteSpace(logoutUrl)) { - logoutUrl = urlOptions.Value.BuildUrl("logout."); + logoutUrl = urlOptions.Value.BuildUrl("logout/"); } return Redirect(logoutUrl); diff --git a/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs b/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs new file mode 100644 index 000000000..51bbd15e3 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs @@ -0,0 +1,93 @@ +// ========================================================================== +// BsonConverterTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using FluentAssertions; +using Newtonsoft.Json.Linq; +using Xunit; + +#pragma warning disable SA1121 // Use built-in type alias + +namespace Squidex.Infrastructure.MongoDb +{ + public class BsonConverterTests + { + public class TestObject + { + public TimeSpan TimeSpan { get; set; } + + public Guid Guid { get; set; } + + public DateTimeOffset DateTimeOffset { get; set; } + + public DateTime DateTime { get; set; } + + public Int64 Int64 { get; set; } + + public Int32 Int32 { get; set; } + + public Int16 Int16 { get; set; } + + public UInt64 UInt64 { get; set; } + + public UInt32 UInt32 { get; set; } + + public UInt16 UInt16 { get; set; } + + public double Float64 { get; set; } + + public float Float32 { get; set; } + + public bool Bool { get; set; } + + public byte Byte { get; set; } + + public byte[] Bytes { get; set; } + + public string String { get; set; } + + public string[] Strings { get; set; } + + public Uri Uri { get; set; } + + public static TestObject CreateWithValues() + { + return new TestObject + { + Bool = true, + Byte = 0x2, + Bytes = new byte[] { 0x10, 0x12, 0x13 }, + DateTimeOffset = DateTime.Today, + DateTime = DateTime.Today, + Float32 = 32.5f, + Float64 = 32.5d, + Guid = Guid.NewGuid(), + Int64 = 64, + Int32 = 32, + Int16 = 16, + String = "squidex", + Strings = new[] { "hello", "squidex " }, + TimeSpan = TimeSpan.FromSeconds(123), + UInt64 = 164, + UInt32 = 132, + UInt16 = 116, + Uri = new Uri("http://squidex.io") + }; + } + } + + [Fact] + public void Should_serialize_and_deserialize_to_bson_with_json() + { + var source = TestObject.CreateWithValues(); + var target = JObject.FromObject(source).ToBson().ToJson().ToObject(); + + target.ShouldBeEquivalentTo(source); + } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj index 6a6cd93c5..73b94a3c5 100644 --- a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj +++ b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj @@ -7,6 +7,7 @@ +