diff --git a/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs b/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs index d1096738b..9529c2df1 100644 --- a/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs +++ b/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs @@ -196,15 +196,25 @@ namespace Squidex.Extensions.Actions.Kafka return n.Value; case JsonBoolean b: return b.Value; - case JsonObject o: + case JsonObject o when (schema is MapSchema map): { - var recordSchema = (RecordSchema)schema; + var mapResult = new Dictionary(); - var result = new GenericRecord(recordSchema); + foreach (var (key, childValue) in o) + { + mapResult.Add(key, GetValue(childValue, map.ValueSchema)); + } + + return mapResult; + } + + case JsonObject o when (schema is RecordSchema record): + { + var result = new GenericRecord(record); foreach (var (key, childValue) in o) { - if (recordSchema.TryGetField(key, out var field)) + if (record.TryGetField(key, out var field)) { result.Add(key, GetValue(childValue, field.Schema)); } @@ -213,15 +223,13 @@ namespace Squidex.Extensions.Actions.Kafka return result; } - case JsonArray a: + case JsonArray a when (schema is ArraySchema array): { - var arraySchema = (ArraySchema)schema; - var result = new List(); foreach (var item in a) { - result.Add(GetValue(item, arraySchema.ItemSchema)); + result.Add(GetValue(item, array.ItemSchema)); } return result.ToArray(); diff --git a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj index 8a7cab421..168775f39 100644 --- a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj +++ b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj @@ -14,12 +14,12 @@ - + - + - + diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj index 37d35dfa1..0ce84d00e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj @@ -17,12 +17,12 @@ - + - - + + diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj index 95e6b96c6..7bdbc822f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj @@ -17,7 +17,7 @@ - + diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppLogStore.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppLogStore.cs index 159a5511e..934a46765 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppLogStore.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/DefaultAppLogStore.cs @@ -29,7 +29,12 @@ namespace Squidex.Domain.Apps.Entities.Apps private const string FieldRequestMethod = "RequestMethod"; private const string FieldRequestPath = "RequestPath"; private const string FieldTimestamp = "Timestamp"; - private readonly CsvConfiguration csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "|" }; + private static readonly CsvConfiguration CsvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture) + { + Delimiter = "|", + LeaveOpen = true, + LineBreakInQuotedFieldIsBadData = false + }; private readonly IRequestLogStore requestLogStore; public DefaultAppLogStore(IRequestLogStore requestLogStore) @@ -69,7 +74,7 @@ namespace Squidex.Domain.Apps.Entities.Apps var writer = new StreamWriter(stream, Encoding.UTF8, 4096, true); try { - using (var csv = new CsvWriter(writer, csvConfiguration, true)) + using (var csv = new CsvWriter(writer, CsvConfiguration)) { csv.WriteField(FieldTimestamp); csv.WriteField(FieldRequestPath); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index 5e4abf4d4..5aac0d60c 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -17,8 +17,8 @@ - - + + all @@ -26,11 +26,11 @@ - + all runtime; build; native; contentfiles; analyzers - + diff --git a/backend/src/Squidex.Domain.Apps.Events/Squidex.Domain.Apps.Events.csproj b/backend/src/Squidex.Domain.Apps.Events/Squidex.Domain.Apps.Events.csproj index a2f7361b0..c9880f683 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Squidex.Domain.Apps.Events.csproj +++ b/backend/src/Squidex.Domain.Apps.Events/Squidex.Domain.Apps.Events.csproj @@ -13,7 +13,7 @@ - + diff --git a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj index a2ed44f76..a9b678ec4 100644 --- a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj @@ -20,7 +20,7 @@ - + diff --git a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj index 12b3bfcae..d43df3f3e 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj +++ b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 4daf26622..e13f1573a 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -13,20 +13,20 @@ - - - + + + all runtime; build; native; contentfiles; analyzers - - + + - + - + diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index f7174d370..275b2c97f 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -43,32 +43,32 @@ - + - - - - - - + + + + + + - + - + - + - - + + diff --git a/backend/src/Squidex/Startup.cs b/backend/src/Squidex/Startup.cs index d62952a10..6da3b530a 100644 --- a/backend/src/Squidex/Startup.cs +++ b/backend/src/Squidex/Startup.cs @@ -76,6 +76,7 @@ namespace Squidex { app.UseCookiePolicy(); + app.UseDefaultPathBase(); app.UseDefaultForwardRules(); app.UseSquidexCacheKeys(); diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json index 178d7beb0..219c9920f 100644 --- a/backend/src/Squidex/appsettings.json +++ b/backend/src/Squidex/appsettings.json @@ -12,6 +12,11 @@ */ "baseUrl": "https://localhost:5001", + /* + * The base path when running Squidex behind a reverse proxy like nginx under a subfolder / subpath. + */ + "basePath": "", + /* * Set it to true to redirect the user from http to https permanently. */ diff --git a/backend/tests/RunCoverage.ps1 b/backend/tests/RunCoverage.ps1 index e9e54ad44..861883700 100644 --- a/backend/tests/RunCoverage.ps1 +++ b/backend/tests/RunCoverage.ps1 @@ -81,6 +81,6 @@ if ($all -Or $web) { -oldStyle } -&"$folderHome\.nuget\packages\ReportGenerator\4.8.4\tools\net47\ReportGenerator.exe" ` +&"$folderHome\.nuget\packages\ReportGenerator\4.8.7\tools\net47\ReportGenerator.exe" ` -reports:"$folderWorking\$folderReports\*.xml" ` -targetdir:"$folderWorking\$folderReports\Output" \ No newline at end of file diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj index 7ce024f2a..6c22a221d 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj index e5ca11680..035bb8b61 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj @@ -24,7 +24,7 @@ - + diff --git a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj index 6beb01afd..eefb68e22 100644 --- a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj +++ b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonJsonSerializerTests.cs similarity index 99% rename from backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs rename to backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonJsonSerializerTests.cs index fde89af15..7d5db9b44 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonConverterTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/BsonJsonSerializerTests.cs @@ -17,7 +17,7 @@ using Xunit; namespace Squidex.Infrastructure.MongoDb { - public class BsonConverterTests + public class BsonJsonSerializerTests { public class TestObject { diff --git a/backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs index 5d30a259b..48eaf969a 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; using System.IO; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; @@ -21,16 +22,16 @@ namespace Squidex.Infrastructure.MongoDb public TypeConverterStringSerializerTests() { - TypeConverterStringSerializer.Register(); + TypeConverterStringSerializer.Register(); TypeConverterStringSerializer.Register(); } [Fact] public void Should_serialize_struct() { - var source = new ValueHolder + var source = new ValueHolder { - Value = DomainId.NewGuid() + Value = TimeSpan.Zero }; var deserialized = SerializeAndDeserializeBson(source); @@ -41,9 +42,9 @@ namespace Squidex.Infrastructure.MongoDb [Fact] public void Should_serialize_nullable_struct() { - var source = new ValueHolder + var source = new ValueHolder { - Value = DomainId.NewGuid() + Value = TimeSpan.Zero }; var deserialized = SerializeAndDeserializeBson(source); @@ -54,7 +55,7 @@ namespace Squidex.Infrastructure.MongoDb [Fact] public void Should_serialize_nullable_null_struct() { - var source = new ValueHolder + var source = new ValueHolder { Value = null }; diff --git a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj index ade794941..82d23094c 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj +++ b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj @@ -17,9 +17,9 @@ - + - + all runtime; build; native; contentfiles; analyzers diff --git a/backend/tests/Squidex.Web.Tests/Services/StringLocalizerTests.cs b/backend/tests/Squidex.Web.Tests/Services/StringLocalizerTests.cs index 5e049c2fc..36191151f 100644 --- a/backend/tests/Squidex.Web.Tests/Services/StringLocalizerTests.cs +++ b/backend/tests/Squidex.Web.Tests/Services/StringLocalizerTests.cs @@ -29,7 +29,7 @@ namespace Squidex.Web.Services var name = sut[key]; - Assert.Equal("The field {0} is required.", name); + Assert.Equal("The field '{0}' is required.", name); } [Fact] @@ -39,7 +39,7 @@ namespace Squidex.Web.Services var name = sut[key, "MyField"]; - Assert.Equal("The field MyField is required.", name); + Assert.Equal("The field 'MyField' is required.", name); } [Fact] @@ -49,7 +49,7 @@ namespace Squidex.Web.Services var name = sut[key, "ClientId"]; - Assert.Equal("The field Client ID is required.", name); + Assert.Equal("The field 'Client ID' is required.", name); } } } diff --git a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj index a894345a7..24a37ab66 100644 --- a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj +++ b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj @@ -14,7 +14,7 @@ - +