From 967e4ad130cefaddd7f157e64cd1b26bc280a4c2 Mon Sep 17 00:00:00 2001 From: David Rouyer Date: Wed, 19 Jul 2017 22:09:21 +0200 Subject: [PATCH 1/6] (fix): wrong return type in interceptor makeRequest expects a return type of Observable> --- src/Squidex/app/shared/interceptors/auth.interceptor.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Squidex/app/shared/interceptors/auth.interceptor.ts b/src/Squidex/app/shared/interceptors/auth.interceptor.ts index 0cdd8f79a..6184d3081 100644 --- a/src/Squidex/app/shared/interceptors/auth.interceptor.ts +++ b/src/Squidex/app/shared/interceptors/auth.interceptor.ts @@ -49,13 +49,13 @@ export class AuthInterceptor implements HttpInterceptor { } else if (error.status === 404 && (!user || user.isExpired)) { this.authService.logoutRedirect(); - return Observable.empty(); + return Observable.empty>(); }else if (error.status === 401 || error.status === 403) { this.authService.logoutRedirect(); - return Observable.empty(); + return Observable.empty>(); } return Observable.throw(error); }); } -} \ No newline at end of file +} From 2dbfde8009f9ef74a5b43cb3fc4c9e3443d3eddf Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jul 2017 17:24:42 +0200 Subject: [PATCH 2/6] Formatting fixed --- src/Squidex/app/shared/interceptors/auth.interceptor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Squidex/app/shared/interceptors/auth.interceptor.ts b/src/Squidex/app/shared/interceptors/auth.interceptor.ts index 6184d3081..5c74cd3b8 100644 --- a/src/Squidex/app/shared/interceptors/auth.interceptor.ts +++ b/src/Squidex/app/shared/interceptors/auth.interceptor.ts @@ -50,7 +50,7 @@ export class AuthInterceptor implements HttpInterceptor { this.authService.logoutRedirect(); return Observable.empty>(); - }else if (error.status === 401 || error.status === 403) { + } else if (error.status === 401 || error.status === 403) { this.authService.logoutRedirect(); return Observable.empty>(); From 2363848f4ef03554b0a73ee6e73eb7a8ca0c2ed2 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jul 2017 17:28:07 +0200 Subject: [PATCH 3/6] Folders removed to correct namespaces. --- .../{ => CQRS/Events}/Formatter.cs | 0 .../{ => CQRS/Events}/GetEventStore.cs | 0 .../{ => CQRS/Events}/GetEventStoreSubscription.cs | 0 .../{ => Assets}/GoogleCloudAssetStore.cs | 0 .../{EventStore => CQRS/Events}/MongoEvent.cs | 0 .../{EventStore => CQRS/Events}/MongoEventCommit.cs | 0 .../{EventStore => CQRS/Events}/MongoEventConsumerInfo.cs | 0 .../Events}/MongoEventConsumerInfoRepository.cs | 0 .../{EventStore => CQRS/Events}/MongoEventStore.cs | 0 .../{EventStore => CQRS/Events}/PollingSubscription.cs | 0 .../{EventStore => CQRS/Events}/StreamPosition.cs | 0 .../{ => MongoDb}/FieldDefinitionBuilder.cs | 0 src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/IMongoEntity.cs | 0 .../{ => MongoDb}/InstantSerializer.cs | 0 src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/MongoEntity.cs | 0 .../{ => MongoDb}/MongoExtensions.cs | 0 .../{ => MongoDb}/MongoRepositoryBase.cs | 0 .../{ => MongoDb}/RefTokenSerializer.cs | 0 .../{UsageTracker => UsageTracking}/MongoUsage.cs | 0 .../{UsageTracker => UsageTracking}/MongoUsageStore.cs | 0 .../{ => CQRS/Events}/RabbitMqEventConsumer.cs | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename src/Squidex.Infrastructure.GetEventStore/{ => CQRS/Events}/Formatter.cs (100%) rename src/Squidex.Infrastructure.GetEventStore/{ => CQRS/Events}/GetEventStore.cs (100%) rename src/Squidex.Infrastructure.GetEventStore/{ => CQRS/Events}/GetEventStoreSubscription.cs (100%) rename src/Squidex.Infrastructure.GoogleCloud/{ => Assets}/GoogleCloudAssetStore.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/MongoEvent.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/MongoEventCommit.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/MongoEventConsumerInfo.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/MongoEventConsumerInfoRepository.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/MongoEventStore.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/PollingSubscription.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{EventStore => CQRS/Events}/StreamPosition.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/FieldDefinitionBuilder.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/IMongoEntity.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/InstantSerializer.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/MongoEntity.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/MongoExtensions.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/MongoRepositoryBase.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{ => MongoDb}/RefTokenSerializer.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{UsageTracker => UsageTracking}/MongoUsage.cs (100%) rename src/Squidex.Infrastructure.MongoDb/{UsageTracker => UsageTracking}/MongoUsageStore.cs (100%) rename src/Squidex.Infrastructure.RabbitMq/{ => CQRS/Events}/RabbitMqEventConsumer.cs (100%) diff --git a/src/Squidex.Infrastructure.GetEventStore/Formatter.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs similarity index 100% rename from src/Squidex.Infrastructure.GetEventStore/Formatter.cs rename to src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs diff --git a/src/Squidex.Infrastructure.GetEventStore/GetEventStore.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs similarity index 100% rename from src/Squidex.Infrastructure.GetEventStore/GetEventStore.cs rename to src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs diff --git a/src/Squidex.Infrastructure.GetEventStore/GetEventStoreSubscription.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs similarity index 100% rename from src/Squidex.Infrastructure.GetEventStore/GetEventStoreSubscription.cs rename to src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs diff --git a/src/Squidex.Infrastructure.GoogleCloud/GoogleCloudAssetStore.cs b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs similarity index 100% rename from src/Squidex.Infrastructure.GoogleCloud/GoogleCloudAssetStore.cs rename to src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/MongoEvent.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/MongoEvent.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventCommit.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventCommit.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventConsumerInfo.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventConsumerInfo.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventConsumerInfoRepository.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventConsumerInfoRepository.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/PollingSubscription.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/PollingSubscription.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs diff --git a/src/Squidex.Infrastructure.MongoDb/EventStore/StreamPosition.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/EventStore/StreamPosition.cs rename to src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs diff --git a/src/Squidex.Infrastructure.MongoDb/FieldDefinitionBuilder.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/FieldDefinitionBuilder.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/FieldDefinitionBuilder.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/FieldDefinitionBuilder.cs diff --git a/src/Squidex.Infrastructure.MongoDb/IMongoEntity.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/IMongoEntity.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/IMongoEntity.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/IMongoEntity.cs diff --git a/src/Squidex.Infrastructure.MongoDb/InstantSerializer.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/InstantSerializer.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/InstantSerializer.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/InstantSerializer.cs diff --git a/src/Squidex.Infrastructure.MongoDb/MongoEntity.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoEntity.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/MongoEntity.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/MongoEntity.cs diff --git a/src/Squidex.Infrastructure.MongoDb/MongoExtensions.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/MongoExtensions.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs diff --git a/src/Squidex.Infrastructure.MongoDb/MongoRepositoryBase.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoRepositoryBase.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/MongoRepositoryBase.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/MongoRepositoryBase.cs diff --git a/src/Squidex.Infrastructure.MongoDb/RefTokenSerializer.cs b/src/Squidex.Infrastructure.MongoDb/MongoDb/RefTokenSerializer.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/RefTokenSerializer.cs rename to src/Squidex.Infrastructure.MongoDb/MongoDb/RefTokenSerializer.cs diff --git a/src/Squidex.Infrastructure.MongoDb/UsageTracker/MongoUsage.cs b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/UsageTracker/MongoUsage.cs rename to src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs diff --git a/src/Squidex.Infrastructure.MongoDb/UsageTracker/MongoUsageStore.cs b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs similarity index 100% rename from src/Squidex.Infrastructure.MongoDb/UsageTracker/MongoUsageStore.cs rename to src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs diff --git a/src/Squidex.Infrastructure.RabbitMq/RabbitMqEventConsumer.cs b/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs similarity index 100% rename from src/Squidex.Infrastructure.RabbitMq/RabbitMqEventConsumer.cs rename to src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs From 6165edf9fed173f79d41d9ff805f3f835a90685f Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jul 2017 17:35:15 +0200 Subject: [PATCH 4/6] Namespaces adjusted. --- .../CQRS/Events/Formatter.cs | 4 +--- .../CQRS/Events/GetEventStore.cs | 4 +--- .../CQRS/Events/GetEventStoreSubscription.cs | 3 +-- .../Squidex.Infrastructure.GetEventStore.csproj | 1 + .../Assets/GoogleCloudAssetStore.cs | 3 +-- .../Squidex.Infrastructure.GoogleCloud.csproj | 1 + .../CQRS/Events/MongoEvent.cs | 2 +- .../CQRS/Events/MongoEventCommit.cs | 2 +- .../CQRS/Events/MongoEventConsumerInfo.cs | 3 +-- .../CQRS/Events/MongoEventConsumerInfoRepository.cs | 4 ++-- .../CQRS/Events/MongoEventStore.cs | 8 ++++---- .../CQRS/Events/PollingSubscription.cs | 3 +-- .../CQRS/Events/StreamPosition.cs | 2 +- .../Squidex.Infrastructure.MongoDb.csproj | 1 + .../UsageTracking/MongoUsage.cs | 2 +- .../UsageTracking/MongoUsageStore.cs | 4 ++-- .../CQRS/Events/RabbitMqEventConsumer.cs | 3 +-- .../Squidex.Infrastructure.RabbitMq.csproj | 1 + src/Squidex.Infrastructure.Redis/RedisPubSub.cs | 2 +- src/Squidex.Infrastructure.Redis/RedisSubscription.cs | 2 +- .../Squidex.Infrastructure.Redis.csproj | 1 + src/Squidex/Config/Domain/AssetStoreModule.cs | 1 - src/Squidex/Config/Domain/EventPublishersModule.cs | 1 - src/Squidex/Config/Domain/EventStoreModule.cs | 2 -- src/Squidex/Config/Domain/PubSubModule.cs | 1 - src/Squidex/Config/Domain/StoreMongoDbModule.cs | 2 -- tests/Benchmarks/Tests/AppendToEventStore.cs | 1 - .../Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs | 1 - tests/Benchmarks/Tests/HandleEvents.cs | 1 - tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs | 1 - .../Schemas/ODataQueryTests.cs | 4 ++-- 31 files changed, 28 insertions(+), 43 deletions(-) diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs index 33dc8cde4..420526114 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs +++ b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs @@ -8,11 +8,9 @@ using System.Text; using EventStore.ClientAPI; -using Squidex.Infrastructure.CQRS.Events; -using EventData = Squidex.Infrastructure.CQRS.Events.EventData; using EventStoreData = EventStore.ClientAPI.EventData; -namespace Squidex.Infrastructure.GetEventStore +namespace Squidex.Infrastructure.CQRS.Events { public static class Formatter { diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs index d04405d56..7bce0375b 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs +++ b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs @@ -11,13 +11,11 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using EventStore.ClientAPI; -using Squidex.Infrastructure.CQRS.Events; -using EventData = Squidex.Infrastructure.CQRS.Events.EventData; // ReSharper disable ConvertIfStatementToSwitchStatement // ReSharper disable InvertIf -namespace Squidex.Infrastructure.GetEventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class GetEventStore : IEventStore, IExternalSystem { diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs index 496acceee..374bec613 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs +++ b/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs @@ -15,9 +15,8 @@ using System.Threading.Tasks; using EventStore.ClientAPI; using EventStore.ClientAPI.Exceptions; using EventStore.ClientAPI.Projections; -using Squidex.Infrastructure.CQRS.Events; -namespace Squidex.Infrastructure.GetEventStore +namespace Squidex.Infrastructure.CQRS.Events { internal sealed class EventStoreSubscription : DisposableObjectBase, IEventSubscription { diff --git a/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj b/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj index 30635bd77..6a896686f 100644 --- a/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj +++ b/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj @@ -1,6 +1,7 @@  netstandard1.6 + Squidex.Infrastructure full diff --git a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs index 6304e53fb..a4cb5ad75 100644 --- a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs +++ b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs @@ -12,9 +12,8 @@ using System.Net; using System.Threading.Tasks; using Google; using Google.Cloud.Storage.V1; -using Squidex.Infrastructure.Assets; -namespace Squidex.Infrastructure.GoogleCloud +namespace Squidex.Infrastructure.Assets { public sealed class GoogleCloudAssetStore : IAssetStore, IExternalSystem { diff --git a/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj b/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj index 8fd29a45b..a39c0faf1 100644 --- a/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj +++ b/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj @@ -1,6 +1,7 @@  netstandard1.6 + Squidex.Infrastructure full diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs index 8d5425b5c..b7fd565eb 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs @@ -9,7 +9,7 @@ using System; using MongoDB.Bson.Serialization.Attributes; -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public class MongoEvent { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs index 876b2075e..731d7a829 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs @@ -10,7 +10,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class MongoEventCommit { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs index be37e18a7..9839076c8 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfo.cs @@ -8,9 +8,8 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -using Squidex.Infrastructure.CQRS.Events; -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class MongoEventConsumerInfo : IEventConsumerInfo { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs index 666e09346..e18ac09ad 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventConsumerInfoRepository.cs @@ -11,12 +11,12 @@ using System.Linq; using System.Threading.Tasks; using MongoDB.Bson; using MongoDB.Driver; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.MongoDb; // ReSharper disable ConvertIfStatementToReturnStatement // ReSharper disable RedundantIfElseBlock -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class MongoEventConsumerInfoRepository : MongoRepositoryBase, IEventConsumerInfoRepository { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs index 237b4ee6e..56f09bc01 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs @@ -6,22 +6,22 @@ // All rights reserved. // ========================================================================== -using MongoDB.Bson; -using MongoDB.Driver; -using Squidex.Infrastructure.CQRS.Events; using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; +using MongoDB.Bson; +using MongoDB.Driver; +using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.Tasks; // ReSharper disable RedundantIfElseBlock // ReSharper disable InvertIf // ReSharper disable ConvertIfStatementToConditionalTernaryExpression -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public class MongoEventStore : MongoRepositoryBase, IEventStore { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs index 921cd6187..dbb2af459 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/PollingSubscription.cs @@ -8,13 +8,12 @@ using System; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Tasks; using Squidex.Infrastructure.Timers; // ReSharper disable InvertIf -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class PollingSubscription : DisposableObjectBase, IEventSubscription { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs index affaf81f6..33177854f 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs +++ b/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs @@ -10,7 +10,7 @@ using MongoDB.Bson; -namespace Squidex.Infrastructure.MongoDb.EventStore +namespace Squidex.Infrastructure.CQRS.Events { public sealed class StreamPosition { diff --git a/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj b/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj index df9225f17..2995b1a9f 100644 --- a/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj +++ b/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj @@ -1,6 +1,7 @@  netstandard1.6 + Squidex.Infrastructure full diff --git a/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs index 070e7556c..23e0753c3 100644 --- a/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs +++ b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsage.cs @@ -10,7 +10,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Squidex.Infrastructure.MongoDb.UsageTracker +namespace Squidex.Infrastructure.UsageTracking { public sealed class MongoUsage { diff --git a/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs index 7a1ae12e9..20fc4fb7f 100644 --- a/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs +++ b/src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageStore.cs @@ -11,9 +11,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MongoDB.Driver; -using Squidex.Infrastructure.UsageTracking; +using Squidex.Infrastructure.MongoDb; -namespace Squidex.Infrastructure.MongoDb.UsageTracker +namespace Squidex.Infrastructure.UsageTracking { public sealed class MongoUsageStore : MongoRepositoryBase, IUsageStore { diff --git a/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs b/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs index b1b0c047b..419271ff6 100644 --- a/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs +++ b/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs @@ -11,12 +11,11 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using RabbitMQ.Client; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Tasks; // ReSharper disable InvertIf -namespace Squidex.Infrastructure.RabbitMq +namespace Squidex.Infrastructure.CQRS.Events { public sealed class RabbitMqEventConsumer : DisposableObjectBase, IExternalSystem, IEventConsumer { diff --git a/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj b/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj index 4d863d14f..6ff27b73f 100644 --- a/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj +++ b/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj @@ -1,6 +1,7 @@  netstandard1.6 + Squidex.Infrastructure full diff --git a/src/Squidex.Infrastructure.Redis/RedisPubSub.cs b/src/Squidex.Infrastructure.Redis/RedisPubSub.cs index 2488e6eba..83a9929de 100644 --- a/src/Squidex.Infrastructure.Redis/RedisPubSub.cs +++ b/src/Squidex.Infrastructure.Redis/RedisPubSub.cs @@ -11,7 +11,7 @@ using System.Collections.Concurrent; using Squidex.Infrastructure.Log; using StackExchange.Redis; -namespace Squidex.Infrastructure.Redis +namespace Squidex.Infrastructure { public class RedisPubSub : IPubSub, IExternalSystem { diff --git a/src/Squidex.Infrastructure.Redis/RedisSubscription.cs b/src/Squidex.Infrastructure.Redis/RedisSubscription.cs index 55fb408b2..26d18526c 100644 --- a/src/Squidex.Infrastructure.Redis/RedisSubscription.cs +++ b/src/Squidex.Infrastructure.Redis/RedisSubscription.cs @@ -14,7 +14,7 @@ using StackExchange.Redis; // ReSharper disable InvertIf -namespace Squidex.Infrastructure.Redis +namespace Squidex.Infrastructure { internal sealed class RedisSubscription { diff --git a/src/Squidex.Infrastructure.Redis/Squidex.Infrastructure.Redis.csproj b/src/Squidex.Infrastructure.Redis/Squidex.Infrastructure.Redis.csproj index dc7458aa0..f705fa01c 100644 --- a/src/Squidex.Infrastructure.Redis/Squidex.Infrastructure.Redis.csproj +++ b/src/Squidex.Infrastructure.Redis/Squidex.Infrastructure.Redis.csproj @@ -1,6 +1,7 @@  netstandard1.6 + Squidex.Infrastructure full diff --git a/src/Squidex/Config/Domain/AssetStoreModule.cs b/src/Squidex/Config/Domain/AssetStoreModule.cs index 6f6376353..2e8e504a8 100644 --- a/src/Squidex/Config/Domain/AssetStoreModule.cs +++ b/src/Squidex/Config/Domain/AssetStoreModule.cs @@ -11,7 +11,6 @@ using Autofac; using Microsoft.Extensions.Configuration; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.GoogleCloud; using Squidex.Infrastructure.Log; // ReSharper disable InvertIf diff --git a/src/Squidex/Config/Domain/EventPublishersModule.cs b/src/Squidex/Config/Domain/EventPublishersModule.cs index f96ecb6bb..1378c2d19 100644 --- a/src/Squidex/Config/Domain/EventPublishersModule.cs +++ b/src/Squidex/Config/Domain/EventPublishersModule.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.RabbitMq; // ReSharper disable InvertIf diff --git a/src/Squidex/Config/Domain/EventStoreModule.cs b/src/Squidex/Config/Domain/EventStoreModule.cs index 4ca8f8f19..ab54322a7 100644 --- a/src/Squidex/Config/Domain/EventStoreModule.cs +++ b/src/Squidex/Config/Domain/EventStoreModule.cs @@ -14,8 +14,6 @@ using Microsoft.Extensions.Configuration; using MongoDB.Driver; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.GetEventStore; -using Squidex.Infrastructure.MongoDb.EventStore; namespace Squidex.Config.Domain { diff --git a/src/Squidex/Config/Domain/PubSubModule.cs b/src/Squidex/Config/Domain/PubSubModule.cs index 6e3615b09..07b07ea43 100644 --- a/src/Squidex/Config/Domain/PubSubModule.cs +++ b/src/Squidex/Config/Domain/PubSubModule.cs @@ -11,7 +11,6 @@ using Autofac; using Autofac.Core; using Microsoft.Extensions.Configuration; using Squidex.Infrastructure; -using Squidex.Infrastructure.Redis; using StackExchange.Redis; namespace Squidex.Config.Domain diff --git a/src/Squidex/Config/Domain/StoreMongoDbModule.cs b/src/Squidex/Config/Domain/StoreMongoDbModule.cs index bd119b2e6..44d23b9a6 100644 --- a/src/Squidex/Config/Domain/StoreMongoDbModule.cs +++ b/src/Squidex/Config/Domain/StoreMongoDbModule.cs @@ -30,8 +30,6 @@ using Squidex.Domain.Users.MongoDb; using Squidex.Domain.Users.MongoDb.Infrastructure; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.MongoDb.EventStore; -using Squidex.Infrastructure.MongoDb.UsageTracker; using Squidex.Infrastructure.UsageTracking; using Squidex.Shared.Users; diff --git a/tests/Benchmarks/Tests/AppendToEventStore.cs b/tests/Benchmarks/Tests/AppendToEventStore.cs index 5df9175ba..d3382bddc 100644 --- a/tests/Benchmarks/Tests/AppendToEventStore.cs +++ b/tests/Benchmarks/Tests/AppendToEventStore.cs @@ -11,7 +11,6 @@ using Benchmarks.Utils; using MongoDB.Driver; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.MongoDb.EventStore; namespace Benchmarks.Tests { diff --git a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs b/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs index 7ddb6311b..cb0014e8d 100644 --- a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs +++ b/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs @@ -12,7 +12,6 @@ using Benchmarks.Utils; using MongoDB.Driver; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.MongoDb.EventStore; namespace Benchmarks.Tests { diff --git a/tests/Benchmarks/Tests/HandleEvents.cs b/tests/Benchmarks/Tests/HandleEvents.cs index 1cecf4375..163cfd3fd 100644 --- a/tests/Benchmarks/Tests/HandleEvents.cs +++ b/tests/Benchmarks/Tests/HandleEvents.cs @@ -15,7 +15,6 @@ using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Log; -using Squidex.Infrastructure.MongoDb.EventStore; // ReSharper disable InvertIf diff --git a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs b/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs index 2f4a3ccb5..abb39e1d9 100644 --- a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs +++ b/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs @@ -16,7 +16,6 @@ using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Log; -using Squidex.Infrastructure.MongoDb.EventStore; // ReSharper disable InvertIf diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs b/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs index 156d40390..065717ae8 100644 --- a/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs +++ b/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs @@ -18,15 +18,15 @@ using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Contents.Edm; +using Squidex.Domain.Apps.Read.MongoDb.Contents; using Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors; -using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; using Xunit; // ReSharper disable SpecifyACultureInStringConversionExplicitly -namespace Squidex.Domain.Apps.Read.MongoDb.Contents +namespace Squidex.Domain.Apps.Read.Schemas { public class ODataQueryTests { From 2bf10cfcb50704e5d063ff3b93bc48b7406f88e4 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jul 2017 19:08:04 +0200 Subject: [PATCH 5/6] Asset store improved. --- .../Assets/AssetCommandHandler.cs | 43 +++++++---- .../Assets/GoogleCloudAssetStore.cs | 56 +++++++++++--- .../Assets/FolderAssetStore.cs | 74 ++++++++++++++++--- .../Assets/IAssetStore.cs | 6 ++ .../CQRS/Commands/AggregateHandler.cs | 8 +- .../CQRS/Commands/IAggregateHandler.cs | 4 +- .../Assets/AssetCommandHandlerTests.cs | 25 +++++-- .../TestHelpers/HandlerTestBase.cs | 16 +++- .../Assets/FolderAssetStoreTests.cs | 53 ++++++++++++- 9 files changed, 233 insertions(+), 52 deletions(-) diff --git a/src/Squidex.Domain.Apps.Write/Assets/AssetCommandHandler.cs b/src/Squidex.Domain.Apps.Write/Assets/AssetCommandHandler.cs index dd40d57cf..c84e01264 100644 --- a/src/Squidex.Domain.Apps.Write/Assets/AssetCommandHandler.cs +++ b/src/Squidex.Domain.Apps.Write/Assets/AssetCommandHandler.cs @@ -38,38 +38,55 @@ namespace Squidex.Domain.Apps.Write.Assets protected async Task On(CreateAsset command, CommandContext context) { - await handler.CreateAsync(context, async c => + command.ImageInfo = await assetThumbnailGenerator.GetImageInfoAsync(command.File.OpenRead()); + try { - command.ImageInfo = await assetThumbnailGenerator.GetImageInfoAsync(command.File.OpenRead()); + var asset = await handler.CreateAsync(context, async a => + { + a.Create(command); - c.Create(command); + await assetStore.UploadTemporaryAsync(context.ContextId.ToString(), command.File.OpenRead()); - await assetStore.UploadAsync(c.Id.ToString(), c.FileVersion, null, command.File.OpenRead()); + context.Succeed(EntityCreatedResult.Create(a.Id, a.Version)); + }); - context.Succeed(EntityCreatedResult.Create(c.Id, c.Version)); - }); + await assetStore.CopyTemporaryAsync(context.ContextId.ToString(), asset.Id.ToString(), asset.FileVersion, null); + } + finally + { + await assetStore.DeleteTemporaryAsync(context.ContextId.ToString()); + } } protected async Task On(UpdateAsset command, CommandContext context) { - await handler.UpdateAsync(context, async c => + command.ImageInfo = await assetThumbnailGenerator.GetImageInfoAsync(command.File.OpenRead()); + + try { - command.ImageInfo = await assetThumbnailGenerator.GetImageInfoAsync(command.File.OpenRead()); + var asset = await handler.UpdateAsync(context, async a => + { + a.Update(command); - c.Update(command); + await assetStore.UploadTemporaryAsync(context.ContextId.ToString(), command.File.OpenRead()); + }); - await assetStore.UploadAsync(c.Id.ToString(), c.FileVersion, null, command.File.OpenRead()); - }); + await assetStore.CopyTemporaryAsync(context.ContextId.ToString(), asset.Id.ToString(), asset.FileVersion, null); + } + finally + { + await assetStore.DeleteTemporaryAsync(context.ContextId.ToString()); + } } protected Task On(RenameAsset command, CommandContext context) { - return handler.UpdateAsync(context, c => c.Rename(command)); + return handler.UpdateAsync(context, a => a.Rename(command)); } protected Task On(DeleteAsset command, CommandContext context) { - return handler.UpdateAsync(context, c => c.Delete(command)); + return handler.UpdateAsync(context, a => a.Delete(command)); } public Task HandleAsync(CommandContext context) diff --git a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs index a4cb5ad75..6d070e6c2 100644 --- a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs +++ b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs @@ -8,6 +8,7 @@ using System; using System.IO; +using System.Linq; using System.Net; using System.Threading.Tasks; using Google; @@ -41,6 +42,36 @@ namespace Squidex.Infrastructure.Assets } } + public Task UploadTemporaryAsync(string name, Stream stream) + { + return storageClient.UploadObjectAsync(bucketName, name, "application/octet-stream", stream); + } + + public async Task UploadAsync(string id, long version, string suffix, Stream stream) + { + var objectName = GetObjectName(id, version, suffix); + + await storageClient.UploadObjectAsync(bucketName, objectName, "application/octet-stream", stream); + } + + public async Task CopyTemporaryAsync(string name, string id, long version, string suffix) + { + var objectName = GetObjectName(id, version, suffix); + + try + { + await storageClient.CopyObjectAsync(bucketName, name, bucketName, objectName); + } + catch (GoogleApiException ex) + { + if (ex.HttpStatusCode == HttpStatusCode.NotFound) + { + throw new AssetNotFoundException($"Asset {name} not found.", ex); + } + throw; + } + } + public async Task DownloadAsync(string id, long version, string suffix, Stream stream) { var objectName = GetObjectName(id, version, suffix); @@ -59,11 +90,16 @@ namespace Squidex.Infrastructure.Assets } } - public async Task UploadAsync(string id, long version, string suffix, Stream stream) + public async Task DeleteTemporaryAsync(string name) { - var objectName = GetObjectName(id, version, suffix); - - await storageClient.UploadObjectAsync(bucketName, objectName, "application/octet-stream", stream); + try + { + await storageClient.DeleteObjectAsync(bucketName, name); + } + catch + { + // ignored + } } private string GetObjectName(string id, long version, string suffix) @@ -75,14 +111,14 @@ namespace Squidex.Infrastructure.Assets throw new InvalidOperationException("No connection established yet."); } - var name = $"{id}_{version}"; - - if (!string.IsNullOrWhiteSpace(suffix)) - { - name += "_" + suffix; - } + var name = GetFileName(id, version, suffix); return name; } + + private static string GetFileName(string id, long version, string suffix) + { + return string.Join("_", new[] { id, version.ToString(), suffix }.Where(x => !string.IsNullOrWhiteSpace(x))); + } } } diff --git a/src/Squidex.Infrastructure/Assets/FolderAssetStore.cs b/src/Squidex.Infrastructure/Assets/FolderAssetStore.cs index 543195d17..b8ab2b1dc 100644 --- a/src/Squidex.Infrastructure/Assets/FolderAssetStore.cs +++ b/src/Squidex.Infrastructure/Assets/FolderAssetStore.cs @@ -7,8 +7,10 @@ // ========================================================================== using System.IO; +using System.Linq; using System.Threading.Tasks; using Squidex.Infrastructure.Log; +using Squidex.Infrastructure.Tasks; namespace Squidex.Infrastructure.Assets { @@ -49,6 +51,26 @@ namespace Squidex.Infrastructure.Assets } } + public async Task UploadTemporaryAsync(string name, Stream stream) + { + var file = GetFile(name); + + using (var fileStream = file.OpenWrite()) + { + await stream.CopyToAsync(fileStream); + } + } + + public async Task UploadAsync(string id, long version, string suffix, Stream stream) + { + var file = GetFile(id, version, suffix); + + using (var fileStream = file.OpenWrite()) + { + await stream.CopyToAsync(fileStream); + } + } + public async Task DownloadAsync(string id, long version, string suffix, Stream stream) { var file = GetFile(id, version, suffix); @@ -66,28 +88,60 @@ namespace Squidex.Infrastructure.Assets } } - public async Task UploadAsync(string id, long version, string suffix, Stream stream) + public Task CopyTemporaryAsync(string name, string id, long version, string suffix) { - var file = GetFile(id, version, suffix); + try + { + var file = GetFile(name); - using (var fileStream = file.OpenWrite()) + file.CopyTo(GetPath(id, version, suffix)); + + return TaskHelper.Done; + } + catch (FileNotFoundException ex) { - await stream.CopyToAsync(fileStream); + throw new AssetNotFoundException($"Asset {name} not found.", ex); } } - private FileInfo GetFile(string id, long version, string suffix) + public Task DeleteTemporaryAsync(string name) { - Guard.NotNullOrEmpty(id, nameof(id)); + try + { + var file = GetFile(name); - var path = Path.Combine(directory.FullName, $"{id}_{version}"); + file.Delete(); - if (!string.IsNullOrWhiteSpace(suffix)) + return TaskHelper.Done; + } + catch (FileNotFoundException ex) { - path += "_" + suffix; + throw new AssetNotFoundException($"Asset {name} not found.", ex); } + } - return new FileInfo(path); + private FileInfo GetFile(string id, long version, string suffix) + { + Guard.NotNullOrEmpty(id, nameof(id)); + + return GetFile(GetPath(id, version, suffix)); + } + + private FileInfo GetFile(string name) + { + Guard.NotNullOrEmpty(name, nameof(name)); + + return new FileInfo(GetPath(name)); + } + + private string GetPath(string name) + { + return Path.Combine(directory.FullName, name); + } + + private string GetPath(string id, long version, string suffix) + { + return Path.Combine(directory.FullName, string.Join("_", new[] { id, version.ToString(), suffix }.Where(x => !string.IsNullOrWhiteSpace(x)))); } } } diff --git a/src/Squidex.Infrastructure/Assets/IAssetStore.cs b/src/Squidex.Infrastructure/Assets/IAssetStore.cs index 69b8d3e8d..5612d273d 100644 --- a/src/Squidex.Infrastructure/Assets/IAssetStore.cs +++ b/src/Squidex.Infrastructure/Assets/IAssetStore.cs @@ -13,8 +13,14 @@ namespace Squidex.Infrastructure.Assets { public interface IAssetStore { + Task CopyTemporaryAsync(string name, string id, long version, string suffix); + Task DownloadAsync(string id, long version, string suffix, Stream stream); + Task UploadTemporaryAsync(string name, Stream stream); + Task UploadAsync(string id, long version, string suffix, Stream stream); + + Task DeleteTemporaryAsync(string name); } } \ No newline at end of file diff --git a/src/Squidex.Infrastructure/CQRS/Commands/AggregateHandler.cs b/src/Squidex.Infrastructure/CQRS/Commands/AggregateHandler.cs index ecab8169c..c2c5c746c 100644 --- a/src/Squidex.Infrastructure/CQRS/Commands/AggregateHandler.cs +++ b/src/Squidex.Infrastructure/CQRS/Commands/AggregateHandler.cs @@ -38,7 +38,7 @@ namespace Squidex.Infrastructure.CQRS.Commands this.domainObjectRepository = domainObjectRepository; } - public async Task CreateAsync(CommandContext context, Func creator) where T : class, IAggregate + public async Task CreateAsync(CommandContext context, Func creator) where T : class, IAggregate { Guard.NotNull(creator, nameof(creator)); Guard.NotNull(context, nameof(context)); @@ -54,9 +54,11 @@ namespace Squidex.Infrastructure.CQRS.Commands { context.Succeed(new EntityCreatedResult(aggregate.Id, aggregate.Version)); } + + return aggregate; } - public async Task UpdateAsync(CommandContext context, Func updater) where T : class, IAggregate + public async Task UpdateAsync(CommandContext context, Func updater) where T : class, IAggregate { Guard.NotNull(updater, nameof(updater)); Guard.NotNull(context, nameof(context)); @@ -72,6 +74,8 @@ namespace Squidex.Infrastructure.CQRS.Commands { context.Succeed(new EntitySavedResult(aggregate.Version)); } + + return aggregate; } private static IAggregateCommand GetCommand(CommandContext context) diff --git a/src/Squidex.Infrastructure/CQRS/Commands/IAggregateHandler.cs b/src/Squidex.Infrastructure/CQRS/Commands/IAggregateHandler.cs index 5d7ca75bb..27a69d74b 100644 --- a/src/Squidex.Infrastructure/CQRS/Commands/IAggregateHandler.cs +++ b/src/Squidex.Infrastructure/CQRS/Commands/IAggregateHandler.cs @@ -13,8 +13,8 @@ namespace Squidex.Infrastructure.CQRS.Commands { public interface IAggregateHandler { - Task CreateAsync(CommandContext context, Func creator) where T : class, IAggregate; + Task CreateAsync(CommandContext context, Func creator) where T : class, IAggregate; - Task UpdateAsync(CommandContext context, Func updater) where T : class, IAggregate; + Task UpdateAsync(CommandContext context, Func updater) where T : class, IAggregate; } } diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandHandlerTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandHandlerTests.cs index 4b3e25dbb..f3c15f709 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandHandlerTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandHandlerTests.cs @@ -17,6 +17,7 @@ using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.Tasks; using Xunit; +// ReSharper disable ImplicitlyCapturedClosure // ReSharper disable ConvertToConstant.Local namespace Squidex.Domain.Apps.Write.Assets @@ -44,11 +45,11 @@ namespace Squidex.Domain.Apps.Write.Assets [Fact] public async Task Create_should_create_asset() { - SetupStore(0); - SetupImageInfo(); - var context = CreateContextForCommand(new CreateAsset { AssetId = assetId, File = file }); + SetupStore(0, context.ContextId); + SetupImageInfo(); + await TestCreate(asset, async _ => { await sut.HandleAsync(context); @@ -63,13 +64,13 @@ namespace Squidex.Domain.Apps.Write.Assets [Fact] public async Task Update_should_update_domain_object() { - SetupStore(1); + var context = CreateContextForCommand(new UpdateAsset { AssetId = assetId, File = file }); + + SetupStore(1, context.ContextId); SetupImageInfo(); CreateAsset(); - var context = CreateContextForCommand(new UpdateAsset { AssetId = assetId, File = file }); - await TestUpdate(asset, async _ => { await sut.HandleAsync(context); @@ -117,10 +118,18 @@ namespace Squidex.Domain.Apps.Write.Assets .Verifiable(); } - private void SetupStore(long version) + private void SetupStore(long version, Guid commitId) { assetStore - .Setup(x => x.UploadAsync(assetId.ToString(), version, null, stream)).Returns(TaskHelper.Done) + .Setup(x => x.UploadTemporaryAsync(commitId.ToString(), stream)).Returns(TaskHelper.Done) + .Verifiable(); + + assetStore + .Setup(x => x.CopyTemporaryAsync(commitId.ToString(), assetId.ToString(), version, null)).Returns(TaskHelper.Done) + .Verifiable(); + + assetStore + .Setup(x => x.DeleteTemporaryAsync(commitId.ToString())).Returns(TaskHelper.Done) .Verifiable(); } } diff --git a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs index cf70b8191..2387ceb06 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs @@ -34,18 +34,26 @@ namespace Squidex.Domain.Apps.Write.TestHelpers IsUpdated = false; } - public Task CreateAsync(CommandContext context, Func creator) where V : class, IAggregate + public async Task CreateAsync(CommandContext context, Func creator) where V : class, IAggregate { IsCreated = true; - return creator(domainObject as V); + var @do = domainObject as V; + + await creator(domainObject as V); + + return @do; } - public Task UpdateAsync(CommandContext context, Func updater) where V : class, IAggregate + public async Task UpdateAsync(CommandContext context, Func updater) where V : class, IAggregate { IsUpdated = true; - return updater(domainObject as V); + var @do = domainObject as V; + + await updater(domainObject as V); + + return @do; } } diff --git a/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs b/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs index f789dce60..ae67c24d6 100644 --- a/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs @@ -48,11 +48,19 @@ namespace Squidex.Infrastructure.Assets } [Fact] - public Task Should_throw_exception_if_asset_not_found() + public Task Should_throw_exception_if_asset_to_download_is_not_found() { sut.Connect(); - return Assert.ThrowsAsync(() => sut.DownloadAsync(Guid.NewGuid().ToString(), 1, "suffix", new MemoryStream())); + return Assert.ThrowsAsync(() => sut.DownloadAsync(Id(), 1, "suffix", new MemoryStream())); + } + + [Fact] + public Task Should_throw_exception_if_asset_to_copy_is_not_found() + { + sut.Connect(); + + return Assert.ThrowsAsync(() => sut.CopyTemporaryAsync(Id(), Id(), 1, null)); } [Fact] @@ -60,7 +68,7 @@ namespace Squidex.Infrastructure.Assets { sut.Connect(); - var assetId = Guid.NewGuid().ToString(); + var assetId = Id(); var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); await sut.UploadAsync(assetId, 1, "suffix", assetData); @@ -72,6 +80,45 @@ namespace Squidex.Infrastructure.Assets Assert.Equal(assetData.ToArray(), readData.ToArray()); } + [Fact] + public async Task Should_commit_temporary_file() + { + sut.Connect(); + + var tempId = Id(); + + var assetId = Id(); + var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); + + await sut.UploadTemporaryAsync(tempId, assetData); + await sut.CopyTemporaryAsync(tempId, assetId, 1, "suffix"); + + var readData = new MemoryStream(); + + await sut.DownloadAsync(assetId, 1, "suffix", readData); + + Assert.Equal(assetData.ToArray(), readData.ToArray()); + } + + [Fact] + public async Task Should_ignore_when_deleting_twice() + { + sut.Connect(); + + var tempId = Id(); + + var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); + + await sut.UploadTemporaryAsync(tempId, assetData); + await sut.DeleteTemporaryAsync(tempId); + await sut.DeleteTemporaryAsync(tempId); + } + + private static string Id() + { + return Guid.NewGuid().ToString(); + } + private static string CreateInvalidPath() { var windir = Environment.GetEnvironmentVariable("windir"); From 47c7c50cf4dcceb107faf25483e681b99a0e2999 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jul 2017 19:43:34 +0200 Subject: [PATCH 6/6] Tests improved. --- .../Assets/GoogleCloudAssetStore.cs | 7 +- .../Assets/AssetStoreTestsBase.cs | 110 ++++++++++++++++++ .../Assets/FolderAssetStoreTests.cs | 90 ++------------ .../Assets/GoogleCloudAssetStoreTests.cs | 22 ++++ .../Squidex.Infrastructure.Tests.csproj | 2 + 5 files changed, 147 insertions(+), 84 deletions(-) create mode 100644 tests/Squidex.Infrastructure.Tests/Assets/AssetStoreTestsBase.cs create mode 100644 tests/Squidex.Infrastructure.Tests/Assets/GoogleCloudAssetStoreTests.cs diff --git a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs index 6d070e6c2..b6a080044 100644 --- a/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs +++ b/src/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs @@ -96,9 +96,12 @@ namespace Squidex.Infrastructure.Assets { await storageClient.DeleteObjectAsync(bucketName, name); } - catch + catch (GoogleApiException ex) { - // ignored + if (ex.HttpStatusCode != HttpStatusCode.NotFound) + { + throw; + } } } diff --git a/tests/Squidex.Infrastructure.Tests/Assets/AssetStoreTestsBase.cs b/tests/Squidex.Infrastructure.Tests/Assets/AssetStoreTestsBase.cs new file mode 100644 index 000000000..8a19e0013 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/Assets/AssetStoreTestsBase.cs @@ -0,0 +1,110 @@ +// ========================================================================== +// AssetStoreTestsBase.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.IO; +using System.Threading.Tasks; +using Xunit; + +// ReSharper disable VirtualMemberCallInConstructor +// ReSharper disable MemberCanBeProtected.Global + +namespace Squidex.Infrastructure.Assets +{ + public abstract class AssetStoreTests : IDisposable where T : IAssetStore + { + private readonly T sut; + + protected AssetStoreTests() + { + sut = CreateStore(); + } + + protected T Sut + { + get { return sut; } + } + + public abstract T CreateStore(); + + public abstract void Dispose(); + + + [Fact] + public Task Should_throw_exception_if_asset_to_download_is_not_found() + { + ((IExternalSystem)Sut).Connect(); + + return Assert.ThrowsAsync(() => Sut.DownloadAsync(Id(), 1, "suffix", new MemoryStream())); + } + + [Fact] + public Task Should_throw_exception_if_asset_to_copy_is_not_found() + { + ((IExternalSystem)Sut).Connect(); + + return Assert.ThrowsAsync(() => Sut.CopyTemporaryAsync(Id(), Id(), 1, null)); + } + + [Fact] + public async Task Should_read_and_write_file() + { + ((IExternalSystem)Sut).Connect(); + + var assetId = Id(); + var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); + + await Sut.UploadAsync(assetId, 1, "suffix", assetData); + + var readData = new MemoryStream(); + + await Sut.DownloadAsync(assetId, 1, "suffix", readData); + + Assert.Equal(assetData.ToArray(), readData.ToArray()); + } + + [Fact] + public async Task Should_commit_temporary_file() + { + ((IExternalSystem)Sut).Connect(); + + var tempId = Id(); + + var assetId = Id(); + var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); + + await Sut.UploadTemporaryAsync(tempId, assetData); + await Sut.CopyTemporaryAsync(tempId, assetId, 1, "suffix"); + + var readData = new MemoryStream(); + + await Sut.DownloadAsync(assetId, 1, "suffix", readData); + + Assert.Equal(assetData.ToArray(), readData.ToArray()); + } + + [Fact] + public async Task Should_ignore_when_deleting_twice() + { + ((IExternalSystem)Sut).Connect(); + + var tempId = Id(); + + var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); + + await Sut.UploadTemporaryAsync(tempId, assetData); + await Sut.DeleteTemporaryAsync(tempId); + await Sut.DeleteTemporaryAsync(tempId); + } + + private static string Id() + { + return Guid.NewGuid().ToString(); + } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs b/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs index ae67c24d6..5be60d6ab 100644 --- a/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Assets/FolderAssetStoreTests.cs @@ -8,39 +8,29 @@ using System; using System.IO; -using System.Threading.Tasks; using Moq; using Squidex.Infrastructure.Log; using Xunit; namespace Squidex.Infrastructure.Assets { - public class FolderAssetStoreTests : IDisposable + public class FolderAssetStoreTests : AssetStoreTests { - private readonly FolderAssetStore sut; private readonly string testFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - public FolderAssetStoreTests() + public override FolderAssetStore CreateStore() { - sut = new FolderAssetStore(testFolder, new Mock().Object); + return new FolderAssetStore(testFolder, new Mock().Object); } - public void Dispose() + public override void Dispose() { if (Directory.Exists(testFolder)) { Directory.Delete(testFolder, true); } } - - [Fact] - public void Should_create_directory_when_connecting() - { - sut.Connect(); - - Assert.True(Directory.Exists(testFolder)); - } - + [Fact] public void Should_throw_when_creating_directory_failed() { @@ -48,75 +38,11 @@ namespace Squidex.Infrastructure.Assets } [Fact] - public Task Should_throw_exception_if_asset_to_download_is_not_found() - { - sut.Connect(); - - return Assert.ThrowsAsync(() => sut.DownloadAsync(Id(), 1, "suffix", new MemoryStream())); - } - - [Fact] - public Task Should_throw_exception_if_asset_to_copy_is_not_found() - { - sut.Connect(); - - return Assert.ThrowsAsync(() => sut.CopyTemporaryAsync(Id(), Id(), 1, null)); - } - - [Fact] - public async Task Should_read_and_write_file() - { - sut.Connect(); - - var assetId = Id(); - var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); - - await sut.UploadAsync(assetId, 1, "suffix", assetData); - - var readData = new MemoryStream(); - - await sut.DownloadAsync(assetId, 1, "suffix", readData); - - Assert.Equal(assetData.ToArray(), readData.ToArray()); - } - - [Fact] - public async Task Should_commit_temporary_file() - { - sut.Connect(); - - var tempId = Id(); - - var assetId = Id(); - var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); - - await sut.UploadTemporaryAsync(tempId, assetData); - await sut.CopyTemporaryAsync(tempId, assetId, 1, "suffix"); - - var readData = new MemoryStream(); - - await sut.DownloadAsync(assetId, 1, "suffix", readData); - - Assert.Equal(assetData.ToArray(), readData.ToArray()); - } - - [Fact] - public async Task Should_ignore_when_deleting_twice() + public void Should_create_directory_when_connecting() { - sut.Connect(); + Sut.Connect(); - var tempId = Id(); - - var assetData = new MemoryStream(new byte[] { 0x1, 0x2, 0x3, 0x4 }); - - await sut.UploadTemporaryAsync(tempId, assetData); - await sut.DeleteTemporaryAsync(tempId); - await sut.DeleteTemporaryAsync(tempId); - } - - private static string Id() - { - return Guid.NewGuid().ToString(); + Assert.True(Directory.Exists(testFolder)); } private static string CreateInvalidPath() diff --git a/tests/Squidex.Infrastructure.Tests/Assets/GoogleCloudAssetStoreTests.cs b/tests/Squidex.Infrastructure.Tests/Assets/GoogleCloudAssetStoreTests.cs new file mode 100644 index 000000000..085c28a06 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/Assets/GoogleCloudAssetStoreTests.cs @@ -0,0 +1,22 @@ +// ========================================================================== +// GoogleCloudAssetStoreTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +namespace Squidex.Infrastructure.Assets +{ + internal class GoogleCloudAssetStoreTests : AssetStoreTests + { + public override GoogleCloudAssetStore CreateStore() + { + return new GoogleCloudAssetStore("squidex-test"); + } + + public override void Dispose() + { + } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj index d552c8f72..3ce9579ab 100644 --- a/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj +++ b/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj @@ -5,10 +5,12 @@ Squidex.Infrastructure + +